1. ホーム
  2. assembly

[解決済み] MIPSのオペコードにおけるlaとliの違いは何ですか?

2022-03-01 08:33:43

質問

例えば、このコードでは:

#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 (ロードアドレス)の本当の意味。

どのように解決するのですか?

どちらも即時値を読み込むために(ほとんど)使用されるため、かなり似ています。また、どちらも 擬似インストラクション そのため、どのように機能させるかは、サポートしている各アセンブラに委ねられます。


li はロードイミディエイトの略で、最大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 は整数定数を読み込むために常に使用します。