2015-01-23 3 views
0

두 개의 배열을로드합니다. 나는 둘의 합을 포함하고 더 작은 차원을 갖는 세 번째 배열을 반환해야한다. 마지막 것을 인쇄하십시오.Asm 프로그램 ... 뭔가 잘못되었습니다.

예 :

INPUT : 배열 1 : 1 2 3 4 5] 배열 2 : 2~6 1]

OUTPUT : Array3 : 3 8 4

프로그램 실행 ... 요소의 정확한 숫자를 제공하지만 모든 요소는 0입니다.

.data 
vett1: .word 0:100 
vett2: .word 0:100   
vett3: .word 0:100 
x: .word 0 
space: .asciiz " " 

.text 
.globl main 

main: 

la $a0, vett1   
la $a1, vett2  
la $a2, vett3  
la $a3, x 
li $t0, 0  
li $t1, 0  
li $t2, 0  
jal loadA1 #mi salvo 26 salto a caricavettore1 
jal loadA2 #mi salvo 27 salto a caricavettore2 
jal lenght #mi salvo 28 salto a controllalunghezza 
lw $t2, ($a3) 
lw $t3, ($a3) 
la $a0, vett1 
la $a1, vett2 
la $a2, vett3 
jal summ 
jal print 
li $v0, 10 
syscall 

loadA1: 
li $v0, 5 
syscall 
beq $v0, -1, exit 
sw $v0, ($a0) 
addi $t0, $t0, 1 
addi $a0, $a0, 4 
j loadA1 
exit: jr $ra 

loadA2: 
li $v0, 5 
syscall 
beq $v0, -1, exit2 
addi $t1, $t1, 1 
sw $v0, ($a1) 
addi $a1, $a1, 4 
j loadA2 
exit2: jr $ra 

lenght: 
blt $t0, $t1, cond1 
sw $t1, ($a3)  
jr $ra   
cond1: sw $t0, ($a3) 
jr $ra 

summ: 
subi $sp, $sp, 4  
sw $ra, 0($sp)  
bnez $t2, rec  
j exit3 

rec: lw $s0, ($a0) 
lw $s1, ($a1)  
add $v0, $s0, $s1 
sw $v0, ($a2)  
addi $a0, $a0, 4  
addi $a1, $a1, 4  
addi $a2, $a2, 4 
subi $t2, $t2, 1  
jal summ 

exit3: 
lw $ra, 0($sp) 
addi $sp, $sp, 4 
jr $ra 

print: 
beqz $t3, exit4  
lw $a0, ($a2)  
li $v0, 1 
syscall 
la $a0, space 
li $v0, 4 
syscall 
addi $a2, $a2, 4 
subi $t3, $t3, 1 
j print 
exit4: jr $ra 
+0

왜'sum' 함수가 재귀 적입니까? 반복적 인 솔루션은보다 간단하고 효율적이었습니다. – Michael

답변

1

두 개의 요를 합하면 요 각 반복 끝에 $a2에 4를 더하여 vett3의 다음 요소를 가리 키도록합니다. 따라서 합계가 완료된 후 $a2은 다음에 첫 번째 메모리 위치 을 가리키고 vett3의 끝입니다.
그런 다음 당신은 print 전화를하지만 vett3의 시작에 가리 키도록 $a2를 재설정하지 않는, 그래서 당신은 (모두 0으로 일어날 수있는 - 또는 대부분의 제로 적어도 xspace 이후가 될 것입니다) 쓰레기 데이터를 인쇄 결국 .

관련 문제