王爽试验 8-----分析一个奇怪的程序
分析下面的程序,在运行前思考:这个程序可以正确返回吗?运行后再思考:为什么是这种结果?
通过这个程序加深对相关内容的理解
程序代码:
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
程序的执行结果是可以正常返回 (程序名为8.exe)
分析程序,程序在内存中把s2处一个长为两个字节的jmp short s1移动到s处(nop为一字节指令)
看下图反汇编结果以及机器码
jmp short s1被翻译为ebf6,其中后一字节f6表示转移地址,f6代表的原码为10001010即-0ah,表示向上跳转十个字节,而执行此指令时ip指向0b3b:0022处的nop指令,向上跳转10正好到0b3b:0018即s1标号处,这才是jmp指令的本质,在内存中移动jmp指令后,执行依旧是按照偏移地址而不是标号来执行的,
mov ax,4c00h;3字节
int 21h;2字节
mov ax,0;3字节
jmp short s1;2字节,执行后向上偏移10字节继续执行,所以程序正常返回
[ 本帖最后由 Explorerlxz 于 2014-6-6 10:42 编辑 ]