【问题标题】:storing a constant in memory using ASM使用 ASM 在内存中存储常量
【发布时间】:2013-05-22 17:22:06
【问题描述】:

将我的常量 $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

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

我最初输入错误的地址错过了十六进制中的“b”。抱歉。

【问题讨论】:

    标签: assembly x86-64 mov


    【解决方案1】:

    要将常量 $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
    

    【讨论】:

    • 错误,movabs 的操作数大小不匹配说我的 gcc。感谢您提供有关缺少链接器的信息。所以我猜如果没有汇编链接器例程,我的代码将无法正常工作。
    【解决方案2】:

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

    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 位用于近跳转并添加一个重定位部分,告诉链接器用正确的数据更新该区域。

    【讨论】:

      猜你喜欢
      • 2021-10-17
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多