assembly 如何将汇编代码转换为二进制代码?

uqdfh47h  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(181)

我用下面的代码创建了一个简单的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的英特尔参考手册,但我无法理解它,因为我是低级编程的新手。
waxmsbnn

waxmsbnn1#

你应该阅读英特尔手册,它解释了如何做到这一点。对于一个更简单的参考,read this。x86指令的编码方式相当简单,但可能性的数量可能有点压倒一切。
简而言之,x86指令包括以下部分,其中除了操作码之外的每一部分都可以缺失:

prefix opcode operands immediate

prefix域可能会修改指令的行为,这并不适用于您的用例。您可以在参考文献中查找opcode(我喜欢this one),例如,mov r/m32, imm32C7 /0,这意味着:操作码为C7,两个操作数中的一个为零,编码为扩展操作码。

C7 /0 imm32

操作数/扩展操作码编码为带有可选sib的modr/m字节(小数位数索引基址)字节(用于某些寻址模式)和可选的8位或32位位移。您可以在引用中查找所需的值。因此,在您的示例中,您希望对内存操作数[rbp]进行编码,该操作数具有1字节位移和寄存器操作数0,导致modr/m字节45。因此,编码为:

C7 45 disp8 imm32

现在,我们将8位位移编码为二进制补码。-4对应于FC,因此这是

C7 45 FC imm32

最后,我们将32位立即数编码为2。请注意,它采用小尾序:

C7 45 FC 02 00 00 00

这就是指令的编码方式。

相关问题