Funzione sottrazione

di Vincenzo.79 il
3 risposte

Ho svolto un programma per fare somma e differenza di numeri inseriti dall'utente. Ho solo un dubbio sull'uso della funzione "sub"; il risultato è un pò anomalo per come vorrei che fosse eseguito...ho sbagliato qualcosa, oppure è l'unico modo per fare tale operazione in RiscV???

Esempio con i numeri:

l'utente inserisce tre numeri: 1 - 5 - 6

per come ho impostato la funzione praticamente ottengo: 2 e non -10...

non volendovi tediare con tutto il codice, vi posto la sola funzione:

func_diff:
	sub t4, t2, t4
	ret

Grazie in anticipo per la risposta!

3 Risposte

  • 12/08/2026 - Vincenzo.79 ha scritto:

    non volendovi tediare con tutto il codice

    Ma senza tutto il codice, non sappiamo cosa effettivamente c'è nei registri.

    Per me, il fatto che non utilizzi i registri appropriati per passare/ricevere gli argomenti ti crea più grattacapi che altro.

    A me un semplice

    .text
    
    li a0, 1
    li a1, 5
    sub a0, a0, a1
    
    li a1, 6
    sub a0, a0, a1
    
    print:
    	mv a1, a0
    	li a0, 1
    	ecall
    end:
    	li a0, 10
    	ecall

    funziona senza problemi e stampa -10.

  • 13/08/2026 - Sgrubak ha scritto:

    Ma senza tutto il codice, non sappiamo cosa effettivamente c'è nei registri.

    Ok allora ti tedio :-))))

    L'errore che riscontro nella funzione sub è questo:

    (faccio un esempio) supponiamo di voler inserire tre numeri ed effettuarne la sub:

    inserisco 2 e, ovviamente, il risultato della sub è -2, quando dovrebbe essere +2...come posso risolvere?

    # Programma che esegue la somma e la differenza 
    # di una serie di numeri inseriti dall'utente
    
    .globl _start
    
    .data
    		input:			.asciz " Quanti numeri vuoi inserire? "
    		in_num:		.asciz " Digita un numero: "
    		msg_err:		.asciz " Il valore digitato non è corretto. Riprova!\n"
    		sum:				.asciz " La somma dei numeri è "
    		diff:				.asciz "\n La differenza dei numeri è "
    
    .text
    _start:
    
    restart:
    	la a0, input
    	li a7, 4
    	ecall
    	li a7, 5
    	ecall
    	mv t1, a0
    	bgtz t1, loop
    	
    	la a0, msg_err
    	li a7, 4
    	ecall
    	j restart
    
    	li t5, 0					# Indice di controllo
    	
    loop:
    	la a0, in_num
    	li a7, 4
    	ecall
    	li a7, 5
    	ecall
    	mv t2, a0
    	
    	jal func_sum
    	jal func_diff
    #	add t3, t3, t2		# somma
    	addi t5, t5, 1
    	bgt t1, t5, loop
    
    end:
    # Stampa somma
    	la a0, sum
    	li a7, 4
    	ecall
    	mv a0, t3
    	li a7, 1
    	ecall
    	
    # Stampa differenza
    	la a0, diff
    	li a7, 4
    	ecall
    	mv a0, t4
    	li a7, 1
    	ecall
    	
    # Fine del programma
    li a7, 10
    ecall
    
    func_sum:
    	add t3, t3, t2
    	ret
    
    func_diff:
    	sub t4, t4, t2
    	ret
    
  • 13/08/2026 - Vincenzo.79 ha scritto:

    ovviamente, il risultato della sub è -2, quando dovrebbe essere +2

    No aspetta... Qualquadra non cosa: il risultato al primo passaggio DEVE essere -2... t4 è a zero, quindi 0-2 = -2 ed in t4 avrai correttamente -2.

    Attento che l'istruzione 

    li t5, 0					# Indice di controllo

    non verrà mai eseguita.

    Davvero non capisco perché non usi la convenzione di passare gli argomenti alle funzione tramite i registri ax.

    Hai anche cambiato la funzione... Nel post di apertura era

    sub t4, t2, t4

    quando ora riporti

    sub t4, t4, t2

    se per l'addizione il problema non si pone, nella sottrazione l'ordine è importante. Con i tre numeri citati all'inizio (1, 5 e 6) dovresti ottenere -12 non -10, mentre il valore 2 è corretto avendo invertito i registri. Il giro sarebbe:

    • t4 = 0, t2 = 1 ergo t4 = t2-t4 = 1
    • t4 = 1, t2 = 5 ergo t4 = t2-t4 = 4
    • t4 = 4, t2 = 6 ergo t4 = t2-t4 = 2

    che è quanto ottenevi.

Devi accedere o registrarti per scrivere nel forum
3 risposte