[Assembly Mips]Trasformare numero da cifre in lettere

di il
8 risposte

[Assembly Mips]Trasformare numero da cifre in lettere

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!

8 Risposte

  • Re: [Assembly Mips]Trasformare numero da cifre in lettere

    Dennis ha scritto:


    Ora quello che ho fatto io
    Come ti avevo fatto intendere (almeno credevo) nell'altro forum (dove ti ho scritto praticamente tutto il codice in questione ...) devi semplicemente memorizzare i valori delle singole cifre in un buffer e poi rileggere al contrario il buffer per la visualizzazione.

    Il buffer lo imposti con

    number: .space 10

    e puoi usare $t2 (azzerato all'inizio del main) come puntatore a tale spazio.
  • Re: [Assembly Mips]Trasformare numero da cifre in lettere

    Oregon sei praticamente ogni presente
    Comunque non c'è nulla da ridere...è che proprio non capisco scusami.
    Sono 2 giorni che sto smattando e non ne vengo a capo.
  • Re: [Assembly Mips]Trasformare numero da cifre in lettere

    Va beh ... dai un'occhiata
    
    .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
    	number: .space 10
    	
    .text
    .globl main
    
    main:
    	li $t1, 10
    	li $t2, 0
    Loop:	
    	la $a0, insert
    	li $v0, 4
    	syscall
    	
    	li $v0, 5
    	syscall
    	
    	move $s0, $v0
    	
    	blt $s0, $zero, Loop
    control:
    	li $s1, 0
    	div $s0, $t1
    	mfhi $s1
    	mflo $s0
    	
    	sw $s1, number($t2)
    	addi $t2,$t2, 4
    		
    	bne $s0, $zero, control
    
    print:
    	addi $t2,$t2, -4
    	lw $s1, number($t2)
    	
    	add $s1 ,$s1, $s1
    	add $s1, $s1, $s1
    	move $t0, $s1
    	lw $a0, digits($t0)
    	li $v0, 4
    	syscall
    
    	bne $t2, $zero, print
    		
    	li $v0, 10
    	syscall
    
  • Re: [Assembly Mips]Trasformare numero da cifre in lettere

    Grazie mille oregon.
    Ho fatto le dovute modifiche in modo che la trasformazione faccia parte di una procedura come richiesto dal testo.
    Ma tuttavia non ho capito delle cose che spero potresti spiegarmi.
    1)
    number: .space 10
    come mai sono stati allocati 10 byte?
  • Re: [Assembly Mips]Trasformare numero da cifre in lettere

    Ciao oregon, vorrei sapere come mai usi addi $t2,$t2, 4, e come mai aggiungi 4 e dopo sottrai 4, qual è la sua funzione?
  • Re: [Assembly Mips]Trasformare numero da cifre in lettere

    Il -4 nel ciclo serve a posizionarsi sulla cifra precedente nel buffer e visualizzarla.

    Dato che il ciclo inizia con un -4, all'inizio il puntatore deve essere aumentato di 4 per puntare all'ultima cifra.


    P.S. Scusa ma rispondo solo nel forum non in privato.
  • Re: [Assembly Mips]Trasformare numero da cifre in lettere

    Ok, grazie mille
  • Re: [Assembly Mips]Trasformare numero da cifre in lettere

    Come hai fatto ad inserire quel programma in una procedura ?
    grazie
Devi accedere o registrarti per scrivere nel forum
8 risposte