Как загрузить целое слово в регистр, чтобы я мог проверить свои функции в MIPS? - PullRequest
0 голосов
/ 02 марта 2012

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

Это мой код:

.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

1 Ответ

1 голос
/ 02 марта 2012

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

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

...