回 帖 发 新 帖 刷新版面

主题:[讨论]请帮忙分析一个程序

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
我是一个新手,希望有哪个高手给分析一下它的执行过程

回复列表 (共1个回复)

沙发

start:mov ax,0         ;寄存器赋值 0
     s:nop             ;空指令
       nop             ;空指令
       mov di,offset s ;把s的偏移地址赋给di
       mov si,offset s2;把s2的偏移地址赋给si
       mov ax,cs:[si]  ;把cs:[si]地址上的数据传给ax,也就是指令s2:jmp short s1
       mov cs:[di],ax  ;把ax的数据传给地址cs:[di],也就是指令s2:jmp short s1传到s地址上了
    s0:jmp short s     ;跳到s处执行s处的指令因为s的地址上的内容不在是nop了
                       ;已经变为s2上的内容相当与执行s2:jmp short s1
                       ;由于执行短转移是根据相对地址转移所以原指令
                       ;                  s1:mov ax,0
                       ;                     int 21h
                       ;                     mov ax,0
                       ;                  s2:jmp short s1
                       ;等价于
                       ;                  s1:mov ax,0
                       ;                     int 21h
                       ;                     mov ax, 0
                       ;                  s2:jmp short -8  和s1的地址相差8
                       ;所以此时执行 jmp short -8相对上前移动8个地址
      mov ax, 4c00     ;s地址向上移动8个地址恰好移动到前面这条指令
      int 21h          ;程序结束

我来回复

您尚未登录,请登录后再回复。点此登录或注册