MIPS Функции и массивы - PullRequest
       21

MIPS Функции и массивы

1 голос
/ 18 мая 2011

Я могу понимать и использовать Java / c ++ в достаточной степени, но на мой взгляд, сборка меня просто смущает, есть две функции, с которыми у меня проблемы. Во-первых:

Одна функция, которая получает строку и печатает ее на терминале

И еще один, который получает строку и преобразует ее в целые числа (строки, содержащие все числа).

Есть идеи, с чего начать?

Обновление

По второй функции, пока я получил это:

main:   
atoi:
    li      $v0, 8
    la      $a0, tstr
    li      $a1, 64
    syscall
    sub $sp, $sp,4
    sw $ra, 0($sp)
    move $t0, $a0
    li $v0, 0
next:
    lb $t1, ($t0)
    beqz  $t1, endloop
    mul $v0, $v0, 10
    add $v0, $v0, $t1
    sub $v0, $v0, 48
    add $t0, $t0, 1
    b next

endloop:
    lw $ra, 0($sp)
    add $sp, $sp, 4

Обновлен код, все еще получая ошибку 10, являющуюся недопустимым операндом. И насчет sub $v0, $v0, 48 я должен просто сделать это как sub $t1, $t1, 48?

1 Ответ

1 голос
/ 18 мая 2011

Для ввода-вывода вы должны использовать системные вызовы. Для записи строк с нулевым символом в конце вы будете использовать системный вызов # 4, который хочет получить адрес буфера в $ a0. Теперь просто поместите номер системного вызова в $ v0 и выполните его. Например, этот фрагмент читает строку:

li      $v0, 8                # syscall number
la      $a0, theString        # buffer
li      $a1, 64               # length of buffer
syscall                       # read!

Здесь Вы можете найти некоторые номера системных вызовов.
Для второго упражнения, вот код C ++, попробуйте его перевести: P

int result = 0;

while (*digit >= '0' && *digit <='9') {            // digit is char *
    result = (result * 10) + (*digit - '0');
    digit++;
}

EDIT:
Хорошо, есть пара ошибок. Во-первых, вы не проверяете, достигли ли вы конца строки (просто сравните $ t1 с 0 в начале). И вы должны сначала вычесть '0' из $ t1, а затем добавить его к $ v0.

next:
    lb $t1, ($t0)
    # are there other character or this is the last one?

    mul $v0, $v0, 10
    add $v0, $v0, $t1
    sub $v0, $v0, 48         # subtract 48 only from $t1, not from whole result
    add $t0, $t0, 1
    b next
...