分析下面的程序,在运行前思考:这个程序可以正确返回吗?
运行后再思考:为什么是这种结果?
assume cs:codesg
codesg 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
codesg ends
end start
我们先分析一下代码s标号处的指令就是执行了把s2标号的代码写入到了s标号的前两个字节(nop,nop),然后执行s0标号处便进行了跳转,跳转到了s标号,这时候s标号的前两个字节的内容已经是s2标号的前两个字节的内容。
然后根据题目要求编译运行程序,然后查看一下指令的信息(如图)
我们再把程序执行一遍,发现跳转回s标号后,执行了跳转到0000处,以下便是程序执行完后的结果。
我们查看一下被修改后的s标号处的代码,s2标号的偏移地址是0020,我们可以看到0020和s标号(0008)的机器码是一样的EBF6,但是执行的操作不一样,一个是跳转到0018,一个是跳转到0000,F6是以补码形式,也就是-10,所以0008执行后ip+2到000a,再进行000a-10=0000.