检查溢出
Checking for overflow
我目前正在尝试使用以下方法在执行乘法运算时检查是否有符号溢出...
muls r0, r1, r0
blvs overflow
如果发生溢出,它会分支并打印溢出错误消息。例如,如果以下输入为 r1 = 1,000,000,000 且 r0 = 3,则输出为 -64,771,072,但溢出分支从未完成,这是为什么呢?
就是乘法指令will never set the overflow flag。 MULS
只会适当地设置 N 和 Z 标志,而不会触及 C 或 V(除非你在某些 真正 古老的东西上,在那里它们被无意义的废话覆盖) .
如果结果的有效位很重要,您可能需要考虑改用 UMULL
/SMULL
。
在 ALU / APSR 中只有一位用于保存溢出(另一位用于进位),这些被设置为加法或减法运算的副作用,而不是因为 CPU 意识到它会溢出。所以在乘法的情况下,那些不会被设置。
ARM Connected Community 上有一个不错的博客 post,标题为 Detecting Overflow from MUL,它实际上提出了如何通过其他方式检测溢出。
我目前正在尝试使用以下方法在执行乘法运算时检查是否有符号溢出...
muls r0, r1, r0
blvs overflow
如果发生溢出,它会分支并打印溢出错误消息。例如,如果以下输入为 r1 = 1,000,000,000 且 r0 = 3,则输出为 -64,771,072,但溢出分支从未完成,这是为什么呢?
就是乘法指令will never set the overflow flag。 MULS
只会适当地设置 N 和 Z 标志,而不会触及 C 或 V(除非你在某些 真正 古老的东西上,在那里它们被无意义的废话覆盖) .
如果结果的有效位很重要,您可能需要考虑改用 UMULL
/SMULL
。
在 ALU / APSR 中只有一位用于保存溢出(另一位用于进位),这些被设置为加法或减法运算的副作用,而不是因为 CPU 意识到它会溢出。所以在乘法的情况下,那些不会被设置。
ARM Connected Community 上有一个不错的博客 post,标题为 Detecting Overflow from MUL,它实际上提出了如何通过其他方式检测溢出。