我正在尝试以更可调试的状态编译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就好了,为什么呢?
答案 0 :(得分:0)
asm的第一个参数可能不会与第二个地址共享一个寄存器,因为第一个被修改。如果函数是内联的,则callregs可能是一个常量或偏离堆栈指针,因此不需要单独的寄存器。
鉴于存在volatile和“memory”,并且没有引用它,第二个参数可能会被删除。