Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly Mod R/M字节对于无条件跳转指令0xFF有什么意义(如果有)?_Assembly_X86 - Fatal编程技术网

Assembly Mod R/M字节对于无条件跳转指令0xFF有什么意义(如果有)?

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/

考虑以下代码,它是在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/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
MOD=00和R/M=binary 101表示MODRM字节后的“使用disp32”(32位地址)。MODRM字节后的32位偏移量是内存位置。您可以看到它与调试清单中反汇编的jmp指令中的值相匹配

您可能会对操作码0xFF的含义感到困惑;它不一定意味着“JMP”。x86经常使用MODRM Reg/Opcode位来修改操作码字节的含义,以选择特定的指令

使用操作码0xFF,Reg/opcode位被解释为更多操作码位:

  • 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)