[英]How ARM Compilers Handle Run Time Errors?
与x86相比,如果发生 integer 除以零,则不会为arm引发异常。 结果只是返回0
编辑:这只适用于 Cortex-A 系列。 正如 Jose 所说,在 Cortex-M 系列中,有一个用于 integer 除法的控制寄存器,如下文所述的浮点除法的情况。 请参阅他的答案中的链接。
对于浮点运算,浮点控制寄存器(aarch32 的FPSCR
或FPCR
的 FPCR)对于是否抛出异常是决定性的。 如果在那里设置了相应的位,则会引发异常,否则只会设置浮点状态寄存器中的标志(aarch32 中的FPSCR
或 aarch64 中的FPSR
),然后指示错误。 该寄存器可以通过msr
设置并通过mrs
读取。
如果没有抛出异常,则有以下规则:
infinity
除infinity
是NaN
zero
除zero
是NaN
infinity
都是±zero
±infinity
大中除以zero
的任何其他内容(根据被除数进行标记,这是您在屏幕截图中看到的情况)infinity
除以其他任何东西是±infinity
zero
除以其他任何东西是±zero
参见ARM a64 指令集架构中FDIV
的伪代码。
参考:
根据架构,行为是不同的。 ARMv6-M 不包含除法指令,因此它是管理这种情况的软件(或编译器,从C/C++的角度来看,它是 UB)。
在Cortex M3 (ARMv7-M) 上,情况有所不同,有一个UsageFault异常来管理 DIVBY0 情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.