1. ホーム
  2. assembly

[解決済み] MIPS srlを変数で指定

2022-02-10 01:32:47

質問事項

いろいろと検索してみたのですが、なかなか答えが見つかりません。おそらく、どのように表現したらいいのかよく分からないからだと思います。

次のようなコードであれば

for (i = 0; i < 10; i++) {
    x = y >> i
    ...
}

y >> i 命令を別のループを使わずに実装する方法はありますか?

うまくいかないと思いますが、iの値が$s1に格納されていたとすると、次のようなことをします。

srl $t3, $s5, $s1

というのは、$t3 に $s5 の値をセットして、このステートメントを何度もループさせなければならないからです。

srl $t3, $t3, 1

ご理解いただけたでしょうか?

基本的には、forループで毎回y * 2^-iが必要です。

何か参考になることがあれば、あるいは、これは重複した質問だから、それを恥ずかしげもなく読んで答えが出るというようなベリテーションでもいいので、よろしくお願いします。

解決方法は?

その MIPS32™ アーキテクチャ プログラマ向け 第2巻:MIPS32™命令セット には、以下のシフト命令が記載されています。

  • SLL シフトワード左ロジカル
  • SLLV Shift Word Left 論理変数
  • SRA 右シフト算術演算
  • SRAV 右シフト算術変数
  • SRL 右シフトロジック
  • SRLV Shift Word Right Logical Variable(論理変数

を持つものが注目されます。 可変 を名前に持ち、以下のように動作します。

SLLV rd, rt, rs :  rd ← rt << rs
SRAV rd, rt, rs :  rd ← rt >> rs (arithmetic)
SRLV rd, rt, rs :  rd ← rt >> rs (logical)

の下位5ビットのみです。 rs を使用するため、0~31の範囲でシフト量を指定できます。