2010-01-28 16 views
2

我想通過學習MIPS Assembly Language Programming學習MIPS大會。在本書中,我有這樣的代碼(從書的第37頁中提取):初級錯誤在當編譯MIPS彙編源

.data 
prompt: .asciiz "\n Please Input a Value: " 
bye: .asciiz "\n Bye!" 
.globl main 
.text 

main: 
    li $v0, 4 
    la $a0, prompt 
    syscall 

    li $v0, 5 
    syscall 
    beqz $v0, end 
    move $a0, $v0 
    li $v0, 1 
    syscall 
    b main 


end: 
    li $v0, 4 
    la $a0, bye 
    syscall 

    li $v0, 10 
    syscall 

我有一個cross-compiled binutils針對mips-elf,但是當我試圖組裝的代碼,我得到了一些錯誤

[email protected]:~/Desktop$ mips-elf-as test-mips.asm
test-mips.asm: Assembler messages:
test-mips.asm:8: Error: illegal operands 'li'
test-mips.asm:9: Error: illegal operands 'la'
test-mips.asm:12: Error: illegal operands 'li'
test-mips.asm:14: Error: illegal operands 'beqz'
test-mips.asm:15: Error: illegal operands 'move'
test-mips.asm:16: Error: illegal operands 'li'
test-mips.asm:22: Error: illegal operands 'li'
test-mips.asm:23: Error: illegal operands 'la'
test-mips.asm:26: Error: illegal operands 'li'
[email protected]:~/Desktop$

我使用Ubuntu的86哈迪赫倫交叉編譯成MIPS

有什麼不對?

+0

你能在這裏看到我的問題http:// stackoverflow。com/questions/9403667/mips-hex-output/9403758#comment11954218_9403758並提供有關將上面的.s程序集文件轉換爲目標文件的過程的響應?謝謝 – NickHalden 2012-02-26 05:41:48

回答

3

我認爲問題是,你正在使用的不支持MIPS寄存器中的符號名的binutils的舊版本。

binutils 2.17(如您所鏈接的交叉編譯說明中所提及的)不瞭解$v0$a0等(請參閱this question)。但是,如果你自己在構建工具,一個好的解決方案是轉移到更高版本的binutils:從2.18開始的版本支持符號寄存器名稱。您的示例可以使用2.18或最新版本2.20正確組裝。

+1

好抓!所有失敗的指令都有$ v0/$ a0類型的操作數(除了第一個'la'有點奇怪之外),並且錯誤指定了操作數,儘管顯示了_opcodes_(這是拋棄我的東西)。 +1。 – paxdiablo 2010-01-28 23:30:23

+0

原來第一個'la'可能是_did_有錯誤。在原始問題中拼寫錯誤'ls',錯誤輸出在更改時錯誤地更新('ls'錯誤被刪除,但沒有放入'la'錯誤,我猜測)。我修改了這個問題,以便爲該改變的行插入實際的錯誤輸出(所以這個問題更有意義)。 – paxdiablo 2010-02-01 10:52:28

4

那麼,lila說明其由彙編識別僞指令,但它可能是您的環境需要做些什麼來定義它們(如果他們是宏它不會讓我感到吃驚)。

嘗試他們改變他們的 「真實」 的形式:

li $v0,4 --> lui $v0,0;  ori $v0,$v0,4 
la $a0,bye --> lui $a0,bye>>16; ori $a0,$a0,bye&ffff 

或任何你特別MIPS彙編器使用的RIGHT-SHIFT-16-BITSAND

ls指令我以前從來沒見過。你確定這不是la的拼寫錯誤嗎?我認爲beqz應該是beq。大多數的CPU將使用相同的指令以不同的方式,一個例子是,無論遞減寄存器下降到零(Z)比較的東西(當量)寄存器將設置零標誌。

lsbeqzmove無在MIPS assembler Wikipedia page顯示雖然後兩種在Patterson & Hennessy列爲僞指令。

所以它看起來越來越像有一些額外的設置了,你需要做的就是僞指令工作。

+0

對不起'ls',這只是我的錯誤。 – 2010-01-28 02:46:57

+0

如果我試圖改變,我只是有更多'非法operands'錯誤,但現在用'lui'和'ori'。 – 2010-01-28 02:49:56

+0

看看那本書的頁面,代碼就是這樣。現在我已經複製並粘貼了。 – 2010-01-28 02:53:09

0

我認爲這是你的Li和洛杉磯,除非你加載地址,您不能加載立即告訴$ V0扶住你要顯示的字符串的上市序列..嘗試把洛杉磯第一在任何情況下李先生......以及僞指令,是的,這也可能是問題,但我的建議值得一試。