【问题标题】:Beginner Errors On When Compiling a MIPS Assembly Source编译 MIPS 程序集源时出现初学者错误
【发布时间】:2010-01-28 01:48:32
【问题描述】:

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

我有一个针对mips-elfcross-compiled binutils,但是当我尝试汇编代码时,出现了一些错误

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:~/Desktop$

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

怎么了?

【问题讨论】:

标签: assembly mips


【解决方案1】:

好吧,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 中被列为伪指令。

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

【讨论】:

  • 对不起ls,这只是我的错误。
  • 如果我尝试更改,我只会收到更多 illegal operands 错误,但现在出现 luiori
  • 看那本书的页面,代码是这样的。现在我已经复制并粘贴了。
  • 对不起,@Nathan,这就是我的帮助范围。如果是在抱怨lui,那不是伪指令问题。基本上,在那里工作的唯一指令是 syscall 和 b。我很想认为它是用于不同 CPU 的汇编程序,但事实并非如此。
  • 感谢朋友的帮助。我将等待可以帮助我的人。
【解决方案2】:

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

binutils 2.17(在您链接到的交叉编译说明中引用)不理解$v0$a0 等(请参阅this question)。

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

【讨论】:

  • 好收获!所有失败的指令都有 $v0/$a0 类型的操作数(除了第一个'la'有点奇怪)并且错误指定了操作数,尽管显示了 opcodes (这就是把我扔了)。 +1。
  • 原来第一个la 可能确实有错误。它在原始问题中拼写错误ls,并且错误输出在更改时未正确更新(ls 错误已删除,但la 错误未输入,我猜)。我已经修改了问题,以便为该更改的行插入实际的错误输出(所以这个问题更有意义)。
【解决方案3】:

我认为这是您列出 li 和 la 的顺序,除非您加载地址,否则您无法立即加载并告诉 $v0 保留您要出现的字符串.. 尝试将 la 先放在前面li 在每种情况下...以及伪指令,是的,这也可能是问题,但我的建议值得一试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 2012-05-29
    • 2012-10-19
    相关资源
    最近更新 更多