gcc 为什么seabios不能用-fno-inline编译

esbemjvw  于 2023-02-08  发布在  iOS
关注(0)|答案(1)|浏览(142)

我试图在一个更易于调试的状态下编译seabios,所以我想取消函数内联。
为此,我在编译标志中添加了-fon-inline,但随后出现编译错误:

error: can't find a register in class 'GENERAL_REGS' while reloading 'asm'

它是基于以下代码的:

asm volatile(
    "calll __call16big_from32"
    : "+a" (callregs), "+m" (*callregs)
    :
    : "ebx", "ecx", "edx", "esi", "edi", "cc", "memory");

我查了这个错误,发现这意味着编译器已经用完了寄存器,所以它不能编译asm语句。
问题是,完全相同的代码没有-fon-inline也能编译得很好,这是为什么呢?

mrfwxfqh

mrfwxfqh1#

为什么不编译?

asm的第一个参数不能与第二个参数的地址共享寄存器,因为第一个参数已被修改。如果函数是内联的,则callregs可以是常量或堆栈指针的偏移量,因此不需要单独的寄存器。

如何修复程序以便编译

考虑到volatile和“memory”的存在,并且没有对它的引用,第二个参数可以被删除。

asm volatile(
    "call __call16big_from32"
    : "+a" (callregs)
    :
    : "ebx", "ecx", "edx", "esi", "edi", "cc", "memory");

相关问题