分析下面的程序,在运行前思考:这个程序可以正确返回吗?
运行后再思考:为什么是这种结果?
通过这个程序加深对相关内容的理解。
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
里面,但是却很幸运地正常结束了。