Ciao a tutti,

sto facendo un progetto in assembly ma non riesco a trovare dove sbaglio nel codice...

ho fatto un programma che calcola 2 funzioni ricorsivamente...

eseguendolo calcola la ricorsione e termina ma mi da i risultati sbagliati....

è 10 giorni che sbatto la testa senza arrivare alla soluzione....

Probabilmente essendo assembly... non salvo qualche registro....

Non so.... qualcuno leggendo il codice sotto pensa di essere in grado di aiutarmi... veramente non so più cosa fare... non è un lavoro lungo anche perchè il codice è tutto implementato...

vi posto il codice cosi magari vi fate un idea poi se qualcuno è interessato ne parliamo in privato.

Ciao
Ale

codice:
############################################################################################################
#													   #
#					Data declaration section					   #
#													   #
############################################################################################################

.data	 

	num:		.asciiz "\nInserisci numero >=0:\n "
	errins:	.asciiz "\nIl numero deve essere maggiore di 0\n ripeti inserimento:	

############################################################################################################
#													   #
#						      Main						   #
#													   #
############################################################################################################

.text

	li	$v0, 4		# Stampo a video la stringa 
	la	$a0, num	# "Inserici numero >=0: "
	syscall			
	
	j 	inserisci	# salta a inserisci 

error:
	li	$v0, 4		# Stampo a video la stringa 
	la	$a0, errins	# "Il numero deve essere maggiore di 0:"
	syscall			


inserisci:
	li 	$v0, 5		# Ottengo dalla chiamata di sistema read_int
	syscall			# lo salvo in $v0
	blt 	$v0, 0, error	# condizione numero >= 0
	# salta a ripeti
	
	
	
	move $s0, $v0		
	
ciclo:	
	beq $s0, -1, exit

	move $a0, $s0	
	
	jal H
		
	move $a0, $v0
	li $v0, 1        # scrivi il risultato ed esci
	syscall	

	move $a0, $s0	

	jal K

	move $a0, $v0
	li $v0, 1        # scrivi il risultato ed esci
	syscall		

	addi $s0, $s0, -1
	j ciclo

exit:	
	li $v0,10
	syscall

		

H:
	beq $a0,0,CasobaseH
	addi $sp, $sp, -8           # fai spazio sullo stack
	sw $s0, 4($sp)          # salva il parametro corrente
	sw $ra, 0($sp)     
	addi $a0, $a0, -1 
	jal H
	move $a0, $v0
	jal K
	sub $v0, $s0, $v0	
	lw $s0, 4($sp)
	lw $ra, 0($sp) 
	addi $sp, $sp, 8
	jr $ra



K:	
	beq $a0,0,CasobaseK
	addi $sp, $sp, -8            # fai spazio sullo stack
	sw $s0, 4($sp)          # salva il parametro corrente
	sw $ra, 0($sp)    
	addi $a0, $a0, -1 
	jal K
	move $a0, $v0
	jal H
	sub $v0, $s0, $v0
	lw $s0, 4($sp)
	lw $ra, 0($sp) 
	addi $sp, $sp, 8

CasobaseK:
	li $v0,1
	jr $ra

CasobaseH:
	li $v0,0
	jr $ra