Mips - print_string系统调用不在-bare模式下工作

时间:2015-10-21 02:57:32

标签: mips system-calls spim bare

此代码是一个更大的程序的一部分,工作得很好。然后我意识到这项任务将在-bare模式下进行测试。一旦我尝试在-bare模式下运行它,我的print_string系统调用从工作正常到不打印任何内容,我不知道为什么。

运行此功能不会给我带来任何错误,只是不会打印任何内容

(最后还需要2或$ 0,$ 0,$ 0)?

.globl main

.data
v: .space 2
w: .space 2
x: .space 2
y: .space 2
z: .space 2
inputPrompt: .asciiz "Input mathmatical expression: "

.text
main:   #main block used to read in all the necessary data

    lui $a0, 0x1001

    #prompt for expression
    addi $v0, $0, 4
    addi $a0, $a0, 10
    syscall
    or $0,$0,$0
    jr $ra
    or $0,$0,$0

1 个答案:

答案 0 :(得分:2)

这是问题所在:

lui $a0, 0x1001

如果您查看SPIM中DATA / STACK查看器中的地址,您将看到当您处于裸模式时,DATA部分从0x10000000而不是0x10010000开始。因此,您应该将lui更改为lui $a0, 0x1000

  

是2 or $0,$0,$0必要的

裸模式意味着模拟分支延迟槽。所以你应该用任何可以安全执行的指令填充任何分支延迟槽。如果您设法重新组织代码,那可能是NOP,或更有意义的说明。例如,如果你有:

ori $a0,$0,1
jal foo

你可以将其改为:

jal foo
ori $a0,$0,1  # will be executed in the delay slot

请注意,syscall没有任何延迟时段。来自 MIPS32™架构的程序员 第二卷:MIPS32™指令集

  

格式: SYSCALL

  说明
  发生系统调用异常,立即并无条件地将控制转移到异常处理程序