我用下面的代码创建了一个简单的C++源文件:
int main() {
int a = 1;
int b = 2;
if(a < b) {
return 1;
}
else if(a > b) {
return 2;
}
else {
return 3;
}
}
我使用了objdump
命令来获取上述源代码的汇编代码。
行int b = 2;
被转换为mov DWORD PTR [rbp-0x4], 0x2
。
其对应的机器代码为C7 45 FC 02 00 00 00
(十六进制格式)。
- 我想知道我如何将汇编代码转换为二进制代码 *。我翻阅了x86-64的英特尔参考手册,但我无法理解它,因为我是低级编程的新手。
1条答案
按热度按时间waxmsbnn1#
你应该阅读英特尔手册,它解释了如何做到这一点。对于一个更简单的参考,read this。x86指令的编码方式相当简单,但可能性的数量可能有点压倒一切。
简而言之,x86指令包括以下部分,其中除了操作码之外的每一部分都可以缺失:
prefix
域可能会修改指令的行为,这并不适用于您的用例。您可以在参考文献中查找opcode
(我喜欢this one),例如,mov r/m32, imm32
是C7 /0
,这意味着:操作码为C7
,两个操作数中的一个为零,编码为扩展操作码。操作数/扩展操作码编码为带有可选sib的modr/m字节(小数位数索引基址)字节(用于某些寻址模式)和可选的8位或32位位移。您可以在引用中查找所需的值。因此,在您的示例中,您希望对内存操作数
[rbp]
进行编码,该操作数具有1字节位移和寄存器操作数0,导致modr/m字节45
。因此,编码为:现在,我们将8位位移编码为二进制补码。
-4
对应于FC
,因此这是最后,我们将32位立即数编码为
2
。请注意,它采用小尾序:这就是指令的编码方式。