0

将我的常量 $3360220 存储在内存位置 0x7FFFFFFFb098 中的正确 gcc 可编译 GAS ASM 代码是什么?这会产生预期的结果吗?movabs 指令在下一行“溢出”可以吗?添加的问题:我的反汇编代码看起来像这样,尽管我写了

jmp 0x401070

,这是为什么,我该如何解决?它还将我的 movq 转换为 movabs

   0:   49 c7 c1 dc 45 33 00    mov    $0x3345dc,%r9
   7:   49 ba 98 f0 ff ff ff    movabs $0x7fffffff098,%r10
   e:   07 00 00 
  11:   4d 89 0a                mov    %r9,(%r10)
  14:   e9 00 00 00 00          jmpq   0x19

我在 linux x86-64 中使用 .d 文件制作了 .d 文件objdump -d file.o > file.d。如何使用正确的链接?

起初我输入错误的地址错过了十六进制中的“b”。对不起。

4

2 回答 2

0

要将常量$3360220存储在内存位置0x7FFFFFFF098中,您需要类似:

mov $3360220, %rax
movabs %rax, 0x7fffffff098

你是

jmp 0x401070

好像:

14:   e9 00 00 00 00          jmpq   0x19

因为你反汇编了.o文件。如果在链接器完成重定位处理后反汇编它,它看起来很正常

0x00000000004000e5 <+17>:   e9 86 0f 00 00  jmpq   0x401070
于 2013-05-24T19:49:55.610 回答
0

我解决了将地址推入堆栈并返回的问题。

0000000000000000 <.text>:
   0:   49 c7 c1 dc 45 33 00    mov    $0x3345dc,%r9
   7:   4c 8d 54 24 08          lea    0x8(%rsp),%r10
   c:   4d 89 0a                mov    %r9,(%r10)
   f:   ff 34 25 70 10 40 00    pushq  0x401070
  16:   c3                      retq 

问题是不能轻易地在 jmp 指令中指定 64 位地址。汇编器不知道这段代码将在哪里,它留出 32 位用于近跳转并添加一个重定位部分,告诉链接器用正确的数据更新该区域。

于 2013-05-25T11:41:06.117 回答