鱼C论坛

 找回密码
 立即注册
查看: 2289|回复: 7

检测点10.2有些郁闷 求大牛!

[复制链接]
发表于 2012-9-4 15:25:15 | 显示全部楼层 |阅读模式
1鱼币
下面的程序执行后,ax中的数值为多少?
内存地址    机器码      汇编指令     
1000:0     b8 00 00     mov ax,0     
1000:3     e8 01 00     call s      
1000:6     40           inc ax
1000:7     58         s:pop ax      


执行完mov ax, 0后IP是3  ,根据甲鱼老师的公式  标号处地址-call指令后的第一个字节=算出偏移量是6 ,call指令执行有2个操作 将当前IP或CS IP压栈,  也就是说 先将cs压栈  再将IP压栈  ,最上面的是当前的IP ,call指令处的IP是3  将这个数据弹进ax 也只能是3  怎么成6了 请详细解释下!

最佳答案

查看完整内容

(ip)=(ip)+16位位移 16位位移由编译程序时在编译时算出,所以call s 在加入指令缓冲器时 ip=6,执行jmp near ptr 标号(这时ip=7) ,pop ax=6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-9-4 15:25:16 | 显示全部楼层

(ip)=(ip)+16位位移  16位位移由编译程序时在编译时算出,所以call s 在加入指令缓冲器时 ip=6,执行jmp near ptr 标号(这时ip=7) ,pop ax=6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-9-4 19:20:33 | 显示全部楼层
呵呵   楼主你好~   

问题: 你认为ax 是3 ,  但是答案却是6。   那为什么是6呢?

分析:   首先,我要纠正你一个小小的混乱哦~

第一个:  cpu执行 call 时, 先将 sp减二 (sp = sp-2) , 然后 将ip 入栈 ( push ip ) , 在转移( jmp near ptr)        这里你有个 知识点搞混了。   就是   如果是   call 标号。  那么他是实现近转移,  所以,就是 ip  入栈,    而  call far ptr  才是实现段间转移  是将当前ICS。 IP压栈

第二个: 就是cpu执行过程。

假设  这时cpu的  cs = 1000 , ip =3  也就是指向 1000:3这个内存单元, 那么cpu首先通过地址总线,进入内存的1000:3, 在通过 控制总线,要求读这个内存单元(1000:3)的命令.  然后通过 数据总线把  e8 01 00  (call s)  这个指令 发给cpu,  而cpu接到后,在发给指令缓冲器里,这是 ip = ip + 指令长度。( 提示, 这时还没执行 call s),  然后执行 call  s   这是 把ip 入栈。 (而这时的 ip = 6,  因为前面说过  ip = ip + 指令长度)   。   所以 执行 pop ax  时    ax = 6

好了  问题我以说明了。  如果有哪些说的地方你认为不好(或有误), 请给我联系我, 我将好好改正。  
886~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-9-4 19:24:28 | 显示全部楼层
我回复后查看发现 call far ptr  标号,    漏了个  标号。  真是不好意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-9-5 10:06:52 | 显示全部楼层
梦幻羽羽 发表于 2012-9-4 19:20
呵呵   楼主你好~   

问题: 你认为ax 是3 ,  但是答案却是6。   那为什么是6呢?

1.       (sp)=(sp)-2
          ((ss)*16+(sp))=(ip)
2.       (ip)=(ip)+16位位移

执行完mov ax, 0 是1000:3  然后执行完call s  也就执行了2个字节 这个时候IP指向了6  
因为是跳转 所以ip+位移等于7   但是有一个问题就是 将IP入栈时候是(ip)=(ip)+16位位移
加过16位位移的IP入栈,还是执行完call指令后当前的IP入栈 视频里没有讲的细致 所以一直困惑在这里了

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

使用道具 举报

发表于 2013-8-12 23:25:22 | 显示全部楼层
destiny 发表于 2012-9-5 10:06
1.       (sp)=(sp)-2
          ((ss)*16+(sp))=(ip)
2.       (ip)=(ip)+16位位移

还是这个写的详细啊,3楼写了很多,但是有点看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-16 04:42:59 | 显示全部楼层
9天 发表于 2013-8-12 23:25
还是这个写的详细啊,3楼写了很多,但是有点看不懂

慢慢就理解了 。刚开始也郁闷了一会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-16 19:07:48 | 显示全部楼层
看不懂!!!!:sweat::sweat::sweat::sweat::sweat:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-29 05:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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