分析下面的程序,在运行前思考:这个程序可以正确返回吗?运行后再思考:为什么是这种结果?通过这个程序加深对相关内容的理解。
1 | assume cs:codesg |
分析流程:这一步作用是将[si]的机器码写入到[di]中,而[si]对应的机器码是第16行jmp short s1
,正好覆盖掉第6行和第7行的nop
start: mov ax,0 ip:0005
s: nop
nop
mov di,offset s ip:000A
mov si,offset s2 ip:000D
mov ax,cs:[si] ip:0010
mov cs:[di],ax ip:0013
然后开始执行第12行的jmp short s
,也就是回到了第6行处,但是第6行和第7行机器码已经被替换成为jmp short s1
,而jmp short s1
对应着IP = 0020 (IP位移) = 0018H - 0022H = -10D 机器码为EBF6。也就是将IP向前移10个字节即跳转到第三行mov ax,4c00h
处