#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 ядра, если оно проверяет выравнивание для начала.