assume cs:code
code segment
mov ax, 4C00H
int 21H
start:
mov ax, 0000H
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, 0000H
int 21H
mov ax, 0000H
s2:
jmp short s1
nop
code ends
end start
编译,debug一下,开始分析:
从R命令,可以获知:因为程序中DS075E 所以程序入口CS:ip = 076E:0005 指向的命令式 mov ax,0000,
对应机器码B80000
D命令查看下内容方便后面观察指令执行情况
T命令逐步执行指令,也就是上面的mov ax,0000,可以看到ip变成了0008(因为指令了一个指令,3个字节,后面不赘述)
nop占一个字节,因此没什么好说的
指令mov di,offset s对应mov di,0008编译后会自动计算s标记的offset,mov给di也就是0008
接下来也类似,计算s2标记的offset mov给si 对应mov si,0020
mov ax,cs:[si] 即cs:0020 = F6EB
mov cs:[0008],F6EB,看下内存变化
发现替换了nop对应的内容,可以看到下一条指令是jmp 0008
执行,Jmp 0000 但是根据EBF6其中EB对应jmp F6是偏移,计算补码
原:1111 0110
补:0000 1001 ==9 加一操作 10,由于原用于标记正负的最高位是1,
即表示负数,所以结果是-10 执行0008执行回去会跳到最开始的 0000 也就是 mov 4c00h那里
也就是黄色框框中的内容
因此正常退出程序