Assembly 使用ASM在内存中存储常量
在内存位置0x7FFFFFB098中存储常量$3360220的正确gcc可编译GAS ASM代码是什么? 这会产生预期的结果吗?movabs指令在下一行“溢出”可以吗? 补充问题:我的反汇编代码看起来像这样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
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