鱼C论坛

 找回密码
 立即注册
查看: 1897|回复: 5

call指令求解释

[复制链接]
发表于 2013-10-12 10:51:30 | 显示全部楼层 |阅读模式
5鱼币
]$M_$@J2ITFM@X7[C$]KO]W.jpg
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   ???   

最佳答案

查看完整内容

有图有真相 内存地址 机器码 汇编指令 执行后情况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 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-12 10:51:31 | 显示全部楼层
本帖最后由 福禄娃娃 于 2013-10-12 12:48 编辑

有图有真相
123.jpg

内存地址  机器码          汇编指令                        执行后情况
14B6:0000 B80000        MOV     AX,0000            AX = 0
14B6:0003 BB0000        MOV     BX,0000            BX = 0
14B6:0006 E80100        CALL    000A                  IP指向000A,这时CALL下一条指令的IP=9入栈
14B6:0009 40               INC     AX                      这条指令得不到执行,被跳过了
14B6:000A 58               POP     AX                     把栈中的值9弹出,弹到AX中,所以AX=9
14B6:000B B8004C       MOV     AX,4C00
14B6:000E CD21           INT     21

用debug进行跟踪确认,“call 标号”是将该指令后的第一个字节偏移地址入栈,再转到标号处执行指令。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-12 11:26:19 | 显示全部楼层
call是先把下一个指令的入口压入栈,这样再call完之后才可以回得来继续执行下一个指令;
如果是把当前指令压入栈,那就一直在循环了。
你这里call的下一个指令:inc ax,对应的IP=9
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-12 18:37:40 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-13 13:49:55 | 显示全部楼层
参照第二章一条指令的执行过程,指令进入指令寄存先IP+ 后执行指令。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-15 22:52:45 | 显示全部楼层
http://weilan.bego.cc/u/1553835/3821665%
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 10:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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