当我收到有关浮点指令的意外异常时,我的纯整数裸机C项目刚刚停止。
查看 gcc 生成的代码,罪魁祸首是一个fmov d0, x0
,用于将值临时存储在浮点寄存器中,而不是堆栈上。
我不希望它那样做!
我可以使用noinline
属性标记一两个函数,但这并不能保证问题不会在其他地方再次发生。
此选项可以解决问题:
-mgeneral-regs-only
https://gcc.gnu.org/onlinedocs/gcc-7.1.0/gcc/AArch64-Options.html
生成仅使用通用寄存器的代码。这将阻止编译器使用浮点和高级 SIMD 寄存器,但不会对汇编器施加任何限制。
您需要通知编译器您的目标没有浮点硬件。确切的标志取决于您的目标(对于 ARM,它是-msoft-float
(。