王爽《汇编语言》第9章 实验8 分析一个奇怪的程序

来源:互联网 发布:ubuntu openjdk 路径 编辑:程序博客网 时间:2024/05/29 09:37

    问:以下代码,程序为什么能正常结束?

assume cs:codesgcodesg segment    mov ax,4c00h    int 21hstart:    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,0s2:    jmp short s1    nopcodesg endsend 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

原创粉丝点击