实验八————分析一个奇怪的程序
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
使用debug调试程序
- 程序在
start处开始执行,mov ax,0000,指令偏移地址CS:0005 - 下一行指令,
nop,s标号指向偏移地址CS:0008 - 下一行指令,
nop,指令偏移地址CS:0009 - 下一行指令,
mov di,0008,指令偏移地址CS:000A - 下一行指令,
mov si,0020,指令偏移地址CS:000D - 下一行指令,
mov ax,[si],指令偏移地址CS:0010,即将CS:0020处的机器码存入ax寄存器中 - 下一行指令,
mov [di],ax,指令偏移地址CS:0014,即将ax中存储的机器码填在s标号CS:0008处的内存中 - 下一行指令,
jmp 0008,跳转到s标号CS:0008处 - 此时我们注意,
s2标号处指令所对应的机器码,它是使用位移转移的jmp指令,所以在s标号处执行jmp 0000,因为jmp short s1对应是将IP-10 - 所以最后跳转到结束指令
尝试戏耍一下系统,但别把自己绕晕了
关键:理解jmp指令的跳转方式!!!
要实践,把书上的代码自己打一遍、debug一遍
来源:CSDN
作者:夏至未至c
链接:https://blog.csdn.net/qq_43364352/article/details/104450129