天天看点

汇编语言实验8 分析一个奇怪的程序

汇编语言实验8 分析一个奇怪的程序
:code

 

code 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      

答案:可以正常运行。

我们来逐步分析:

汇编语言实验8 分析一个奇怪的程序

这是我们的程序对应的机器指令!

首先我们的 cs:ip 指向的是​

​076A:005​

​​,由此我们可以看出来 ​

​076A:000~076A:004​

​这段地址保存的汇编指令应该是:

mov ax,4c00H
int 21H      

然后我们逐步执行,nop 是空指令,占一个字节,做完实验后我们就会发现它的作用,应该就是为我们凑一个地址,最后让指令能cs:ip能指向 ​

​076A:000​

​这个地址。执行至076A:000A 后,di寄存器获得 s 标号的偏移地址,之后si寄存器又获得 s2 标号的偏移地址,然后我们获取 s2标号处的指令,存入ax,寄存器,此时 ax=EBF6这条指令含义是个关键。

现在我们来分析下面这段代码:

s1:
  mov ax,0
  int 21H
  mov ax,0
  
  s2:
  jmp short      

jmp short s1 这个段代码的指令 就是EBF6,在这里的含义是跳到了s1标号处,但是jmp short s1并不包含s1的地址,它包含的是和当前地址的相对距离,所以这条指令的含义是ip向后移动 x 距离,那么我们看一下x是多少?

继续阅读