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

时间:2013-12-08 16:05:25

标签: c assembly x86-64 cpu-registers

假设我有一个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

1 个答案:

答案 0 :(得分:2)

看起来正确的操作码是48 bf。我编译以下程序集(使用Intel语法和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 ,以及RDI111)的注册选择器:

  

MOV r64, imm64:将imm64移至r64