首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

王爽书上一段奇怪的代码,它如何能正确返回呢

2013-03-26 
王爽书上一段奇怪的代码,它怎么能正确返回呢?我已经把我的思路写入注释中了,依我的思路应该是个死循环,可

王爽书上一段奇怪的代码,它怎么能正确返回呢?
我已经把我的思路写入注释中了,依我的思路应该是个死循环,可是我DEBUG确认它能正确返回,我的思路错在哪了?


assume cs:codesg
codesg segment
mov ax,4c00h
int 21h
start:
mov ax,0    //0送入ax
s:
nop
nop
mov di,offset s  //把s代码段地址送入di
mov si,offset s2 //把s2代码段送入si
mov ax,cs:[si]   //把s2代码段送入ax
mov cs:[di],ax   //把s2段的代码替换s段的代码,执行后s段和s2段代码相同

s0:
jmp short s //跳转到s段,由于s段的代码被s2段代码替换,执行s2段代码
s1:
mov ax,0
int 21h
mov ax,0
s2:
jmp short s1 //一直执行s1,形成死循环
nop
codesg ends
end start

[解决办法]
执行s部分后,s改写后为:
     jmp s-8
    mov di,offset s 
    mov si,offset s2 
    mov ax,cs:[si]   
    mov cs:[di],ax  
所以    jmp short s 再执行s 的时候就跳到cs:0000的位置,也就是
mov ax,4c00h
int 21
所以会正常结束。

知识点是:转移指令是在编译的时候变成相对偏移地址,这里EBF6是从s2里跳到s1的时候是反向跳8个字节的意思。
同一个表示跳转的命令代码EBF6在
s2:
    jmp short s1 
    nop
中是jmp short s1
而在
s:
    jmp 0000
    mov di,offset s 
    mov si,offset s2 
    mov ax,cs:[si]   
    mov cs:[di],ax 
时是jmp 0000
你打开代码调试就知道了。

热点排行