实验8
这个程序,刚看时觉得不能正确返回。
后来上机操作后,发现能返回。但是一直不明白为什么JMP 0008后就是JMP 0000,反复操作了很多遍,还是不明白怎么回事。JMP 0008后IP等于-10,也就是F6了,然后就卡住了。
我是不是可以这样理解:
当执行完
mov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax这四条指令后,s2处的指令被复制到标号S处覆盖了两个nop,接着cpu读取指令jmp short s,此时ip指向mov ax,0.然后cpu执行jmp short s,此时跳转位移=8h-18=-10H,ip=18h+8位位移=18h-10h=8h,ip指向标号s处,读取被复制到此处的s2的指令,ip指向0AH。CPU执行jmp short s1时,跳转位移=18h-22h=-0Ah,ip=0Ah-0Ah=0,然后程序就正确返回了。
还有两个地方我不太明白:
1,指令在内存里是以二进制的形式储存的,所以复制指令时只要复制指令的物理地址就行了,是不是?
2,S2处的指令被复制到标号S处时,它的跳转位移也同样被复制了吗? |