编译MIPS汇编源时的初学者错误

时间:2010-01-28 01:48:33

标签: assembly mips

我正在尝试通过学习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

有什么问题?

3 个答案:

答案 0 :(得分: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)将寄存器与某事物(eq)进行比较会设置零标志。

lsbeqzmove都不会显示在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在每种情况下......以及伪指令,是的,这也可能是问题,但我的建议值得一试。