分析:
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
先不上机分析,用脑海跑到4个mov的地方,发现是将s2的jmp代码复制到s0处,然后往下跑。先跳回s0,然后由于复制了s2的代码,继续跳到s1,执行一个不知道干嘛的中断。
一切很理想,但是上机后发现,奇怪了,为啥会返回,一步一步执行后发现代码变了
这里变成了0000,而不是s1的起始地址。这是为什么呢?
其实我们在复制程序的时候,计算机是复制内存的数据,而不是代码,也就是s2处前面的E8F6
而E8F6的意思就是向上跳10个地址,因为s2调到s1就是10个地址,所以在s处向上跳10个地址就是返回的代码段了。