唉,看完试验8后,调试总跟自己想的结果不一样,想了快一个小时了,刚吃完饭回来,一看,居然想通了!
assume cs:codesg
codesg segment
(5) mov ax,4c00H
int 21H
start:
mov ax,0
s:
(4) nop
nop
mov di,offset s
mov si,offset s2
mov ax,cs:[si]
(1) mov cs:[di],ax
s0:
(3) jmp short s
s1:
mov ax,0
int 21H
mov ax,0
s2:
(2) jmp short s1
nop
codesg ends
end start
注意我的标号啊,程序运行后的顺序执行!
(1) 是 将(2) 的值赋到(4),意思很明白,我就不说了!在这里我要说明的是程序不是将 jmp short s1复制过去,机器不懂这个语言,而是将它代表的机器码EBF6复制,重点在这里! 这个意思就是将IP的地址想前偏移10个字节。
(2)没有运行啊,我只是去标志作用,说明(1)将(2) 的内容copy了,但程序还没运行到此
接着往下运行到(3),跳到s位置,意思很明确了!也就是我们即将运行(4)
(4) 此处的代码已经变化了,(原因是(1)的操作所致),此时此处的操作指令是EBF6,而不是jmp short s1,上面我已经说过,这个指令意思我也讲过, 就是说IP,所指向的位置跑到前面10个字节了
此时我们ip地址为08,执行玩这个指令后应该+2,变成10了(EBF6 两个字节),然后再-10,变成0了
变成我们代码段首地址了,也就是我们将运行(5)
后面我就不说了,你明白的!
OK,我要开始试验9了,纠结了1个小时。终于解决了!
大家一起学习愉快 |