Ciao a tutti come state?
Ho un problema con un esercizio.
Dato in input un numero intero il programma deve ritornare in ordine i numeri che compongono il numero scritti in lettere. In poche parole se io inserisco 25, il programma mi stampa in output due cinque.
Ora quello che ho fatto io funziona ma non stampa nel corrette ordine, ovvero stampa a partire dall'ultima cifra, cioè se inserisco il solito 25 il mio programma stampa in output cinque due.
Per correggere questo "bug" avevo pensato di usare una lo STACK, in modo tale che mi stampi l'output corretto. Ma come si usa la pila? cioè come si implementa? mi potreste aiutare per favore?
Il testo originale dell'esercizio è:
Utilizzando QtSpim, scrivere e provare un programma che legge un intero positivo. Se l’intero letto non è positivo il programma deve terminare stampando il messaggio “Input non valido”; altrimenti il programma deve richiamare una procedura che stampa i nomi delle cifre dell’intero letto, delimitati esattamente da uno spazio. Per esempio, se l’utente inserisce “728”, l’uscita dovrà essere “Sette Due Otto”.
Il codice che per ora ho scritto è invece questo:
# Title: Esercizio 4
# Author: Dennis Aleandro Boanini
# Description: Esercizio di Progetto 4
################# Data segment ###########
.data
insert: .asciiz "Inserisci un numero intero positivo -> "
dig0: .asciiz " zero "
dig1: .asciiz " uno "
dig2: .asciiz " due "
dig3: .asciiz " tre "
dig4: .asciiz " quattro "
dig5: .asciiz " cinque "
dig6: .asciiz " sei "
dig7: .asciiz " sette "
dig8: .asciiz " otto "
dig9: .asciiz " nove "
digits: .word dig0,dig1,dig2,dig3,dig4,dig5,dig6,dig7,dig8,dig9
ncifre: .asciiz "\nNumero cifre: "
moltiplicato: .asciiz "\nmoltiplicato per 4 viene: "
negato: .asciiz "\n negato: "
nonValido: .asciiz "\nInput non valido "
fine: .asciiz "\nFine del programma "
################# Code segment #####################
.text
.globl main
funzione:
ciclo:
li $t0, 10 #divisore
div $a3, $t0 #esegue la divisione fra il contenuto di $a0, $t0
mfhi $s1 #$s1 prende il resto della divisione
mflo $a3 #$a0 prende il quoziente della divisione.
addi $s2, $s2, 1 #conto il numero delle cifre
add $s1 ,$s1, $s1 #qui e sotto moltiplico $s1 x 4
add $s1, $s1, $s1
move $t0, $s1
lw $a0, digits($t0)
li $v0, 4
syscall
bne $a3, $zero, ciclo #se il numero è diverso da 0 torno all'etichetta control.
li $v0, 4
la $a0, ncifre
syscall
move $a0, $s2
li $v0, 1
syscall
j $ra
main:
li $t1, 10
la $a0, insert
li $v0, 4
syscall
li $v0, 5
syscall
move $a3, $v0
blt $a3, $zero, Exit
jal funzione
li $v0, 4
la $a0, fine
syscall
li $v0, 10
syscall
Exit:
li $v0, 4
la $a0, nonValido
syscall
li $v0, 10
syscall
Grazie a tutti in anticipo!