我正在尝试通过学习MIPS Assembly Language Programming来学习MIPS汇编。在本书中,我有这段代码(摘自本书第37页):
.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
,但是当我尝试汇编代码时,我遇到了一些错误
ubuntu @ eeepc:〜/ Desktop $ mips-elf-as test-mips.asm
test-mips.asm:汇编程序消息:
test-mips.asm:8:错误:非法操作数'li'
test-mips.asm:9:错误:非法操作数'la'
test-mips.asm:12:错误:非法操作数'li' test-mips.asm:14:错误:非法操作数'beqz'
test-mips.asm:15:错误:非法操作数'移动'
test-mips.asm:16:错误:非法操作数'li' test-mips.asm:22:错误:非法操作数'li' test-mips.asm:23:错误:非法操作数'la'
test-mips.asm:26:错误:非法操作数'li'
ubuntu的@的EeePC:〜/桌面$
我正在使用x86 Ubuntu Hardy Herron交叉编译为MIPS
有什么问题?
答案 0 :(得分:4)
嗯,li
和la
指令是伪指令,应该被汇编程序识别,但是你的环境可能需要做一些事情来定义它们(它不会如果它们是宏,我会感到惊讶。
尝试将它们更改为“真实”形式:
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-BITS
和AND
的任何内容。
我从未见过的ls
指令。你确定这不是la
的拼写错误吗?我认为beqz
应为beq
。大多数CPU会以不同的方式使用相同的指令,例如,将寄存器递减到零(z)和将寄存器与某事物(eq)进行比较会设置零标志。
ls
,beqz
或move
都不会显示在MIPS assembler Wikipedia page中,尽管后两者在Patterson & Hennessy中列为伪指令。
所以它看起来越来越像你需要做一些额外的设置来使伪指令工作。
答案 1 :(得分:3)
我认为问题在于您使用的是旧版本的binutils,它不支持MIPS寄存器的符号名称。
binutils 2.17(在您链接到的交叉编译说明中引用)不理解$v0
,$a0
等。(请参阅this question)。
但是,如果您自己构建工具,一个好的解决方案是转移到更高版本的binutils:从2.18开始的版本 do 支持符号寄存器名称。您的示例使用2.18或最新版本2.20。
正确汇编答案 2 :(得分:0)
我认为这是你的li和la的列表序列,除非你加载一个地址,你不能立即加载并告诉$ v0保持你想要出现的字符串..尝试把la放在第一个之前li在每种情况下......以及伪指令,是的,这也可能是问题,但我的建议值得一试。