2013-05-19 37 views
0

我的問題是關於我應該如何避免使用僞指令,如lali。許多互聯網資源只是使用僞指令,這在某種程度上讓我感到困惑。 我的問題的一部分是這段代碼出了什麼問題。模擬器在liu指令中發現語法錯誤,我不明白髮生了什麼問題。MIPS繞過使用僞指令,出了什麼問題?

根據我的理解,liu命令抓取有效位,向左移位16位,並將其放入寄存器($ a0)。 ori指令獲取標籤,並在低16位上執行或操作,將其有效地添加到寄存器中。

 .data 
m1: .asciiz "Some string" 

     .text 
main: 
     lui  $a0, m1  # loads m1 into $a0 to be printed 
     ori  $a0, $a0, m1 

我不是應該使用liuori標籤M1?如果我不是這個意思,我該怎麼做?

我已經讀過this,我明白了什麼是應該發生的事情,但我仍然不知道,爲什麼我的指令具有不同的效果,爲什麼還有就是liuori命令前andi $a0,$a0,0x0000ffff

我使用的MIPS模擬器是QtSpim,如果這是相關的。 我已經在這裏和其他地方尋找這個問題的答案,我沒有理解他們。 任何幫助/更正將是美好的。

回答

2

不幸的是,引用的答案中的代碼不正確。 它應該是:

lui $a0, m1 >> 16 
ori $a0, $a0, m1 & 0xffff 

與唯一的問題是,SPIM似乎並不支持這些運營商在標籤上。

無論如何,邏輯是你必須將32位地址分成兩半,並分別加載它們。向右移16將會給您提供前16位(移位將在運行時被lui反轉),而使用0xffff進行屏蔽則會提供最低16位。

GNU彙編程序有特殊的支持功能%hi%lo來獲得高和低的一半。有了它們,您可以編寫如下等效代碼:

lui  $a0, %hi(m1)  # loads m1 into $a0 to be printed 
ori  $a0, $a0, %lo(m1) 
+0

感謝您的幫助!你已經清除了錯誤,並以簡單的方式解釋了邏輯! – SamSam