Сборка MIPS, данные .space - PullRequest
       23

Сборка MIPS, данные .space

0 голосов
/ 02 августа 2020

За домашнее задание. Я пытаюсь распечатать данные .space 11 с помощью al oop и загружать каждый байт с помощью

lb $a0, data($t9)

, мне нужно загружать каждый байт для печати элемента. space или есть лучший способ ?

loop2:
        lbu $t9, newNum($t8)
        
        li $v0, 11
            move $a0, $t9
            syscall
                
        addi $t8, $t8, 1
            lbu $t9, newNum($t8)
            bnez $t9, loop2
        

примечание: есть ли другой способ определить конец .space?

Спасибо

1 Ответ

1 голос
/ 02 августа 2020

нужно ли мне загружать каждый байт для печати элемента .space или есть лучший способ?

Если вы отформатируете пространство как строку C, вы можете использовать системный вызов "print string", 4. Форматирование в виде строки C означает наличие последнего нулевого символа, который, похоже, у вас уже есть.

Кстати, ваш l oop предполагает, что строка имеет как минимум один символ (его длина> = 1), что в общем случае неверно (некоторые строки имеют длину 0), но может быть так в вашей программе.

примечание: есть ли другой способ обнаружения конец .space?

Это зависит от того, как вы используете пространство. Если это фиксированный буфер для строки константы времени компиляции, вы можете взять разницу между двумя метками:

myspace:    .space 11
myspaceEnd:

...
la $t0, myspaceEnd
la $t1, myspace
sub $t3, $t0, $t1

Это поместит размер .space в $t3. Некоторые, но не все ассемблеры допускают постоянное выражение, такое как myspaceEnd-myspace, поскольку это константа компиляции, она будет преобразована в немедленное значение константы времени выполнения, и мы могли бы для go вычисления времени выполнения (вышеуказанные 3 инструкции) константа времени компиляции.

Однако они вычисляют статический размер / размер пространства во время компиляции. Если вы используете пространство в качестве буфера: во время выполнения поместите туда строку, длина которой известна только динамически / во время выполнения, это не будет вычислять эту динамическую c длину, она даст только статическую c длину пространства (т.е. максимально допустимой длины).

Скорее всего, вы используете пространство в качестве буфера для строки времени выполнения, которая может быть любой длины, поскольку директива .space не позволяет инициализировать - тогда как директивы .asciiz и .byte делают это.

MARS и QtSpim позволяют читать строку из консоли или из файла. При чтении строки с консоли системный вызов не сообщает вам длину строки, поэтому для определения длины такой строки необходим тип операции strlen. Лучшее, что мы можем сделать, это вычислить длину, когда это необходимо, и сохранить эту длину, если она нам понадобится, в нескольких местах программы.

При чтении из файла системный вызов возвращает длину, поэтому нет необходимость операции strlen, если длина, возвращаемая системным вызовом, сохраняется на время, когда это необходимо программе.

...