注册 登录
编程论坛 汇编论坛

王爽试验 8-----分析一个奇怪的程序

Explorerlxz 发布于 2014-06-06 10:41, 1078 次点击
分析下面的程序,在运行前思考:这个程序可以正确返回吗?
运行后再思考:为什么是这种结果?
通过这个程序加深对相关内容的理解
程序代码:
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 编辑 ]
0 回复
1