n° 219
Novembre 2017
Gennaio 16, 2018, 03:08:07 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: [ASSEMBLY MIPS]Trasformare numero da cifre in lettere  (Letto 2661 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
dennis87
Newbie
*

Karma: +0/-1
Scollegato Scollegato

Messaggi: 26


Mostra profilo E-mail
« inserita:: Marzo 01, 2013, 12:33:33 »

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 è:
Citazione
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!
Registrato
bertolottipf
Full Member
***

Karma: +4/-7
Scollegato Scollegato

Messaggi: 443


Mostra profilo E-mail
« Risposta #1 inserita:: Marzo 06, 2013, 09:42:55 »

Codice:
# Salvataggio registri utilizzati dalla procedura
addi $29, $29, -12 #crea lo spazio sulla pila per tre registri
sw $2, 0($29) #salva $2 sulla pila
sw $15, 4($29) #salva $15 sulla pila
sw $16, 8($29) #salva $16 sulla pila
# Corpo della procedura
muli $2, $5, 4 #registro $2 = k * 4
add $2, $4, $2 #registro $2 = v + (k*4)
lw $15, 0($2) # il registro $2 contiene l’indirizzo di v[k]
lw $16, 4($2) # $15 = v[k] e $16 = v[k+1]
sw $16, 0($2) #v[k] = registro $16
sw $15, 4($2) #v[k+1] = registro $15 (temp)
# Rispristino dei registri
lw $2, 0($29) #rispristina $2 dalla pila
lw $15, 4($29) #rispristina $15 dalla pila
lw $16, 8($29) #rispristina $16 dalla pila
addi $29,$29, 12 # ripristina il puntatore alla pila
# Ritorno alla procedura chiamante
jr $31

per informazioni maggiori http://www.seneta.it/public/SpecialeA042/Ciaramella/MIPS.pdf da cui tratto l'esempio e http://zeus.ing.unibs.it/quarella/Lucidi/Assembler-MIPS.pdf
Registrato
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +224/-19
Scollegato Scollegato

Messaggi: 2988


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #2 inserita:: Marzo 06, 2013, 10:20:05 »

Questo thread non aveva ancora ricevuto intenzionalmente risposta, in quanto crossposted su un elevato numero di forum, sebbene probabilmente rimasto privo di risposte anche altrove. Questo è esplicitamente deprecato dal nostro Regolamento.

Nel merito, l'uso dello stack non è certo l'unica alternativa, né la migliore: se il programma di studi lo prevede, è incomparabilmente meglio usare un array. Peraltro, l'implementazione della itoa() può essere migliorata nettamente.
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io? Occhiolino
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2017 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



powered by Simple Machines