要打印到控制台,您将使用系统上可用的许多系统调用之一。(确切的系统调用值取决于您的系统/模拟器。)
可以将一个字符串放在可执行文件的数据段中,并带有一个标签,该标签可用于获取字符串开始的地址。“.ascii”表示一个非空终止的字符串,而“.asciiz”表示一个空终止的字符串。
这是一个关于如何打印字符串和整数值的简单示例:
.data
str: .asciiz "This is a string\n" # a null-terminated string to be printed.
.align 2 # make sure it's aligned to word boundary
int: .word 1234 # some number
.text
.global main
main:
la $a0, str # load the address of the start of our string
li $v0, 4 # syscall 4 usually means print string
syscall
la $t0, int # the address of our number
lw $a0, 0($t0) # get our number
li $v0, 1 # syscall 1 usually means print int
syscall
li $v0, 10 # syscall 10 usually means exit
syscall # exit.
一个更实际的例子:
如果我要使用你的函数,它看起来像这样:(假设它遵循 $aN 中参数的标准调用约定和 $vN 中的返回值。确实如此。)
.data
str: .asciiz "This is an example"
.text
.global main
main:
la $a0, str # first argument, a pointer to the string
jal StringLength # call StringLength(str)
# print the length
add $a0, $zero, $v0
li $v0, 1
syscall
li $v0, 10
syscall # exit
大多数模拟器使用相同的系统调用。这是 MARS 模拟器的系统调用列表。
最后提示:如果您计划使用 lw 指令加载一个值,请确保告诉汇编器将其对齐到字边界(.align 2),就像我在第一个示例中所做的那样。