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 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 标号”是将该指令后的第一个字节偏移地址入栈,再转到标号处执行指令。
call是先把下一个指令的入口压入栈,这样再call完之后才可以回得来继续执行下一个指令;
如果是把当前指令压入栈,那就一直在循环了。
你这里call的下一个指令:inc ax,对应的IP=9 tsembrace 发表于 2013-10-12 11:26 static/image/common/back.gif
call是先把下一个指令的入口压入栈,这样再call完之后才可以回得来继续执行下一个指令;
如果是把当前指令 ...
谢谢你了... 参照第二章一条指令的执行过程,指令进入指令寄存先IP+ 后执行指令。 http://weilan.bego.cc/u/1553835/3821665%
页:
[1]