Если я хочу сохранить пользовательский ввод в массиве в Ris c -v, как мне сохранить значения и сравнить их - PullRequest
0 голосов
/ 29 марта 2020

Если я хочу сохранить пользовательский ввод в массиве в ris c -v, как мне сохранить значения и сравнить их

, например, в mips, я могу сделать это следующим образом:

addi $t1,$v0,0
sw $t1,array($t0)
addi $t0,$t0,4

, а затем сравните его следующим образом:

lw $t2,array($t3)
beqz $t2,label # if t2 = 0 then go to label
addi $t3,$t3,4 

1 Ответ

1 голос
/ 29 марта 2020

sw, который вы используете здесь в MIPS, является псевдоинструкцией. Псевдоинструкция расширяется до двух-трех инструкций в реальном машинном коде MIPS: эти инструкции связаны через регистр, а именно $at - временный регистр ассемблера.

Точная форма, которую вы используете, состоит из 3 инструкций; он расширяется до

    lui $at, %hi(array)
    addu $at, $at, $t0
    sw $t1, %lo(array)($at)

RIS C V, очистил многие регистры использования MIPS, включая удаление временного регистра зарезервированный для ассемблера. Они также увеличили количество регистров параметров с 4 до 8 MIPS, удалив зарезервированные для операционной системы регистры $k0 & $k1. Кроме того, они используют те же a0 и a1 для возвращаемых значений, что и для первых двух параметров. В результате RIS C V имеет более полезный набор регистров.

В RIS C V можно выполнять те же действия, что и в MIPS, за исключением некоторых псевдоинструкций. Псевдоинструкции загрузки могут работать, используя целевую нагрузку в качестве промежуточного регистра для соединения двух инструкций, но некоторые ассемблеры тоже не примут это. Но нет доступного временного регистра для ассемблера, который можно использовать для раскрытия псевдоинструкций хранилища, поэтому он не поддерживается.

Поэтому вам следует избегать псевдоинструкций sw. Вместо этого вы можете использовать прямые указатели, и это также более эффективно, поскольку (в моем примере внутри l oop) это просто прямые инструкции, а не несколько последовательностей команд. Затем вы можете отделить la от sw, переместив его, например, за пределы l oop.

    la t0, array
    ...
loop:
    sw t1, 0(t0)       # or sw t1, (t0)
    addi t0, t0, 4
    ...
    beqz t2, loop

Кроме того, не используйте $ в именах регистров. в некоторых ассемблерах RIS C V.


Если вы хотели использовать псевдоинструкцию MIPS, sw с глобальным массивом и смещением регистра:

sw $t1, array($t0)    # expands to three instructions, also sets & uses `$at`
addi $t0, $t0, 4
...

Вы можете замените его следующим:

la $t7, array                  # pick a free temp register
add $t7, $t7, $t0
sw $t1, 0($t7)
...

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

...