Venus RISC-V how to loop, compare, and print?

不问归期 提交于 2020-02-25 04:03:48

问题


I am trying to loop through an array and if the number is larger than X then print.

I've tried to find tutorials online but I'm just stuck on why it is not working/outputting anything. My comments kind of explain what i tried to do.

.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

Thank you!


回答1:


There are some issues with the code you have posted.

I am trying to loop through an array and if the number is larger than X then print.

I can't find any X symbol in your code. Do you mean K?

la t0 K             #set t0 to K

The comment is wrong. You load the address of K into t0. If you want to get the value that is stored at that address into t0 you have to load the address into another register and dereference that address into t0, i.e. load it with the lw or lwu instruction.

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

What do you mean with 'deallocated to'? You copy t0 to a1 and t1 to a2. The same could be archieved with the mv pseudo instruction. However, those 2 lines are superfluous as you immediately overwrite the a1 and a2 registers in the following lines.

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

You could use the li/mv pseudo instructions here. This unconditionally prints the value of t1 - which is an address. If you want to print an actual array element you would have to load it using the address stored in t1 - cf. the lw/lwu instructions.

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

With that you unconditionally jump to the head of the loop (with pseudo instruction: j loop), i.e. that means that you read over the end of your array and never quit the loop. To fix this you have to use a conditional branch instruction such as bnez. Meaning that you e.g. set a register (as counter) to the array size and decrement it until zero. Or set a register to the address after the last array element and branch until t1 is equal to it.

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

It's anything but random. The comment is incorrect, you are calling the Venus exit2 syscall, not print_int. Besides, Venus also provides an exit syscall (10) that doesn't require an argument.

What is completely missing from your code is a location where you are actually trying to compare numbers and then print them based on that comparison.



来源:https://stackoverflow.com/questions/60087133/venus-risc-v-how-to-loop-compare-and-print

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!