汇编语言-奇怪的程序

循环分析

Posted by Kingtous on April 2, 2019

不多说,直接上程序

程序示例

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
  • 程序执行效果:最终正确return,效果如图

程序运行分析

需要了解的知识点

  • jmp short xxx最终会被编译成jmp 具体数值,具体数值的范围为[-128,127]
  • nop无意义,占一个字节

我们来看其中一小段

s1:
    mov ax,0
    int 21h
    mov ax,0

s2:
    jmp short s1
    nop

jmp short s1最终被翻译成:EBF6,其中EB表示jmp,F6(此为补码)即为-10,即向前jmp 10个字节地址,也就是代码中的mov ax,0.

而,

    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

mov cs:[di],ax将s2的jmp short s1(也就是EBF6)写入了s开头的两个nop中,而在程序执行到s0中的jmp short s时,将执行插入的EBF6,又跳转到了mov ax,4c00h,然后程序结束.