2

$a0 の $a1 乗を見つけるために使用される次のサブルーチンがあります。小さな整数では問題なく動作しますが、1000^6 のような値でも動作するようにしたいと考えています。$v1 に乗算用の hi レジスタを格納すればよいと考えていました。

だから私の主な質問は、「1 つが 32 ビットより大きい 2 つの整数をどのように乗算するのですか?」ということだと思います。

pow:
  li    $v0, 1
pow_loop:
  ble   $a1, $zero, pow_conclude
  mult  $v0, $a0
  mflo  $v0
  addi  $a1, $a1, -1
  j     pow_loop
pow_conclude:
  jr    $ra
4

2 に答える 2

2

Ben Jackson の回答を読んだ後、私はこれを書き、MARS で確認しました。

pow:
  li    $v0, 1
  li    $v1, 0
pow_loop:
  ble   $a1, $zero, pow_conclude
  mult  $v1, $a0
  mflo  $v1
  mult  $v0, $a0
  mflo  $v0
  mfhi  $t0
  add   $v1, $v1, $t0
  addi  $a1, $a1, -1
  j     pow_loop
pow_conclude:
  jr    $ra
于 2012-11-27T15:49:38.063 に答える
1

学校で紙の上の数字をどのように掛けたかを思い出してください。入力を 16 ビットまたは 32 ビットのコンポーネントに分割し、すべての部分積を乗算して加算し、キャリー チェーンを考慮します。

MIPSを知らなくても、@ russjohnson09の自己回答に基づいています:

$a0ここで (とから) 32*64 ビットを実行していると仮定すると$v0,v1、結果は 96 ビットになります。このようなもの:

  mult  $v0, $a0
  mflo  $v0
  mfhi  $v2
  mult  $v1, $a0
  mflo  $v1
  add   $v1,$v1,$v2

96 の上位 32 ビットは、2 番目addの.mfhimult

于 2012-11-27T15:37:58.233 に答える