Как загрузить целое слово в регистр, чтобы проверить свои функции в MIPS?

Я пытаюсь проверить свою функцию длины строки в mips. Я хочу проверить это со словом «счастливый» или чем-то подобным..... но я не знаю, как это сделать. Было бы здорово также научиться выводить его на экран.

Это мой код:

.globl StringLength

StringLength:
li $t0,0

StringLengthLoop:
lb $t1,0($a0)
beq $t1,$zero, StringLengthExit
add $a0,$a0,1
add $t0,$t0,1
j StringLengthLoop

StringLengthExit:
move $v0, $t0
jr $ra

person user977154    schedule 02.03.2012    source источник


Ответы (1)


Для печати на консоль вам придется использовать один из многих системных вызовов, доступных в вашей системе. (Точные значения системных вызовов зависят от вашей системы/эмулятора.)

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