求解汇编的代码问题
int9: push ax
push bx
push es
in al, 60H
pushf
pushf
pop bx
and al, 11111100B
push bx
popf
call dword ptr ds:
cmp al, 1
jne int9ret
mov ax, 0B800H
mov es, ax
inc es:
int9ret:
pop es
pop bx
pop ax
iret
code ends
end start
有无大神可以解析一下为什么执行完 call dword ptr ds:之后,cs段寄存器和ip编译地址是怎么找到 下一条指令即(cmp al, 1)的地址 当执行call指令时,下一条指令的地址被推入栈中,控制流被转移到call指令操作数指向的地址。在这个例子中,操作数是dword ptr ds:,这意味着下一条指令的地址被存储在数据段偏移0处的双字中。
因此,在数据段偏移0处的指令必须包含要执行的下一条指令的地址,这个地址是cmp al, 1指令。当执行call指令时,处理器从操作数所指向的内存位置中检索地址,将当前IP寄存器的值(其中包含call指令本身的地址)压入栈中,并跳转到检索到的地址。
执行call指令后,处理器在栈顶有下一条指令的地址,并将其弹出并从该地址恢复执行。因此,CS和IP寄存器将被更新,以指向下一条指令,即cmp al, 1指令。然后将执行cmp指令,根据结果,代码将跳转到int9ret或执行后续指令。
页:
[1]