Venus RIS C -V, как l oop, сравнить и распечатать? - PullRequest
1 голос
/ 06 февраля 2020

Я пытаюсь выполнить l oop через массив, и если число больше X, напечатайте.

Я пытался найти учебники в Интернете, но я просто застрял на том, почему это не так работает / выводит что угодно. Мои комментарии как бы объясняют, что я пытался сделать.

.data
arrayOfNums:
.word 0
.word 1
.word 122
.word 1112
.word 4294967295
.word 22
.word 234234
.word 23332
.word 42
.word 23423

K: .word 2237

.text
.globl main

main:
####   *** vv My problem starts here vv ***   ####
la t0 K             #set t0 to K
la t1 arrayOfNums   #set t1 pointer to array
addi a1 t0 0        #add t0 deallocated to a1
addi a2 t1 0        #add t1 deallocated to a2

loop: 
    addi a0 x0 1        # print_int ecall
    addi a1 t1 0        # add t1 value to print
    ecall
    addi t1, t1, 4      # Increments t1 to move to the next element
    jal x0, loop

exit:
####Exit using environmental calls####
addi a1 x0 0         # random exit 0 
addi a0 x0 17        # print_int ecall
ecall

Спасибо!

1 Ответ

1 голос
/ 08 февраля 2020

Существуют некоторые проблемы с кодом, который вы опубликовали.

Я пытаюсь выполнить l oop через массив, и если число больше X, выведите.

Я не могу найти символ X в вашем коде. Вы имеете в виду K?

la t0 K             #set t0 to K

Комментарий неверный. Вы загружаете адрес из K в t0. Если вы хотите получить значение, хранящееся по этому адресу, в t0, вам нужно загрузить адрес в другой регистр и разыменовать этот адрес в t0, т.е. загрузить его с помощью инструкции lw или lwu.

addi a1 t0 0        #add t0 deallocated to a1
addi a2 t1 0        #add t1 deallocated to a2

Что вы имеете в виду под «освобождением»? Вы копируете t0 в a1 и t1 в a2. То же самое можно архивировать с помощью псевдо инструкции mv. Однако эти две строки излишни, поскольку вы сразу перезаписываете регистры a1 и a2 в следующих строках.

    addi a0 x0 1        # print_int ecall
    addi a1 t1 0        # add t1 value to print
    ecall

Вы можете использовать li / mv псевдо инструкции здесь. Это безоговорочно печатает значение t1 - это адрес. Если вы хотите напечатать фактический элемент массива, вам придется загрузить его, используя адрес, сохраненный в t1 - ср. lw / lwu инструкции.

addi t1, t1, 4      # Increments t1 to move to the next element
jal x0, loop

При этом вы безоговорочно прыгаете на голову l oop (с псевдоинструкцией: j loop), т.е. это означает, что вы читаете через конец вашего массива и никогда не выходите из l oop. Чтобы исправить это, вы должны использовать инструкцию условного перехода, такую ​​как bnez. Это означает, что вы, например, устанавливаете регистр (как счетчик) на размер массива и уменьшаете его до нуля. Или установите регистр на адрес после последнего элемента массива и ветви, пока t1 не станет равным ему.

addi a1 x0 0         # random exit 0 
addi a0 x0 17        # print_int ecall
ecall

Это не случайно. Комментарий неверный, вы вызываете системный вызов Venus exit2, а не print_int. Кроме того, Венера также предоставляет системный вызов выхода (10), который не требует аргумента.

Чего не хватает в вашем коде, так это места, где вы на самом деле пытаетесь сравнить числа и затем распечатать их на основе на это сравнение.

...