ソ孤单背影 发表于 2013-10-12 10:51:30

call指令求解释


assume cs:codesgcodesg segmentstart:mov ax,0      mov bx,0      call s          inc ax             s: pop ax         mov ax,4c00h          int 21h          codesg endsend start


CALL指令执行时,进行两步操作: (1)将程序当前执行的位置IP压入堆栈中; (2)转移到调用的子程序。   为什么pop ax后ax=0009   ???   

福禄娃娃 发表于 2013-10-12 10:51:31

本帖最后由 福禄娃娃 于 2013-10-12 12:48 编辑

有图有真相


内存地址机器码          汇编指令                        执行后情况14B6:0000 B80000      MOV   AX,0000            AX = 014B6:0003 BB0000      MOV   BX,0000            BX = 014B6:0006 E80100      CALL    000A                  IP指向000A,这时CALL下一条指令的IP=9入栈14B6:0009 40               INC   AX                      这条指令得不到执行,被跳过了14B6:000A 58               POP   AX                     把栈中的值9弹出,弹到AX中,所以AX=914B6:000B B8004C       MOV   AX,4C0014B6:000E CD21         INT   21
用debug进行跟踪确认,“call 标号”是将该指令后的第一个字节偏移地址入栈,再转到标号处执行指令。

tsembrace 发表于 2013-10-12 11:26:19

call是先把下一个指令的入口压入栈,这样再call完之后才可以回得来继续执行下一个指令;
如果是把当前指令压入栈,那就一直在循环了。
你这里call的下一个指令:inc ax,对应的IP=9

ソ孤单背影 发表于 2013-10-12 18:37:40

tsembrace 发表于 2013-10-12 11:26 static/image/common/back.gif
call是先把下一个指令的入口压入栈,这样再call完之后才可以回得来继续执行下一个指令;
如果是把当前指令 ...

谢谢你了...

vitamin 发表于 2013-10-13 13:49:55

参照第二章一条指令的执行过程,指令进入指令寄存先IP+ 后执行指令。

xiejiale 发表于 2013-10-15 22:52:45

http://weilan.bego.cc/u/1553835/3821665%
页: [1]
查看完整版本: call指令求解释