因为标题提到我已经在Mars MIPS模拟器中编写了这段代码,并且组装和运行代码工作正常,没有错误。当我将相同的文件带到QtSpim并在那里运行时,我收到以下错误:
Instruction references undefined symbol at 0x00400014 [0x00400014] 0x0c000000 jal 0x00000000 [main] ; 188: jal main
似乎QtSpim在调用CASE
的标签地址时遇到问题,而且我没有足够的经验来查看原因。这是我的代码:
.data
jumptable: .word isD, is1, is2, is3, is4
currentvalue: .asciiz "Returned : i = " #Used for result output
space: .asciiz " \n" #Used for result output
.text
MAIN:
li $a0, 0 #testing use of the argument register toholdinput
jal CASE #set $ra and go to the case procedure
li $v0, 4 #load syscall 4 to print text
la $a0, currentvalue #load the string value of currentvalue into $a0
syscall #print out currentvalue
li $v0, 1 #load syscall 1 to print integer
move $a0, $t3 #move the contents of $t3 to $a0
syscall #print the integer in $a0
li $v0, 10 #load syscall 10 to exit program
syscall #exit program
CASE:
la $t3, ($a0) #load 'i' into a temporary value since we will be using $a0 for syscalls shortly
blt $a0, 1, isD #jump to default if i less than 1
bgt $a0, 4, isD #jump to default if i greater than 4
sll $t0, $a0, 2 #multiplies 'i' by 2^2
la $t1, jumptable #load the base address of the jump table into $t1
add $t1, $t1, $t0 #$t1 = $t1(base address of table) + $t0('i' * 4)
lw $t2, ($t1) #$t2 is loaded with the address of label found in $t1
jr $t2
is1:
addi $t3, $t3, 1 #increment 'i' by 1
jr $ra #jump back to the return address in main
is2:
addi $t3, $t3, 2 #increment 'i' by 2
jr $ra #jump back to the return address in main
is3:
addi $t3, $t3, 3 #increment 'i' by 3
jr $ra #jump back to the return address in main
is4:
addi $t3, $t3, 4 #increment 'i' by 4
jr $ra #jump back to the return address in main
isD:
li $t0, 0 #set 'i' to 0
jr $ra #jump back to the return address in main
答案 0 :(得分:0)
好的,我想我已经弄明白了。 (警告:我只有火星)
在错误消息中,错误来自第188行,因此 不是程序的一部分。它是spim
的{{1}}电话代码的一部分。
要定义main
函数,必须为[小写] 和全局:
main
上述.globl main
main:
和mars
都未识别您的spim
。如果MAIN:
无法找到主要内容,则会在mars
部分的最低地址启动该程序。然而,.text
只是抱怨。
<强>更新强>
另一方面,如果你有机会,我现在正在学习MIPS,按照我的评论,我的代码中的所有内容都会出现吗?
我做了我的代码审查版本,这意味着我注释了源代码并清理了一些东西,直到我理解了正在发生的事情。在您的情况下,这只是编辑一些评论。我确实在这个过程中发现了一个小的[一行]错误,我在下面带注释的代码中修复了这个错误。
你为自己所处的舞台做了很好的评论。一些OP发布asm没有任何评论。好的评论[用任何语言]都应该显示 intent 。也就是说,你打算让你的程序在给定的点上做什么(&#34; what / why&#34;)。实际的asm指令是&#34; how&#34;。
正如您所做,我建议对大多数asm说明进行侧栏评论。我还建议在函数上方添加注释块。
我清理了你的评论,就像我为自己做的那样,其中一些像是:
spim
当你学习asm时,有时你必须这样做才能记住给定的asm指令的作用。但是,它们会妨碍您遵循程序的流程/逻辑。所以,我将那些注释为&#34; LEARNER&#34;下面[最终,你会删除或缩短自己]并用我可能做/建议的东西取代侧边栏。
此外,可以假设asm程序员至少熟悉一种高级语言,因此您可以使用x = 23; // set the value of x to twenty three
或i < 1
等的评论。
为了加快测试速度,我还为i += 3
的参数添加了用户提示。
无论如何,这里有注释来源[请原谅无偿风格的清理]:
case