如果我理解clang假设x86的堆栈段是平的(有0个碱基)。例如,使用以下命令行进行编译时:
clang -cc1 -S -mllvm --x86-asm-syntax=intel -o - -triple i986-unknown-unknown -mrelocation-model static xxx.c
xxx.c:
void f()
{
int a = 5;
int *ap = &a;
int b = *ap;
}
生成以下程序集:
f:
sub ESP, 12
lea EAX, DWORD PTR [ESP + 8]
mov DWORD PTR [ESP + 8], 5
mov DWORD PTR [ESP + 4], EAX
mov EAX, DWORD PTR [ESP + 4]
mov EAX, DWORD PTR [EAX]
mov DWORD PTR [ESP], EAX
add ESP, 12
ret
如果堆栈是平的,这可能只是正确的,因为EAX
包含SS
基础的偏移量。
是否可以使用任意基础编译SS
的C代码?
答案 0 :(得分:1)
在保护模式下执行时,段寄存器不包含您可以使用的偏移。相反,每个细分都独立于其他细分。据我所知,目前使用的操作系统都没有使用指针包含段信息的ABI,因为你可以获取任何局部变量的地址(放在堆栈上),这是必要的。我不认为clang(或gcc)可以为这样的模型编译代码。