汇编网首页登录博客注册
perryyang的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新留言
好友圈
文章收藏
友情链接

[2010-09-05 16:28] 实验8的问题

assume cs:codesg 
codesg segment 
             mov ax,4c00H 
             int 21H 
start:  mov ax,0 
s:           nop 
             nop 
             mov di,offset s    ;取得S处的偏移地址
               mov si,offset s2   ;取得S2处的偏移地址
               mov ax,cs:[si] 
             mov cs:[di],ax     ;由AX中转将S2处的代码复制到S处
s0:        jmp short s          ;使IP指向S处,此时S处的两条空指令已被S2处的jmp short s1所覆盖,执行jmp short s1时机器计算下一条指令nop到S1标号处的位移量10个字节,并后移,此时IP实际指向被覆盖的两字节的下一条指令.那么后移10个字节就到了程序头.
s1:         mov ax,0 
            int 21H 
            mov ax,0 
s2:         jmp short s1 
            nop 
codesg ends 
end start 
转移指令中,机器计算的时转移指令下一条指令的位置到标号位置的位移.
没有理解的部分:当IP指向被S2处的jmp short s1所覆盖的两个nop指令位置时,接着应该执行复制上来的jmp short s1,那么机器应该计算从当前指令向下到S1标号处的位移量.并且前进而不是后移到程序头.真晕.
评论次数(2)  |  浏览次数(603)  |  类型(汇编作业) |  收藏此文  | 

[  nice_future   发表于  2010-09-06 12:53  ]

说下我的想法吧:
在程序编译到jmp short s1时,转换成的机器码是EBF6,意思是向前移动10个字节,而复制的时候复制的应该就是EBF6,而不是从s处转移到s1处的机器码,所以程序会向上到返回语句处,从而正确返回!
我觉得你的想法有点程序先把jmp short s1复制到了s处再进行编译计算位移量的味道。。

[  perryyang   发表于  2010-09-06 18:47  ]

非常感谢,终于明白了,没有复制前的位移量以机器码的形式被复制到了S处,当读入指令到缓冲器后指针下移到下一条指令处,接着执行这个表示指针向后移10个字节的代码,正好到了返回语句处.再次感谢.

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码