鱼C论坛

 找回密码
 立即注册
查看: 877|回复: 1

求解汇编的代码问题

[复制链接]
发表于 2023-1-22 17:57:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

int9:        push ax
                push bx
                push es
               
                in al, 60H
               
                pushf
                pushf
                pop bx
                and al, 11111100B
                push bx
                popf
                call dword ptr ds:[0]
               
                cmp al, 1
                jne int9ret
               
                mov ax, 0B800H
                mov es, ax
                inc es:[160*12+40*2+1]
               
int9ret:
                pop es
                pop bx
                pop ax
                iret

code ends
end start

有无大神可以解析一下为什么执行完 call dword ptr ds:[0]之后,cs段寄存器和ip编译地址是怎么找到 下一条指令即(cmp al, 1)的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-20 22:19:11 | 显示全部楼层
当执行call指令时,下一条指令的地址被推入栈中,控制流被转移到call指令操作数指向的地址。在这个例子中,操作数是dword ptr ds:[0],这意味着下一条指令的地址被存储在数据段偏移0处的双字中。

因此,在数据段偏移0处的指令必须包含要执行的下一条指令的地址,这个地址是cmp al, 1指令。当执行call指令时,处理器从操作数所指向的内存位置中检索地址,将当前IP寄存器的值(其中包含call指令本身的地址)压入栈中,并跳转到检索到的地址。

执行call指令后,处理器在栈顶有下一条指令的地址,并将其弹出并从该地址恢复执行。因此,CS和IP寄存器将被更新,以指向下一条指令,即cmp al, 1指令。然后将执行cmp指令,根据结果,代码将跳转到int9ret或执行后续指令。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-26 19:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表