我正在尝试使用以下方法进行乘法运算时检查有符号溢出...
muls r0, r1, r0
blvs overflow
如果发生溢出,哪些会分支并打印溢出错误消息。例如,如果以下输入为r1 = 1,000,000,000且r0 = 3,则输出为-64,771,072,但溢出的分支永远不会完成,为什么会这样?
答案 0 :(得分:1)
只是乘法指令will never set the overflow flag。 MULS
只会恰当地设置N和Z标记,并且不会触及C或V(除非您使用真正的古代,否则会被无意义的废话覆盖)。
如果结果的重要部分很重要,您可能需要考虑使用UMULL
/ SMULL
。
答案 1 :(得分:1)
在ALU / APSR中只有一个位来保存溢出(另一个用于进位),并且这些被设置为添加或减去算术的副作用,因为CPU意识到它会溢出。因此,在乘法的情况下,那些不会被设定。
ARM Connected Community上有一篇很好的博客文章,标题为Detecting Overflow from MUL,它实际上提出了如何通过其他方式检测溢出。