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

时间:2014-03-24 10:30:52

标签: gcc compiler-errors inline inline-assembly bios

我正在尝试以更可调试的状态编译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就好了,为什么呢?

1 个答案:

答案 0 :(得分:0)

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

鉴于存在volatile和“memory”,并且没有引用它,第二个参数可能会被删除。