2016-09-25 331 views
0

我這裏有兩個問題:MIPS「LA」僞指令裝載文字的地址

1)>什麼是線2.「拉」僞指令發生的事情,而不是字面指加載地址,「3444 '應該有一個label.How它可以加載文字的地址

2)>如果你用「li $ a0 3444」替換第3行,它將3444加載到寄存器#a0而不是地址。輸出仍然是一樣的。我想問的是,系統調用如何知道在#a0中是變量的地址還是變量本身。打印整數的子程序如何正確工作,無論參數存儲在# a0是地址或整數值itse如果。

.text 

     li $v0 1 
>>2 la $a0 3444 # When i replace 3444 literal with the label 'anint' it makes sense and the output of course is the same 
     syscall 


.data 

anint: .word 3444 

輸出:

3444 

更新#2:我could'nt張貼在評論這樣的代碼...

IF LA(加載地址)和李(負載即時)都轉換爲相同的指令,即將文字加載到#a0中,然後從下面的代碼段中解釋第3行。

 .text 


     li #v0 4 
>>3 la #a0 msg #This loads the address of the label 'msg in #a0' not the label itself  
     syscall 





     .data 

     msg: .asciiz "This is a long string that can't be saved in the register!" 
+0

無論如何,您不應該嘗試在註釋中張貼代碼。編輯澄清到你的答案是正確的事情要做。 –

+0

標籤是地址。它們不是「存儲」在任何地方,它們只是象徵性地寫地址而不是數字地址的有用方法。 –

回答

2

怎麼能系統調用知道,在#A0是變量或者不變量本身

的地址。 SPIM/MARS中的系統調用1始終打印$a0中的

li $a0,3444la $a0,3444被翻譯成相同的事情(一些指令加載值3334到寄存器$a0,如ori $a0, $0, 3334)。

+0

請參考我的問題上的更新。您的答案似乎與我已更新的內容相沖突。 –

+0

沒有。標籤_是一個地址(以及某個地址的符號名稱)。 – Michael

+0

衝突的部分位於更新代碼段的第3行,根據您的語句「la#a0 msg」加載寄存器#a0內的值,這是不可能的,因爲字符串值太大...相反,在#a0中的字符串的地址。您的答案似乎符合我原來的問題,但在這種情況下衝突 –