分析下面的程序,在运行前思考:这个程序可以正确返回吗?
运行后再思考:为什么是这种结果?
通过这个程序加深对相关内容的理解。
assume cs:code
code segment
mov ax,4c00h
int 21h
start:
mov ax,0
s: nop
nop
mov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax
s0: jmp short s
s1: mov ax,0
int 21h
mov ax,0
s2: jmp short s1
nop
code ends
end start该程序可以正确返回,原因如下:

(s2的机器语言表示为上图中的蓝色高亮部分)

(s2复制到s的代码的机器语言表示为上图中的蓝色高亮部分)
由截图可以看出,s2原本的机器码为:
07116: EB 235 ?
07117: F0 240 ?
而复制到s处的机器码也为
07116: EB 235 ?
07117: F0 240 ?
而jmp等转移指令又是先将转移的目的地址和转移指令地址的后一位地址做差,然后将差值的补码放入机器代码中,所以一味的复制机器代码而不修改其中跳转指令所需要的值,会对程序产生不可预料的后果,就如同本题一样,原本应该跳转到s1的代码却跳转到了
mov ax,4c00h
int 21h
里面,但是却很幸运地正常结束了。

本文探讨了一段特定的程序代码,在不修改跳转指令的情况下简单复制机器代码可能导致的不可预期行为。通过分析一个具体例子,解释了为什么程序能够意外地正确结束。
1456

被折叠的 条评论
为什么被折叠?



