鱼C论坛

 找回密码
 立即注册
查看: 4170|回复: 10

检测点10.5(2)

[复制链接]
发表于 2011-10-2 21:11:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
ax我算出来是0,,,为什么是1.。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-20 00:03:44 | 显示全部楼层
为什么没有回答的呢?我尝试以下吧  理解的不好,大家帮忙指正共同学习:lol
mov ax,data  
mov ss,ax                     ;这里数据段就作为栈段使用了。  
mov sp,16                     ;SS:SP=[data]:[10h]  
mov word ptr ss:[0],offset s  ;offset s 取标号S偏移地址存入内存单元ss:[0]
mov ss:[2],cs                 ;这里将段地址CS的值存入内存单元ss:[2]中,以上这两句就是确定了CALL
                                    执行时需要的地址CS:IP ,当CALL执行时转移到SS:[0],而此单元的内容
                                     正好是标号S的地址
call dword ptr ss:[0]       ;这里call执行时还是分两步,由于是双字转,移所以首先将CS的值压入栈顶中
                                       即ss:[0eH],将IP的值压入ss:[0cH](此处压入的IP值就是call临近的下一
                                       条指令nop处的偏移地址)      

nop                          ;由于call直接跳转到了标号s处,所以该指令没有被执行,但是占用一个字节,
                                  如果没有NOP指令,则call执行IP的压栈操作时压入的IP值就会是标号S的偏移
                                  地址,那时候结果ax就是0
s:mov ax,offset s               ;取标号S的偏移地址存入ax中  
sub ax,ss:[0ch]                ;ax=ax-ss:[0Ch]=001A-0019=1,AX中的内容是标号S的偏移地址,
                                         [0cH]单元的内容就是NOP指令的偏移地址 ,确实相差1
mov bx,cs                       
sub bx,ss:[0eh]                ;bx=bx-ss:[0eH]=0正是CALL执行时将CS的值压入到了ss:[0eH]  


其实可以给CS、标号S的偏移地址赋个值这样理解更直观。总之记住CALL执行时压入的IP的值就是它临近的下一条指令的偏移地址就行了。

评分

参与人数 1鱼币 +5 贡献 +3 收起 理由
网友 + 5 + 3 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 3 反对 0

使用道具 举报

发表于 2012-8-1 01:34:59 | 显示全部楼层

call dword ptr ss:[0]       ;这里call执行时还是分两步,由于是双字转,移所以首先将CS的值压入栈顶中
                                       即ss:[0eH],将IP的值压入ss:[0cH](此处压入的IP值就是call临近的下一
                                       条指令nop处的偏移地址)       这里,cs入栈,ip=19h入栈,转到cs:1ah处执行指 令;(ss:[4])=cs,(ss:[6])=ip 这里不对么?;为什么是[0eh]和【0ch】这二个单元!



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-8-2 12:01:39 | 显示全部楼层
本帖最后由 API小肚兜 于 2012-8-2 12:03 编辑
丶Haw 发表于 2012-8-1 01:34
call dword ptr ss:[0]       ;这里call执行时还是分两步,由于是双字转,移所以首先将CS的值压入栈顶中 ...


惭愧啊 十天不看书,好久才理解。
你是不是对call执行时cs、ip入栈的地址有疑问?认为CS入栈的地址应该是SS:[4]而不是ss:[0eH]?我觉得可能call上面的这两条指令影响到你了
mov word ptr ss:[0],offset s
mov ss:[2],cs
开始的时候栈顶指针的位置在哪我觉得你应该知道,这里你要理解一下栈定指针和指令指针的区别,当我们用MOV指令将内容写入内存单元时,并不会影响到栈定指针的位置,因为我们的栈空间是来自一个数据段,程序向数据段中写内容而不是栈中写内容。如果我们的栈执行到ss:[0] 时也会覆盖原来的数据。所以虽然说栈内好像有了数据,但是栈顶指针位置并不受影响。剩下的就是好好理解一下栈的结构及工作方式。
他依然指向开始的位置,直到有PUSH指令才改变。         
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-8-2 12:40:22 | 显示全部楼层
API小肚兜 发表于 2012-8-2 12:01
惭愧啊 十天不看书,好久才理解。
你是不是对call执行时cs、ip入栈的地址有疑问?认为CS入栈的地址应该 ...

开始没注意到这是栈,现在理解了,非常感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2014-1-17 21:38:14 | 显示全部楼层
学习学习再学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-23 09:51:36 | 显示全部楼层
API小肚兜 发表于 2012-7-20 00:03
为什么没有回答的呢?我尝试以下吧  理解的不好,大家帮忙指正共同学习:lol
mov ax,data  
mov ss,ax   ...

非常感谢,这么详细的解答,解惑啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-4 00:19:35 | 显示全部楼层
API小肚兜 发表于 2012-7-20 00:03
为什么没有回答的呢?我尝试以下吧  理解的不好,大家帮忙指正共同学习:lol
mov ax,data  
mov ss,ax   ...

十分感谢,虽然不知道是不是全部正确,但是我觉得很好,赞一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-16 00:17:31 | 显示全部楼层
这就是了解一下这个指令的具体工作流程就可以。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-16 11:08:11 From FishC Mobile | 显示全部楼层
回帖是一种美德
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-16 09:05:11 | 显示全部楼层
API小肚兜 发表于 2012-7-20 00:03
为什么没有回答的呢?我尝试以下吧  理解的不好,大家帮忙指正共同学习:lol
mov ax,data  
mov ss,ax   ...

我认为你说的最后一句有误,call执行时压入的ip的值是它临近的下一条指令的ip地址,不应该是偏移地址。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-6 14:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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