<pre name="code" class="plain"> assume cs:code
code segment
0H mov ax, 4c00H
3H int 21H
start:
5H mov ax, 0
s:
8H nop
nop
aH mov di, offset s ;di=0005H
mov si, offset s2 ;si=0020H
;cs:[si]指向cs:0020H,所以s2标号下的jmp shorts1指令(大小刚好一个字)被拷贝到ax中
mov ax, cs:[si]
;cs:[di]指向cs:0005H,所以ax中的值被拷贝到s标号开头的一个字单元,即jmp short ;s1被拷到了s开头处,取代了两个nop指令
mov cs:[di], ax
s0:
;编译器计算跳转的偏移值是用标号的偏移-下一条指令的偏移,
;此处即8H-18H=-10H,所以编译后为jmp -10H,
;当执行jmp -10H时,ip=ip+(-10H),
;此处就是ip=18H+(-10H)=8H,就跳转到了s处了
16H jmp short s
s1:
18H mov ax, 0
int 21H
mov ax, 0
s2:
;标号偏移-下一条指令偏移=18H-22H=-aH
;此处编译后为jmp -aH,
;由于s0处跳转到了s处所以这段代码在s处执行,
;在s处执行jmp -aH时,ip=ip+(-aH)=aH+(-aH)=0H,所以跳转到了cs:0000H处,程序成功退出
20H jmp short s1
22H nop
code ends
end start
小结:实验8 分析一个奇怪的程序
最新推荐文章于 2022-06-14 20:19:14 发布