当前位置: 技术问答>linux和unix
如何理解jmp指令?
来源: 互联网 发布时间:2016-10-11
本文导语: google之后发现这个jmp指令是相对跳转的,但是为什么汇编代码 _asm{ _emit 0xe9; _emit 0x34; _emit 0x7e; _emit 0x08; _emit 0x00; _emit 0x90; }是 不是代表0047EB17 JMP 0x00087E3490 而是代表0047EB17 ...
google之后发现这个jmp指令是相对跳转的,但是为什么汇编代码
_asm{
_emit 0xe9;
_emit 0x34;
_emit 0x7e;
_emit 0x08;
_emit 0x00;
_emit 0x90;
}是
不是代表0047EB17 JMP 0x00087E3490
而是代表0047EB17 JMP 00506950( 90h 是 nop 指令)呢?
网上介绍说这是因为设指令中E9之后的整数(跳转的偏移量)为X
那么有: 0047EB17 + 5 + X = 00506950
可以求得: X = 00087E34
如果以上解释正确,是不是说明这个相对跳转的指令 0xe9被翻译成汇编时是以绝对跳转的JMP指令形式出现的呢?
_asm{
_emit 0xe9;
_emit 0x34;
_emit 0x7e;
_emit 0x08;
_emit 0x00;
_emit 0x90;
}是
不是代表0047EB17 JMP 0x00087E3490
而是代表0047EB17 JMP 00506950( 90h 是 nop 指令)呢?
网上介绍说这是因为设指令中E9之后的整数(跳转的偏移量)为X
那么有: 0047EB17 + 5 + X = 00506950
可以求得: X = 00087E34
如果以上解释正确,是不是说明这个相对跳转的指令 0xe9被翻译成汇编时是以绝对跳转的JMP指令形式出现的呢?
|
我想了一下。可能是误导你了。后4个字节应该是偏移。你给出的公式是对的。
0047EB17 + 5 + X = 00506950
目标地址 = EIP + rel32
而EIP是指令所在地址+指令长度。
rel32在这里就是00087E34H
|
0xe9 就是jmp的opcode呀。是相对跳转。
这个要这样理解。相对跳转应该是段内的跳转。然而,现在的操作系统将段的范围设定为,就是0~0xffffffff。因此,0xe9这个相对跳转的范围就不是以前,8086的64K内了。很好理解的嘛。
0xe9这条指令,5个字节。后4个字节组成32位的地址。因此,区分出0x90不是这个指令的一部分,而是单独的nop指令。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。