我试图在一个更易于调试的状态下编译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条答案
按热度按时间mrfwxfqh1#
为什么不编译?
asm的第一个参数不能与第二个参数的地址共享寄存器,因为第一个参数已被修改。如果函数是内联的,则callregs可以是常量或堆栈指针的偏移量,因此不需要单独的寄存器。
如何修复程序以便编译
考虑到volatile和“memory”的存在,并且没有对它的引用,第二个参数可以被删除。