MIPS打印换行方法

MIPS printing new line methods

我是 MIPS 的新手,我正在尝试弄清楚如何在不修改数据部分的情况下打印换行符

如果我的代码如下

.data
str: .asciiz "Testing string"
nl: .asciiz "\n"
.text
main:
    li $v0, 4
    la $a0, str
    syscall
    
    li $v0, 4
    la $a0, nl
    syscall

我通常都是这样打印新行的,但是如果没有标签 nl,我怎么能不在数据部分添加 nl 标签就打印新行呢?

我们可以一次打印一个字符——每个系统调用一个,使用系统调用#11。要打印的字符进入 $a0。要在不使用数据声明的情况下打印换行符:

li $a0, 10   # $a0 == character to print: newline '\n' (linefeed, 0xA/10)
li $v0, 11   # syscall function code #11 -- print one character
syscall

此外,通常我们可以在我们已经需要打印的另一个字符串的开头或结尾包含换行符 '\n',因此换行符不一定必须在其自己的系统调用中单独打印.

例如,让我们做等同于 printf("sum: %d\n, avg: %d\n", sum, avg); 这个 printf 打印 2 行输出,即使用两个换行符:

分解这个我们得到:

la $a0, sum     # "sum: "
li $v0, 4       # syscall function code #4 for print string
syscall         # prints "sum: "

move $a0, $s0   # assume sum in $s0, move to $a0 for syscall
li $v0, 1       # syscall function code #1 for print integer
syscall

li $a0, avg     # "\n, avg: "
li $v0, 4       # syscall function code #4 for print string
syscall

move $a0, $s1   # assume avg in $s1
li $v0, 1       # syscall function code #1 for print integer
syscall

li $a0, 10
li $v0, 11
syscall

.data
sum: .asciz "sum: "
avg: .asciz "\n, avg: "

此序列打印 2 行输出。 第一个 '\n' 换行符附加到 prompt/introducing 字符串“avg:”的开头。 第二个换行符使用系统调用 #11 打印,因此整个序列不需要单独的“\n”数据声明。

printf格式字符串被分解成字符串文字如下:

printf("sum: %d\n, avg: %d\n", sum, avg);
        ^---^  ^-------^   ^
        lit1      lit2   lit3

lit1 是“总和:”; lit2 是“\n,平均值:”; lit3 是一个字符,因此不需要数据。您可以看到 lit2 包含一行的结尾和另一行的开头,它们一起打印在一个系统调用中。在 lit1 和 lit2 以及 lit3 之间是打印整数的系统调用 #1。