为什么这个 MIPS 文件不打印到日志中?

why doesn't this MIPS file print to the log?

就上下文而言,我是一名正在读第二个本科生的学生。我正在尝试测试 CS class 的介绍,因为它主要是 Python,我不需要介绍性说明,但该课程包含一周的 MIPS 说明。我要了解我想了解的事物的宇宙的唯一方法是查看旧的决赛。我一直在观看 YouTube 视频以尝试获得一些 MIPS 基础知识。

这是我正在努力理解的一个问题。

a) What is printed by the MIPS program below?

b) Modify the program to print out 100 copies of the letter ’Z’. Shade in the box for each line that needs to be changed and rewrite the instruction below

ADDI $sp, $sp, -11 # Set up stack 
ADDI $s3, $zero, 1 # Store 1 in a registrar 
ADDI $t0, $zero, 90 # Set $t0 at 90 (Z) 
ADDI $s2, $zero, 10 # Use to test when you reach 10 
SETUP: SB $t0, 0($sp) # Next letter in $t0 
ADDI $sp, $sp, 1 # Increment the stack 
SUB $s2, $s2, $s3 # Decrease the counter by 1 
BEQ $s2, $zero, DONE # Jump to done if $s2 == 0 
J SETUP # If not, jump back to SETUP for loop 
DONE: ADDI $t0, $zero, 0 # Null (0) to terminate string 
SB $t0, 0($sp) # Add null to stack 
ADDI $sp, $sp, -11 # Set up stack to print 
ADDI $v0, $zero, 4 # 4 is for print string 
ADDI $a0, $sp, 0 # Set $a0 to stack pointer for printing 
syscall # Print to the log

我已经尝试 运行 在两个模拟器中执行此操作,答案似乎是“未打印任何内容”。我想这可能是教授想要的答案,但这个期末考试的其他地方几乎没有错误,所以我对此没有信心。我猜 90 是 'Z' 的 ascii 代码,这里的想法是 'Z' 将被打印 10 次。但是,要打印 10 次 'Z' 实际发生了什么?在我一直在观看的视频中,总是有 li/la 对打印说明。或者这是正确的,是模拟器有问题吗?


这样说对吗 ADDI $sp, $sp, -11 -> ADDI $sp, $sp, -101,
ADDI $s2, $zero, 10 -> ADDI $s2, $zero, 100,以及
ADDI $sp, $sp, -11 -> ADDI $sp, $sp, -101?

有差一错误。

首先,堆栈指针递减 11,然后递增 10(一次一个),然后再次递减 11。不平衡,它不会 return 到给定增量和第二次减量的位置。

因此,$sp 指向写入第一个 Z 之前的空字节 — 一个空字符串。

您可以通过查看第一个 SB 使用的地址来确认这一点,然后在通过系统调用 #4 打印时查看 $a0 中的地址。


作为编程风格的问题,在 MIPS 上,如果我们重新递减堆栈指针,我们通常不会弹出堆栈并假设我们的旧数据仍然存在——虽然这将在模拟器上工作,但在其他一些系统上当您第二次递减堆栈指针时,不要保证您现在位于堆栈指针下方的旧数据会返回(这与中断和信号的处理方式有关)。

更好的方法是在第一次递减后将堆栈指针保留在原处,然后将堆栈指针复制到另一个寄存器以用于循环中的字节写入而不是堆栈指针。