汇编程序25:实验8(分析一个奇怪的程序)
1 assume cs:code 2 3 code segment 4 mov ax,4c00h 5 int 21h 6 start: 7 mov ax,0 8 s: 9 nop 10 nop 11 mov di,offset s 12 mov si,offset s2 13 mov ax,cs:[si] 14 mov cs:[di],ax 15 s0: 16 jmp short s 17 s1: 18 mov ax,0 19 int 21h 20 mov ax,0 21 s2: 22 jmp short s1 23 nop 24 code ends 25 26 end start
程序大致过程:
首先程序进行编译,使指令段与code segment挂钩,编译结束时ip指向入口处,为0005(这里mov ax,4c00h占3字节,int 21h占2字节)
标号s执行结束后,把标号s2处的程序段机器码EBF6(这里F6是计算前后位移获得,s1标号开始mov ax,0占3字节,int 21h占2字节,所以总占8字节,即到标号s2位移为8)
赋值给标号s开始处,占2字节,即替换了两个nop指令
继续执行,到标号s0,然后跳到s处,执行新指令(刚刚赋值过来的,这里具体为机器码EBF6 汇编码JMP 0000)从而跳到code代码入口(此时ip为0而start处ip为5)
继续执行,两条结束指令,从而code程序结束,源程序结束