《汇编语言(第三版)》王爽,实验八

分析下面的程序,在运行前思考:这个程序可以正确返回吗?

运行后再思考:为什么是这种结果?

通过这个程序加深对相关内容的理解。

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

里面,但是却很幸运地正常结束了。

猜你喜欢

转载自blog.csdn.net/chczy1/article/details/80377099