1

这段代码是一个运行良好的更大程序的一部分。然后我意识到分配将在 -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
4

1 回答 1

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

描述:
发生系统调用异常,立即无条件地将控制权转移给异常处理程序

于 2015-10-21T05:52:44.647 回答