[ASSEMBLY MIPS]Trasformare numero da cifre in lettere

dennis87

Utente Attivo
38
0
Hardware Utente
CPU
InteL Core i7 2630QM
Scheda Madre
N53SN
Hard Disk
640GB
RAM
DDR3 8Gb
Scheda Video
Intel(R) HD Graphics 3000 e NVIDIA GeForce GT 550M
Sistema Operativo
Windows 7 Professional
#1
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:
Codice:
# 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!


- - - Updated - - -

nessuno puo aiutarmi?
 

Discussioni Simili


Entra