Assembly 使用ASM在内存中存储常量

Assembly 使用ASM在内存中存储常量,assembly,x86-64,mov,Assembly,X86 64,Mov,在内存位置0x7FFFFFB098中存储常量$3360220的正确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 $0x7ff

在内存位置0x7FFFFFB098中存储常量$3360220的正确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中使用
objdump-d file.o>file.d
创建了.d文件。如何使用正确的链接


我一开始打错了地址,在十六进制中漏掉了“b”。对此我深表歉意

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

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

jmp 0x401070
看起来像:

14:   e9 00 00 00 00          jmpq   0x19
因为您反汇编了.o文件。如果在链接器完成重新定位处理后将其拆解,它将看起来正常:

0x000000000004000E5:e9 86 0f 00 00 jmpq 0x401070

我解决了在堆栈上推送地址并返回的问题

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 
0000000000000000:
0:49 c7 c1 dc 45 33 00 mov$0x3345 dc,%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位,并添加一个重新定位部分,告诉链接器用正确的数据更新这个区域

错误,movabs的操作数大小不匹配表示我的gcc。感谢您提供有关丢失链接器的信息。因此,如果没有汇编链接器例程,我的代码可能无法正常工作。
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