我正在参加一个操作系统设计课程,其中他们为我们提供了一个用 C 语言编写的微内核,我们在此基础上进行构建。内核似乎是为 32 位机器设计的,我正在运行雪豹。因此,我和班上的一位朋友一直在尝试将其破解为 64 位寻址。
最大的问题似乎是一行代码,其中内联汇编用于将当前堆栈指针复制到调度程序使用的临时变量中:
#define SET_STACK(s) asm("movl temp,%esp");
自然,编译器会向我吐回错误,因为%esp
它是一个 32 位寄存器。
/var/folders/0A/0AVWZC-5HhOg6twWZBlDgU+++TI/-Tmp-//cckS2oq7.s:523:32-bit absolute addressing is not supported for x86-64
/var/folders/0A/0AVWZC-5HhOg6twWZBlDgU+++TI/-Tmp-//cckS2oq7.s:523:cannot do signed 4 byte relocation
所以我用它替换它,%rsp
因为它是 64 位堆栈指针寄存器(我认为也%sp
可以,我在这里的其他地方读到 GAS 足够聪明,可以放置正确的前缀)。替换为 后%esp
,%rsp
我收到此错误:
/var/folders/0A/0AVWZC-5HhOg6twWZBlDgU+++TI/-Tmp-//cc8TLdjH.s:523:Incorrect register `%sp' used with `l' suffix
现在,我有点不知所措,因为我对汇编程序并没有真正的经验。我尝试用movl
,mov
和替换movq
,但似乎没有任何效果。这让我相信也许temp
是错误的尺寸?
Temp 是一个全局变量,声明如下:
void* temp; // temp pointer used in dispatcher
我写了一个快速程序来打印不同数据类型的大小,看起来 x86-64 中的 void* 大小为 8 个字节,应该是正确的大小,对吧?
无论如何,显然我不希望有人为我解决这个问题,但是任何可能为我指明正确方向的提示将不胜感激!