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