3

我正在尝试通过学习MIPS Assembly Language Programming来学习 MIPS Assembly 。在书中我有这个代码(摘自本书的第 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

我有一个针对的交叉编译的 binutilsmips-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:错误:非法操作数' move'
test-mips.asm:16:错误:非法操作数 'li'
test-mips.asm:22:错误:非法操作数 'li'
test-mips.asm:23:错误:非法操作数 'la'
test-mips .asm:26: 错误:非法操作数 'li'
ubuntu@eeepc:~/Desktop$

我正在使用 x86 Ubuntu Hardy Herron 交叉编译为 MIPS

怎么了?

4

3 回答 3

4

好吧,liandla指令是应该被汇编器识别的伪指令,但是您的环境可能需要做一些事情来定义它们(如果它们是宏,我不会感到惊讶)。

尝试将它们更改为“真实”形式:

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)并将寄存器与某物 (eq) 进行比较都会设置零标志。

没有lsbeqz也没有move出现在MIPS 汇编器 Wikipedia 页面中,尽管后两者在Patterson & Hennessy中被列为伪指令。

所以它看起来越来越像你需要做一些额外的设置才能让伪指令工作。

于 2010-01-28T02:37:20.303 回答
3

我认为问题在于您使用的是旧版本的 binutils,它不支持 MIPS 寄存器的符号名称。

binutils 2.17(如您链接到的交叉编译说明中所引用)不理解$v0$a0(请参阅此问题)。

但是,如果您自己构建工具,一个好的解决方案是迁移到更高版本的 binutils:从 2.18 开始的版本确实支持符号寄存器名称。您的示例与 2.18 或最新版本 2.20 正确组装。

于 2010-01-28T22:27:12.850 回答
0

我认为这是你列出 li 和 la 的顺序,除非你加载一个地址,否则你不能立即加载并告诉 $v0 保留你想要出现的字符串.. 尝试将 la 放在每个 li 之前案例......以及伪指令,是的,这也可能是问题,但我的建议值得一试。

于 2012-01-17T20:32:15.917 回答