实验8 分析一个奇怪的程序
实验8 分析一个奇怪的程序
分析下面的程序,在运行前思考:这个程序可以正确返回吗?
通过这个程序加深对相关内容的理解。
;-------------------------------------------------------------------------------
;exp8.asm
;DATE:2007/12/13
;-------------------------------------------------------------------------------
assume cs:codesg
codesg segment
mov ax,4c00h
int 21h
start:mov ax,0
; 占用一个字节的空间,关键,用来添加指令用
s:nop
; 占用一个字节的空间,关键,用来添加指令用
nop
;把标号s处的偏移地址(0008H)传送到DI寄存器
mov di,offset s
mov si,offset s2 ;把标号S2处的偏移地址(0020H)传送到SI寄存器
mov ax,cs:[si] ;把代码段处偏移地址为(si)的内容(0F6EBH,即指令JMP SHORT S翻译后为JMP 0008H)传送到AX寄存器,即把标号S2处的指令传送到AX寄存器(关键)
mov cs:[di],ax ;把AX内容传送到标号S处(S处有两个字节空间可以用来存入一条指令,关键),相当于在S处添加一条指令JMP SHORT S,机器码为0F6EBH,不过翻译后变为JMP 0000H(好奇怪哦,由原来的JMP 00008H变成这个样子了)
s0:jmp short s ;跳转到标号S处执行指令,实际上在上面已经把指令jmp short s复制到了标号S处,因为S为位移值,而不是一个偏移地址,所以执行该指令时,IP寄存器的内容被修改为:S处第二条指令的地址
s1:mov ax,0
int 21h ;(此处指令求被执行)
mov ax,0 ;(此处指令求被执行)
s2:jmp short s1 ;跳转到标号S1处执行指令,汇编为机器码为0EBF6H,经编译器翻译后为JMP 0018H,关键
nop
codesg ends
end start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov di,offset s
mov si,offset s2
这两条指令的功能是把源内存单元的和目的内存单元的偏移地址传送到相应寄存器中去
mov ax,cs:[si]
mov cs:[di],ax
这两条指令的功能是将源内存单元的指令传送到目的内存单元中去
将源内存单元的指令jmp short s1 传送到目的去,确切的说应该是将机器指令EBF6H(jmp short s1被DEBUG翻译后的机器码)传送到目的内存单元去.这时,DEBUG把这个机器指令解释出来后,并不是我们原来看到的jmp short s1,因为F6H对应的有符号数为-10D,即当执行jmp short s返回s处执行EBF6H指令时,IP的内容加上JMP指令的长度为10,此时再减去10D,正好CS:IP指向mov ax,4c00h这条指令,接着往下执行程序顺利结束。因此程序可以正常返回。
学了好久,才终于将实验8写完,感觉问题是弄明白了,可是说出来又要让懂的人明白却不是那么容易的一回事。
