Exception ARM编译器如何处理运行时错误?

Exception ARM编译器如何处理运行时错误?,exception,arm,divide-by-zero,cortex-m3,x86,Exception,Arm,Divide By Zero,Cortex M3,X86,我试图生成一个运行时错误,比如ARM Cortex M3中的除以零。我不知道为什么当我生成被零除的错误系统时会正常工作。然而,价值似乎是“无限的” ARM gcc编译器是否处理此类UsageFault错误?我还没有实现硬件异常处理程序,比如使用故障、总线故障或Mem管理。与之相反,如果发生整数除零,则不会引发异常。结果只返回0 编辑:这只适用于Cortex-A系列。正如Jose所指出的,Cortex-M系列中有一个用于整数除法的控制寄存器,如下所述的浮点除法。请参见他答案中的链接 对于浮点操

我试图生成一个运行时错误,比如ARM Cortex M3中的除以零。我不知道为什么当我生成被零除的错误系统时会正常工作。然而,价值似乎是“无限的”

ARM gcc编译器是否处理此类UsageFault错误?我还没有实现硬件异常处理程序,比如使用故障、总线故障或Mem管理。

与之相反,如果发生整数除零,则不会引发异常。结果只返回
0

编辑:这只适用于Cortex-A系列。正如Jose所指出的,Cortex-M系列中有一个用于整数除法的控制寄存器,如下所述的浮点除法。请参见他答案中的链接


对于浮点操作,浮点控制寄存器(
FPSCR
对于aarch32或
FPCR
对于aarch64)决定是否引发异常。如果在那里设置了相应的位,则会引发异常,否则只会在浮点状态寄存器中设置一个标志(aarch32中的
FPSCR
,或aarch64中的
FPSR
),该标志随后指示错误。该寄存器可通过
msr
设置,并通过
mrs
读取

如果未引发异常,则有以下规则:

  • infinity
    divided
    infinity
    is
    NaN
  • zero
    divided
    zero
    is
    NaN
  • 任何其他被除的
    无穷大
    都是
    ±零
  • ±无穷大
    中除
    以外的任何其他值(根据红利进行签名, 这就是你在截图中看到的情况)
  • 无限
    除此之外的任何东西都是
    ±无限
  • 除此之外的任何值都是
    ±零
请参阅ARM a64指令集体系结构中的
FDIV
伪代码


参考资料:

  • 在aarch64
  • 在aarch32

根据体系结构,行为有所不同。ARMv6-M不包含divide指令,所以它是管理这种情况的软件(或者从编译器的角度来看,它是UB)

在(ARMv7-M)上,情况有所不同,管理DIVBY0情况有一个例外