【问题标题】: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 位结果和累加器。

【讨论】: