分析实验8:一个奇怪的程序
书上问道程序能否正确的返回
答案:肯定可以
1、分析结果如下:
debug下的反汇编地址图:
2、代码:
assume cs:code
code segment
;地址
mov ax,4c00h ;0000
int 21h ;0003
start:
mov ax,0 ;0005
;------------------------------------
;nop占用1字节,但是cpu不做任何操作
;这两个字节的nop是用来存储之后mov cs:[di],ax的指令 jmp short s1,也就是 EBF6,此处的字节偏移恰好是10,所以之后IP-10 = 0 跳转到cs:0000处执行
s: nop ;0008
nop ;0009
;------------------------------------
mov di,offset s ;000A mov di,0008
mov si,offset s2 ;000D mov si,0020
mov ax,cs:[si] ;0011 cs:[si]就是cs:[0020],则ax存储的是jmp short s1的操作码EBF6
mov cs:[di],ax ;0014 将ax存储的操作码传给cs:[di] = cs:[0008] = EBF6
s0: jmp short s ;0016
;跳转到s处执行,执行操作码EBF6
;EBF6 其中偏移量是F6,其二进制11110110,取反:00001001 加1变为补码:0000 1010 就是10
;IP=IP+所读指令字节数,向前跳10个执行,就是mov ax,4c00h
;可以正常结束
s1: mov ax,0 ;0018
int 21h ;001B
mov ax,0 ;001D
s2: jmp short s1 ;0020 机器码是EBF6
nop ;0022
code ends
end start