此代码是一个更大的程序的一部分,工作得很好。然后我意识到这项任务将在-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
答案 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
说明强>
发生系统调用异常,立即并无条件地将控制转移到异常处理程序