【问题标题】:Why does ARM distinguish between SDIV and UDIV but not with ADD, SUB and MUL?为什么ARM区分SDIV和UDIV而不区分ADD、SUB和MUL?
【发布时间】:2025-12-01 15:00:01
【问题描述】:
如标题所述,为什么ARM指令集只在除法上区分有符号和无符号?
SDIV 和 UDIV 可用,但 ADD、SUB 和 MUL 不可用。
【问题讨论】:
标签:
assembly
binary
arm
division
instruction-set
【解决方案1】:
相同大小的有符号数和无符号数的加法和减法在二进制补码数学(ARM 使用)中产生完全相同的位模式,因此不需要单独的指令。
例如,如果我们采用字节大小的值:
0xFC +4
signed: -4+4 = 0
unsigned: 252 +4 = 256 = 0x100 = 0x00 (truncated to byte)
乘法结果会根据操作数被解释为有符号还是无符号而改变,但是MUL 指令只产生结果的低 32 位,这两种情况是相同的。
在最近的 ARM 处理器中,有一些指令可以产生完整的 64 位结果,并且这些指令成对出现,就像 SDIV 和 UDIV:
UMULL, UMLAL, SSMULL, SMLAL:
有符号和无符号长乘法,可选累加,有
32 位操作数,64 位结果和累加器。