Gcc 为什么seabios不能使用-fno内联编译

Gcc 为什么seabios不能使用-fno内联编译,gcc,compiler-errors,inline,inline-assembly,bios,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) :

我正在尝试以更易于调试的状态编译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内联的情况下可以很好地编译,这是为什么

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


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

但是如果callregs是esp的偏移量或常量,我看不出它在父函数中有什么关系,那么它也需要作为参数传递给这个函数,因此它仍然是esp的偏移量,而且仍然不需要额外的注册。