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标号处的位移量.并且前进而不是后移到程序头.真晕.
- [perryyang] 非常感谢,终于明白了,没有复制前的位移量以机器码的形式被复制到了S处,当读入指令到缓冲器后指针下移到 09/06 18:47
- [nice_future] 说下我的想法吧: 在程序编译到jmp short s1时,转换成的机器码是EBF6,意思是向前移动 09/06 12:53
- [acool] 正确。 内存中的信息被CS:IP指向时是程序,被DS指向时是数据 ------------- 01/25 17:22
- [acool] 不错,分析的都正确。 01/25 17:20
- [acool] 分析正确。 注意别丢了H。 01/25 17:19
- [perryyang] 呵呵,我也是还没入门,我的结论来自于书第6页最后一句,一个CPU有N根地址线,则可以说这个CPU的地 01/25 10:29
- [5331065] “10根导线可以传送10位二进制数据”那1根导线就是可以传送1位二进制数据 “一个CPU有N根地址 01/24 12:28
- [5331065] 我做了检测题1.1除了第一题其他全对,我想了第一题好久都想不清楚为什么是13能麻烦说清楚一点吗? 01/24 12:19
[ 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个字节的代码,正好到了返回语句处.再次感谢.