1. ホーム
  2. assembly

[解決済み] ARMはSDIVとUDIVを区別していますが、ADD、SUB、MULでは区別していないのはなぜですか?

2022-02-15 12:27:47

質問

タイトルにあるように、ARM命令セットでは、なぜ除算時のみ符号付きと符号なしを区別しているのでしょうか?

SDIVとUDIVは使えますが、ADD、SUB、MULはそうではありません。

どのように解決するのですか?

同じ大きさの符号付き数と符号なし数の加算と減算は、(ARMが採用している)2の補数演算では全く同じビットパターンになるので、別の命令は必要ありません。例えば、バイトサイズの値を取る場合です。

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 :

符号付きおよび符号なし Long Multiply、オプションでAccumulate。 32 ビットのオペランドと 64 ビットの結果およびアキュムレータ。