如何用 RISC-V 汇编语言打印总数?
How to print the total in RISC-V Assembly language?
这段代码应该将数字存储在一个数组中,然后打印正数的总和和负数的总和。我不确定我做错了什么!
它打印出没有总数的消息。我在 RARS 模拟器中使用 RISC-V 汇编语言
这是我目前的结果:
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
您只打印 posTotal 和 negTotal。在将它们转换为 ascii 格式后,您还需要打印 positiveSum 和 negativeSum。
我不知道你的 ecall 是如何工作的,但是当你把你的总和的 ascii 放在 a0 中时,你需要添加两个 ecall 调用(这个解决方案总是有效的),或者如果 ecall 需要更多除了一个参数之外,使用 a1.
将 Sum 作为第二个参数
您打印了两次 Negative Integers Total:
,因为您没有在字符串末尾添加 [=12=]
,所以第一次打印第一个字符串但继续打印,直到找到 \0。
我建议您在字符串之间添加对齐指令,例如 .balign 4
。
posTotal: .ascii "\nPositive Integers Total: [=10=]"
.balign 4
negTotal: .ascii "\nNegative Integers Total: [=10=]"
第一个j checkSign
和第二个j increment
没用
这段代码应该将数字存储在一个数组中,然后打印正数的总和和负数的总和。我不确定我做错了什么! 它打印出没有总数的消息。我在 RARS 模拟器中使用 RISC-V 汇编语言
这是我目前的结果:
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
您只打印 posTotal 和 negTotal。在将它们转换为 ascii 格式后,您还需要打印 positiveSum 和 negativeSum。
我不知道你的 ecall 是如何工作的,但是当你把你的总和的 ascii 放在 a0 中时,你需要添加两个 ecall 调用(这个解决方案总是有效的),或者如果 ecall 需要更多除了一个参数之外,使用 a1.
将 Sum 作为第二个参数您打印了两次 Negative Integers Total:
,因为您没有在字符串末尾添加 [=12=]
,所以第一次打印第一个字符串但继续打印,直到找到 \0。
我建议您在字符串之间添加对齐指令,例如 .balign 4
。
posTotal: .ascii "\nPositive Integers Total: [=10=]"
.balign 4
negTotal: .ascii "\nNegative Integers Total: [=10=]"
第一个j checkSign
和第二个j increment
没用