使用ASM在内存中存储常量

时间:2013-05-22 17:22:07

标签: assembly x86-64 mov

什么是适当的gcc可编译GAS ASM代码将我的常量$ 3360220存储在内存位置0x7FFFFFFFb098? 这会产生预期的结果吗? 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

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

我错误地输入了地址,最初在hex.Sorry中错过了“b”。

2 个答案:

答案 0 :(得分:0)

要在内存位置 0x7FFFFFFF098 中存储常量 $ 3360220 ,您需要以下内容:

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

答案 1 :(得分: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位,并添加一个重定位部分,告诉链接器使用正确的数据更新该区域。