实验八————分析一个奇怪的程序
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