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,程序正常返回!
最后的执行结果如下: