汇编实验八(王爽)

assume cs:code

code segment
        mov ax,4c00h          #3
        int 21h               #2

start:  mov ax,0              #3
    s:  nop                   #1
        nop                   #1

        mov di,offset s       #3  -> di=0008
        mov si,offset s2      #3  -> si=0020
        mov ax,cs:[si]        #3  ->(ax) = (cs*16+(si))
        mov cs:[di],ax        #3  ->(cs*16+(di)) = (ax)

   s0:  jmp short s           #2
   s1:  mov ax,0              #3
        int 21h               #2
        mov ax,0              #3

   s2:  jmp short s1          #2
        nop                   #1

code ends

end start

分析这个程序是否能运行?

结果是可以运行!我错了,我以为它不可以 ,没跟踪之前分析了半天也没弄出来。

程序最初执行,执行到mov ax,cs:[si]这里时,ax寄存器内的值等于偏移地址为0020处的汇编机器码(jmp short s1),这个指令代表的是跳到偏移量为(是s1处的偏移地址-jmp指令后第一个指令的地址,算出为-10,补码为F6);执行到mov cs:[di],ax 后,偏移地址为0008处的指令被改为(jmp short s1),而这个指令实际代表的只与偏移量有关,即F6(EBF6);程序继续执行,执行完jmp short s后,跳转到标号s处(偏移地址为0008处)开始执行,此时,该处的指令已经改变为jmp到偏移量为F6(-10)的地方,一计算,发现就是偏移地址为0000处,程序最开始处,即mov ax,4c00h   int 21h,程序正常返回!

最后的执行结果如下:

猜你喜欢

转载自www.cnblogs.com/jane315/p/12893518.html