Assembly Mod R/M字节对于无条件跳转指令0xFF有什么意义(如果有)?
考虑以下代码,它是在32位Assembly Mod R/M字节对于无条件跳转指令0xFF有什么意义(如果有)?,assembly,x86,Assembly,X86,考虑以下代码,它是在32位ubuntu14.04.2和gcc4.8.2 #include <unistd.h> int main(){ _exit(0); } 英特尔手册告诉我们,ff是JMP的操作码,而最后四个字节显然是目标地址。在对英特尔指令结构进行一些研究后,25似乎是一个Mod R/M字节,但我找不到如何解释Mod R/M字节与JMP指令的关系 我已经阅读了,但是我不理解上面的disas输出中字节0x25的具体含义 这里的0x25的具体含义是什么,以及Mod R/
ubuntu14.04.2
和gcc4.8.2
#include <unistd.h>
int main(){
_exit(0);
}
英特尔手册告诉我们,ff
是JMP
的操作码,而最后四个字节显然是目标地址。在对英特尔指令结构进行一些研究后,25
似乎是一个Mod R/M
字节,但我找不到如何解释Mod R/M
字节与JMP
指令的关系
我已经阅读了,但是我不理解上面的disas
输出中字节0x25
的具体含义
这里的
0x25
的具体含义是什么,以及Mod R/M
字节相对于JMP
的一般解释是什么?实际上,最后4个字节不是目标地址。指令ff 25 0c a0 04 08
是jmp rm32
(跳转绝对间接)的一个实例,最后4个字节实际上是从中读取跳转目标的地址
如中所示,ModRM字节25h的/位部分为4(这使其成为
jmp rm32
,具有操作码字节ff
的其他指令为inc rm32
,dec rm32
,调用rm32
,调用m16:32
,jmp m16:m32
,推送rm32
,所有这些指令都以ModRM字节为特征). ModRM字节25h的其余部分表示操作数是一个内存地址,其形式为[sdword]
操作码0xFF的ModRM字节含义与使用ModRM字节的任何其他指令的含义相同
你最好的参考资料是在线的。第2节和JMP指令页面是正确解释此操作码的MODRM位所需的部分
“0x25”的解释如下:
- (位7-6)模=二进制00
- (位5-3)寄存器/操作码=二进制100
- (位2-0)R/M=二进制101
- Reg/Opcode bits=binary 100(在英特尔手册中写入“/4”)选择指令“jmp near absolute indirect”。x86具有所谓的段寄存器,包括CS;在本例中,“jmp near”表示“不加载CS”李>
- Reg/Opcode==101(“/5”)表示“jmp far”(加载CS),在现代实践中没有使用李>
- 具有其他值的Reg/Opcode指定非JMP的指令
(gdb) disas /r _exit
Dump of assembler code for function _exit@plt:
0x080482f0 <+0>: ff 25 0c a0 04 08 jmp *0x804a00c
0x080482f6 <+6>: 68 00 00 00 00 push $0x0
0x080482fb <+11>: e9 e0 ff ff ff jmp 0x80482e0
End of assembler dump.
(gdb)