Для печати на консоль вы будете использовать один из множества системных вызовов , доступных в вашей системе. (Точные значения системных вызовов зависят от вашей системы / эмулятора.)
Строка может быть помещена в сегмент данных вашего исполняемого файла с меткой, которую можно использовать для получения адреса начала строки. «.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), как я это делал с первым примером.