C语言 用于将四字移动到 %RDI 的操作码



假设我有一个malloc -ed 变量,我想将其地址移动到 %rdi ,所有这些都是从 C 生成操作码的。它应该看起来像这样:

unsigned char op_1[] = { 0x48, 0x8B, 0x3C, 0x25 }; //movq
unsigned char *a = malloc(1); // Let's asume a is now at 0x1234567812345678
unsigned char *bytecode = malloc(sizeof(op_1) + sizeof(void *)); // 12 bytes
memcpy(bytecode, op_1, sizeof(op_1)); // 4 bytes
memcpy(bytecode + sizeof(op_1), &a, sizeof(void *)); // 8 bytes

这应该将bytecode的内容留给:48 8B 3C 25 78 56 34 12 78 56 34 12 .无论如何,这是无效的字节码,因为(如果我没有误读文档(48 8B 3C 25后跟 4 个字节作为地址。

我的问题是我应该如何将一个 8 字节长的地址移动到%rdi

看起来正确的操作码是48 bf .我编译以下程序集(使用英特尔语法和nasm(:

BITS 64
        mov rdi, 0x1234567812345678

然后我通过objdump -d -w -Mintel传递结果:

0000000000000000 <.text>:
   0:   48 bf 78 56 34 12 78 56 34 12   movabs rdi,0x1234567812345678

操作码48 bf由 REX 组成。W 前缀48用于指定 64 位操作数、操作码b8 + rd io和寄存器选择器RDI (111(:

MOV r64, imm64 : 将imm64移至r64

最新更新