それが何であるかを調査した結果、同じ結果を得るための方法を単に置き換えていることがわかりました。間違っていたら訂正してください。
例:
move $s0, $t1
次のように置き換えることができます:
add $s0, $zero, $t1
質問:
lw
、la
、sw
、 をどのように置き換えることができますbne
か?
それが何であるかを調査した結果、同じ結果を得るための方法を単に置き換えていることがわかりました。間違っていたら訂正してください。
例:
move $s0, $t1
次のように置き換えることができます:
add $s0, $zero, $t1
質問:
lw
、la
、sw
、 をどのように置き換えることができますbne
か?
はい、move
命令は命令に置き換えることができadd
ます。
擬似命令の背景: MIPS は RISC (Reduced Instruction Set Computer) アーキテクチャです。つまり、使用できる命令の数が比較的少ないことを意味します。この単純さによりパフォーマンスが向上しますが、より複雑な操作には複数の命令が必要になるというトレードオフがあります。疑似命令は、1 つ以上の他のより複雑な操作を表す「偽の」命令です。
あなたの質問に:
lw
、sw
、およびbne
は疑似命令ではありません。それらはすべて、1 つの MIPS アセンブリ命令によって実行されます。
la
、またはロードアドレスは、疑似命令です。命令と命令la
に分けることができます。32 ビット MIPS アーキテクチャでは、各命令と各レジスタのサイズは 32 ビットです。したがって、32 ビット アドレスを格納するには、最初に最上位 (上位) 16 ビットを取得し、次に最下位 (下位) 16 ビットを取得する必要があります。lui
ori
、lui
または Load Upper Immediate は、即値フィールドを取り、それを左に 16 回シフトして、一時的なアセンブラ レジスタに格納します。このori
命令は、一時レジスタと即値に対してビット単位の OR を実行し、la
命令で指定された初期レジスタに完全なアドレスを格納します。
編集:たとえば、文字列のアドレスを取得するには、関数で次のコード セグメントを使用できます。
la $a0, msg # pseudo-instruction to load the address of the label str
msg
また、別の場所で次のように定義することもできます。
.data
msg: .asciiz "This is a string"
この例を SPIM で実行すると、la
命令は次のように変換されます。
lui $1, 4097 [msg]
ori $4, $1, 0 [msg]
$1
一時的なアセンブラレジスタであり、最初の命令に渡された引数であった$4
レジスタです。a0
la
参考文献: MIPS 命令セットと、多くの MIPS の実行から。QTSPIMなどのシミュレーターで各命令を実行してみて、何が得られるかを確認してください。