亦有人 发表于 2023-1-22 17:57:22

求解汇编的代码问题


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)的地址

bluesky5210 发表于 2023-2-20 22:19:11

当执行call指令时,下一条指令的地址被推入栈中,控制流被转移到call指令操作数指向的地址。在这个例子中,操作数是dword ptr ds:,这意味着下一条指令的地址被存储在数据段偏移0处的双字中。

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

执行call指令后,处理器在栈顶有下一条指令的地址,并将其弹出并从该地址恢复执行。因此,CS和IP寄存器将被更新,以指向下一条指令,即cmp al, 1指令。然后将执行cmp指令,根据结果,代码将跳转到int9ret或执行后续指令。
页: [1]
查看完整版本: 求解汇编的代码问题