什么是适当的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”。
答案 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位,并添加一个重定位部分,告诉链接器使用正确的数据更新该区域。