2016-05-20 6 views
0

私はMIPSにはかなり新しく、次の2つのアセンブリ命令の違いと目的を理解しようとしています。プログラムの最初に、私は宣言:mips .wordの機能と2つのコードの違い

.data 
    msg:  .word msg_data 
    msg_data: .asciiz "Hello world" 
次の作品の両方の主な機能で

ので、しかしそれぞれの目的は何ですか?

la $t0, msg 
lw $a0, 0($t0) 
li $v0, 4 
syscall 

、他方は:MIPSで

la $a0, msg_data 
li $v0, 4 
syscall 
+0

最初のポインタはメモリからポインタをロードします。ポインタはどこにでも置くことができ、変更可能です。2番目のポインタは文字列のアドレスを直接受け取ります。 – Jester

答えて

0

、データへのポインタのサイズは通常32ビット、.wordあります。さらに、MIPSでは、データそのもののタイプ(サイズ)に応じてdata is aligned to certain addressesが必要です。

まずあなたがあなたのプログラムの.dataセクションで宣言ポインタとデータを見てみましょう:

msg:  .word msg_data  ; Declare a pointer: use the address of msg_data as value for msg 
msg_data: .asciiz "Hello world" ; Declare a zero-terminated string in memory 

msgmsg_dataラベルまたはシンボリック名あなたのデータのための考えることができ、あなたが使用することができますこれらのラベルはコード内でデータを参照します。

あなたの文字列にポインタをロードする2つの異なる方法があります。最初の方法は間接である:またlui/ori命令対のために、la pseudo-instructionでマクロを見てとることが

la $a0, msg_data ; Load the address of 'msg_data' into $a0 

la $t0, msg ; Load address of .word 'msg' into $t0 
lw $a0, 0($t0) ; Load pointer from address in $t0+0, this loads the pointer stored in 'msg' which is the address of 'msg_data' 

第二の方法は、直接文字列のアドレスをロードすることです32ビットの即値をレジスタにロードするために使用されます。その即値は住所ラベルの住所で、laとなります。つまり、の住所はです。

関連する問題