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

Mips - print_string syscall doesn't work in -bare mode

此代码是一个运行良好的更大程序的一部分。然后我意识到作业将在 -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, [=11=], 4
    addi $a0, $a0, 10
    syscall
    or [=11=],[=11=],[=11=]
    jr $ra
    or [=11=],[=11=],[=11=]

这是问题所在:

lui $a0, 0x1001

如果您查看 SPIM 中 DATA/STACK 查看器中的地址,您会发现当您处于裸模式时,DATA 部分从 0x10000000 开始,而不是 0x10010000。所以你应该把 lui 改成 lui $a0, 0x1000.


are the 2 or [=15=],[=15=],[=15=] necessary

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

ori $a0,[=11=],1
jal foo

您可以将其更改为:

jal foo
ori $a0,[=12=],1  # will be executed in the delay slot

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

Format: SYSCALL

Description:
A system call exception occurs, immediately and unconditionally transferring control to the exception handler