1. ホーム
  2. assembly

[解決済み] MIPs Assemblyでsllなどを使ってビットをずらすのはなぜですか?

2022-01-29 10:55:39

質問内容

を読んで、sllというコマンドが何をやっているのか、なんとなく理解できました。 これ というのは、すべてのビットを1ずつ左にシフトしているだけだからです。

授業で出た課題で、その例があるのですが・・・。 s6と$s7は配列のベースアドレスで、$s1/$s2は単なる変数です。

sll $t0, $s0, 2
add $t0, $s6, $t0
sll $t1, $s1, 2
add $t1, $s7, $t1
...

なぜビットをずらすのか?簡単に言うと何をしているのでしょうか?最初に考えたのは、配列内の変数のインデックス付けと関係があるのでは...ということです。

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

<ブロッククオート

すべてのビットを1ずつ左にシフトしていくだけです。

見せられた例は、1ビットずつシフトするものでした。その sll 命令は1ビットずつシフトするだけでなく、0〜31の範囲でシフト量を指定することができます(0ずつのシフトは無駄と思われるかもしれませんが SLL $zero, $zero, 0 をエンコードするために使用されます。 NOP MIPSの場合)。

論理的な左シフト によって N ビットを乗算する高速な方法として使用できます。 2^N (2のN乗)である。そのため、命令 sll $t0, $s0, 2 を乗算しています。 $s0 を 4 (2^2) で割って書き戻すと $t0 . これは,ワード配列にアクセスする際にオフセットをスケーリングする場合などに便利です.