Как вывести итоговое значение на языке ассемблера RISC-V?

#assembly #riscv

#сборка #riscv

Вопрос:

Предполагается, что этот код хранит числа в массиве, а затем выводит общее количество положительных чисел и общее количество отрицательных чисел. Я не уверен, что я делаю не так! Он выводит сообщения без итогового значения. Я использую язык ассемблера RISC-V в симуляторе RARS

Это мой текущий результат:

 Positive Integers Total: 
Negative Integers Total: 
Negative Integers Total: 
-- program is finished running (0) --
  

Не отображает итоговые значения. Как я могу это исправить?

 #----Calculate the Sum of Positive and Negative Numbers In An Array----#
########################################################################
    .data
array:      .word 22,-35,48,10,-15,-30,25,20,-1,-26,-18,1,2,3,4,5,6,7,-9,1,-4,-3,-2,1,6,0 #array input
positiveSum:    .word 0
negativeSum:    .word 0

#outcome messages
position:       .word 0 #index posisiont of array
length:     .word 9
posTotal:       .ascii "nPositive Integers Total: "
negTotal:       .ascii "nNegative Integers Total: "

    .text
main:
       
       la t0,array      #load array to register t0 
       lw t1,position
       lw s1, positiveSum   #load the positive sum to s1, and negative sum to s2
       lw s2,negativeSum

loop:
           #calculate the index position in terms of memory
           #each integer needs 4 bytes
           #so shift left the value in t1 and store it in t3
    slli t3,t1,2
        add t3,t3,t0        #add the base address and the above result
        lw t4,0(t3)     #load the word from above address into t4
        beqz t4,exit        #exit loop when reaching 0
        j checkSign     #if value is not 0 jump to check integer sign

checkSign:
               
        bltz t4,addNegative     #check if array value is negative 
    j addPositive       # if yes goto addnegative
                        #if not goto addpositive
               
addPositive:
        add s1,s1,t4        #add all positive integers to s1 register
        j increment     #increment
               
addNegative:
        add s2,s2,t4        #add the negative integers to the s2 register
        j increment     #increment
           
increment:
        addi t1,t1,1        #increment the current index in t1 by 1
        j loop
          
exit:               #end of program
        la a0,posTotal   
        li a7,4         #print the positive sum 
        ecall
        
        la a0,negTotal
        li a7,4     #print the negative sum 
        ecall

    ori a7, zero, 10    #program exit system call
    ecall           # exit program
  

Ответ №1:

Вы печатаете только posTotal и negTotal. Вам также необходимо распечатать положительное и отрицательное значение после преобразования их в формат ascii.

Я не знаю, как работает ваш ecall, но вам нужно добавить два вызова в ecall, когда вы помещаете ascii из своих сумм в a0 (это решение всегда будет работать), или, если ecall может принимать более одного аргумента, поместите сумму в качестве второго аргумента, используя a1 .

Вы были Negative Integers Total: напечатаны дважды, потому что вы не добавили в конце своих строк, поэтому в первый раз вы печатаете первую строку, но продолжаете печатать, пока не найдете .

Я рекомендую вам добавить директиву выравнивания между вашими строками, например .balign 4 .

 posTotal:       .ascii "nPositive Integers Total: "
.balign 4
negTotal:       .ascii "nNegative Integers Total: "
  

j checkSign и второй j increment бесполезны.

Комментарии:

1. Вы можете использовать .asciiz вместо руководства в .ascii . Обычно выравнивание строк не требуется, хотя я предполагаю, что выравнивание на 4 может ускорить выполнение strcpy или strlen ядра, если оно проверяет выравнивание для начала.