このコードの例:
#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(ロードアドレス)が実際に何を意味するのか、非常に混乱しています。
どちらも(ほとんど)即時値のロードに使用されるため、これらはかなり似ています。どちらもpseudo-instructionsなので、実際にどのように機能するかを決定するのをサポートするのは、各アセンブラ次第です。
li
はLoad Immediateの略で、最大32ビットのサイズを即時にロードする便利な方法です。 addi
やori
などの命令は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
を常に使用して整数定数をロードすると、他の人々はあなたのコードを奇妙に見えるかもしれません。