Case语句代码在Mars模拟器中运行但QtSpim

时间:2016-03-19 03:05:23

标签: assembly mips

因为标题提到我已经在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

1 个答案:

答案 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