MIPS(裸模式)字符串不会打印

时间:2015-10-08 04:59:08

标签: string mips spim mars-simulator bare

最近在大学里开始学习MIPS时,我在尝试打印1个字符串,接受用户输入,然后打印另一个字符串并接受用户输入时遇到了问题。两个用户输入应分别存储到寄存器a0和a1。

每个字符串的名称对于Dividend输入是promptD,对于Divisor输入是enterD(你可能猜测这是一个无符号除法计算器程序)。

在我的调试尝试中,我已将问题范围缩小到下面发布的一小段代码。

我认为我错误地将我的第一个.data寄存器抵消到了我的第二个.data寄存器。我注意到的问题是,我尝试过QTspim,xspim,PCspim和MARS,这四个问题都为.data中的第一个字符串提供了一个不同的初始寄存器地址。

例如:字符串"输入红利"将在MARS中的寄存器地址0x10010000中,但将在PCspim的0x10000000中启动。以下寄存器地址为"输入除数"将位于MARS中的0x10010011或PCspim中的0x10000010。

在当前通过MARS的状态下,下面的程序片段要求用户输入红利,并且它将存储该值。存储到a0之后,代码将立即失败,因为第37行(这只是第3次系统调用)运行时异常位于0x00400024:地址超出范围0x00000004。它没有提示"输入Divisor"一点都不

要真正看到问题在于行动,我认为在MARS中运行此问题有助于使其更加清晰。这是一个抵消问题吗?我是否在没有看到寄存器的情况下破坏了它?我没有在这里找到很多MIPS帮助来处理没有伪指令的问题。我意识到他们,我可以直接加载地址(la)......但我不能在这里使用它们。

谢谢

    .globl main

    .data        #for the data

    promptD: .asciiz "Enter Dividend \n"
    enterD:  .asciiz "Enter Divisor \n"
  #  result: .asciiz "Result = "

    .text           #for the instructions

    main:

    #for Dividend
    addi $v0, $0, 4     #store string instr to v0

    lui $a0, 0x1001     #address of promptD

    syscall              #display promptD

    addi $v0, $0, 5     #store input instr to v0

    syscall             # Get dividend

    add $a0, $0, $v0        # Dividend to $a0


    #for Divisor
    addi $v0, $0, 4         #store string instr to v0

    lui $a1, 0x1001         #Where I think the problem is...
                            #Address of first string followed by add offset?
    addi $a1, $a1, 33       #Maybe incorrect offset?

    syscall                 #display enterD

    addi $v0, $0, 5         #store input instr to v0

    syscall                # Get divisor

    add $a1, $0, $v0        # Divisor to $a1

    #end snippet

1 个答案:

答案 0 :(得分:0)

这是有问题的代码:

lui $a1, 0x1001         #Where I think the problem is...
                        #Address of first string followed by add offset?
addi $a1, $a1, 33       #Maybe incorrect offset?
  1. 您使用了错误的注册表。系统调用4的参数应放在$a0中,而不是$a1
  2. 偏移33不正确。如果查看Mars中的Data Segment查看器,您可以看到promptD的NUL终结符字节位于0x10010010,enterD字符串从0x10010011开始(如果您很难阅读十六进制ASCII代码,您可以勾选数据段查看器中的" ASCII"复选框,将数据视为字符)。所以你应该使用的偏移是0x11(十进制17)。