我正在为自定义汇编器和链接器使用 clang 汇编语言输出。我对 x86 模式感觉很舒服,但对 PC 相对寻址的 x64 模式感觉不太舒服。考虑以下玩具示例。
C 代码:
void sum()
{
static int a, b;
static int c;
c = a + b;
}
x86 输出片段:
sum:
call .L0$pb
.L0$pb:
pop EAX
.Ltmp0:
add EAX, _GLOBAL_OFFSET_TABLE_+(.Ltmp0-.L0$pb)
mov ECX, DWORD PTR [EAX + sum.a@GOTOFF]
add ECX, DWORD PTR [EAX + sum.b@GOTOFF]
mov DWORD PTR [EAX + sum.c@GOTOFF], ECX
ret
x64 输出片段:
sum:
mov EAX, DWORD PTR [RIP + sum.a]
add EAX, DWORD PTR [RIP + sum.b]
mov DWORD PTR [RIP + sum.c], EAX
ret
我的问题是:是否有任何命令行开关允许我在不使用基于 RIP 的寻址模式的情况下生成 x64 代码?如果不是,是否可以修改 LLVM 代码以避免为 x64 模式生成基于 RIP 的寻址模式?如何修改?
我是一名优秀的程序员,十分优秀!