web-dev-qa-db-ja.com

MIPSのオペコードのlaとliの違いは何ですか?

このコードの例:

#display message
li $v0, 4
la $a0, Message


#promt user to enter name
li $v0, 8 
la $10, username
li $a1, 20
syscall

#display the name
li $v0, 4
la $a0, userName
syscall

Li(即時ロード)とla(ロードアドレス)が実際に何を意味するのか、非常に混乱しています。

2
Mehr s.

どちらも(ほとんど)即時値のロードに使用されるため、これらはかなり似ています。どちらもpseudo-instructionsなので、実際にどのように機能するかを決定するのをサポートするのは、各アセンブラ次第です。


liはLoad Immediateの略で、最大32ビットのサイズを即時にロードする便利な方法です。 addioriなどの命令は16ビットの即値のみをエンコードできるため、アセンブラはliを複数の命令に変換する場合があります。

たとえば、_li $t0,0x12345678_は次のようになります。

_lui $at, 0x1234 
ori $t0, $at, 0x5678        
_

したがって、これは、これら2つの命令を記述せずに、アセンブラがそれを実行できるようにするための方法にすぎません。

理由は本当にありません。 _li $t0, Message_はラベルも即値なのでサポートされませんが、一部のアセンブラはliのラベルを受け入れない場合があります。


laはロードアドレスを表します。 liのように整数定数をロードするために使用できます。 _la $t0,0x1234678_。ただし、ラベル(_la $t0, Message # t0 = address of Message_)でも機能します。
アセンブラによっては、la $t0, 8($t1) # t0 = t1 + 8のようなこともできる場合があります。


liを使用する場合とlaを使用する場合は、コンテキストによって異なります。ロードする値がアドレスとして使用される場合、通常はlaを使用してロードし、そうでない場合は通常liを使用します。それらは部分的に交換可能であるため、それは実際にあなた次第ですが、laを常に使用して整数定数をロードすると、他の人々はあなたのコードを奇妙に見えるかもしれません。

12
Michael