MIPS использует строку в аргументах функции - PullRequest
0 голосов
/ 30 июня 2019

У меня есть эта функция в MIPS, она преобразует строчную в буферную строку в верхний регистр:

funcion:
    addi $t0,$zero,0

    loop:
        lb $t1, buffer($t0)
        beq $t1, 0, exit_loop
        blt $t1, 'a', case
        bgt $t1, 'z', case
        sub $t1, $t1, 32
        sb $t1, buffer($t0)

    case: 
            addi $t0, $t0, 1
            j loop

    exit_loop:
        jr $ra

    .data

buffer: .asciiz "Meow"
buffer2: .asciiz "Guau"

Я хочу использовать ее для buffer2, как можно отправить строку как аргумент функции?

Я пробую это

    la $a0,buffer

    jal convertir_a_mayusculas

и меняю функцию цикла

    loop:
        lb $t1, $a0($t0)
        beq $t1, 0, exit_loop
        blt $t1, 'a', case
        bgt $t1, 'z', case
        sub $t1, $t1, 32
        sb $t1, $a0($t0)

Но не работает, что не так?

Ответы [ 2 ]

0 голосов
/ 30 июня 2019

Использование регистра для хранения адреса sting, как и во второй попытке, является правильным способом.

Использование lb $t1, buffer($t0) может создать проблемы, если размер буфера превышает 16 бит.Это может работать в небольших примерах, но опасно в реальном коде.

Основная проблема вашей второй попытки заключается в том, что инструкция lb $t1, $a0($t0) синтаксически неверна.lb требует регистр назначения, регистр адресов и смещение, которое должно быть немедленным.

Таким образом, поскольку адрес буфера уже находится в $a0, вы можете использовать lb $t1, 0($a0) и увеличивать $a0 в цикле для доступа к последовательным символам.

loop:
    lb $t1, 0($a0)       # loads byte at address $a0+0
    beq $t1, 0, exit_loop
    blt $t1, 'a', case
    bgt $t1, 'z', case
    sub $t1, $t1, 32
    sb $t1, 0($a0)
case: 
    addi $a0, $a0, 1    # let $a0 point to next char in buffer
    j loop
exit_loop:
    jr $ra
0 голосов
/ 30 июня 2019

$a0($t0) не является допустимым режимом адресации, поскольку он имеет два регистра, и хорошая новость заключается в том, что вам вообще не нужно $t0: просто увеличьте $a0.

funcion:

    loop:
        lb $t1, ($a0)
        beq $t1, 0, exit_loop
        blt $t1, 'a', case
        bgt $t1, 'z', case
        sub $t1, $t1, 32
        sb $t1, ($a0)

    case: 
            addi $a0, $a0, 1
            j loop

    exit_loop:
        jr $ra

Возможно, вам придется изменить ($a0) на 0($a0), если в настройках MARS не включены псевдоинструкции.

Этот клоббер $a0, я не помню, если соглашение о вызовах MIPS делает его энергозависимым или нет, если вам нужно его сохранить, просто скопируйте его в t0 в начале функции и используйте t0 после.

...