4

私は MIPS で特定のコードを書いていますが、結果を一時的に特殊レジスター (どちらも 4 バイト幅) に格納する必要があるところまで来ましHILO。これらの指示は自由に使用できます。

divu     s,t    lo <-- s div t ; hi <-- s mod t
multu    s,t    hi / lo < -- s * t ;

したがって、divu除算の結果を に格納しLO、剰余をHImultu格納し、乗算の結果をLO(下位 4 バイト) とHI(上位 4 バイト) に格納します。

HI後で、登録から結果を取得するLOには、次のことができます。

mfhi $v0
mflo $v1

計算結果を に保存する方法はすでにわかっていますLO

ori     $v0,$0,1            # Store result from $a0 into LO
divu    $a0,$v0
  • 除算の結果は LOにdivu格納されるので、結果を 1 で除算して取得します。

ただし、格納HIはより複雑です。multu1 つの方法は、値を 32 ビット (4 バイト) シフトする命令を強制することです。

multu    $a0,0x80000000     # Shift $a0 by 32 bits and store into HI/LO

しかし、その結果、 の値はHI本来あるべき場所の 1 ビット右になります (したがって、値が の場合は0100 1000HI含まれます0010 0100)。

HI何かをレジスタに保存する方法を知っている人はいますか?

4

3 に答える 3

7

Nils Pipenbrinckの回答を拡張したいと思います:

プログラマー向けの MIPS32 アーキテクチャーから

ムティ

フォーマット: MIPS32 (MIPS I)

  MTHI rs

目的: GPR を特別な目的の HI レジスタにコピーするには

Description: HI ← rs

GPR rs の内容は、特殊レジスター HI にロードされます。

制限:

DIV、DIVU、MULT、または MULTU によって HI/LO ペアに書き込まれた計算結果は、新しい結果が HI または LO に書き込まれる前に、MFHI または MFLO によって読み取られる必要があります。MTHI 命令がこれらの算術命令の 1 つに続いて実行されたが、MFLO または MFHI 命令の前に実行された場合、LO の内容は予測不能です。次の例は、この不正な状況を示しています。

 MUL       r2,r4   # start operation that will eventually write to HI,LO
 ...               # code not containing mfhi or mflo
 MTHI      r6
 ...               # code not containing mflo
                   # this mflo would get an UNPREDICTABLE value
 MFLO      r3

歴史的情報:

MIPS I-III では、先行する 2 つの命令のいずれかが MFHI である場合、その MFHI の結果は予測不能です。HI または LO 特殊レジスターの読み取りは、それらに書き込む後続の命令から 2 つ以上の命令で分離する必要があります。MIPS IV 以降 (MIPS32 および MIPS64 を含む) では、この制限はありません。

mtlo

フォーマット: MIPS32 (MIPS I)

    MTLO rs

目的: GPR を特殊目的の LO レジスターにコピーするには 説明:

 LO ← rs

GPR rs の内容は、特殊レジスター LO にロードされます。

制限: DIV、DIVU、MULT、または MULTU によって HI/LO ペアに書き込まれた計算結果は、新しい結果を HI または LO に書き込む前に、MFHI または MFLO によって読み取る必要があります。

MTLO 命令がこれらの算術命令の 1 つに続いて実行されたが、MFLO または MFHI 命令の前に実行された場合、HI の内容は予測不能です。次の例は、この不正な状況を示しています。

 MUL       r2,r4   # start operation that will eventually write to HI,LO
 ...               # code not containing mfhi or mflo
 MTLO      r6
 ...               # code not containing mfhi
                   # this mfhi would get an UNPREDICTABLE value
 MFHI      r3

歴史的情報:

MIPS I-III では、先行する 2 つの命令のいずれかが MFHI である場合、その MFHI の結果は予測不能です。HI または LO 特殊レジスターの読み取りは、それらに書き込む後続の命令から 2 つ以上の命令で分離する必要があります。MIPS IV 以降 (MIPS32 および MIPS64 を含む) では、この制限はありません。

于 2009-05-05T11:49:58.517 に答える
6

MIPS命令セットには、MFLO/MFHIに対応するものがあります。

それはMTLO/MTHIと呼ばれ、まさにあなたが望むことをします:

  mtlo $v0  # moves the contents of v0 into the lo-register
  mthi $v1  # moves the contents of v1 into the hi-register

これらの命令はまれであり、要約された命令セットリファレンスには含まれないことがよくあります。

ところで:LO / HI regに関連するレイテンシーと危険性については、プロセッサーのマニュアルを必ず確認してください。これらは非常に特殊であり、コードは書き込みと読み取りの間に少なくとも3サイクル待機する必要がある場合があります。残念ながら、この動作は、作業しているCPUによって異なります。

これを間違えることは、意欲的なMIPSプログラマーにとってよくある落とし穴です:-)

于 2009-05-05T10:31:22.853 に答える
1

multu/divu の 2 番目の引数として使用すると、他にどのような極端な値を使用すると興味深い結果が得られるかを考えてみてください (これは宿題の質問のように見えるので、意図的にあいまいにしています)。

于 2009-05-05T10:30:51.047 に答える