Advertisement
SMicro

itoa - Entero a cadena números ASCII

May 28th, 2015 (edited)
836
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. *-----------------------------------------------------------
  2. * Title      :Conversor de Entero a dígitos numéricos en ASCII
  3. * Written by :Fulgencio
  4. * Date       :
  5. * Description:Es una rutina de conversión del valor contenido en un registro
  6. *             en una cadena de dígitos numéricos separados en ASCII.
  7. *-----------------------------------------------------------
  8.     ORG    $1000
  9. START:                  ; first instruction of program
  10.  
  11.     MOVE.L #655350123,D0    *Máximo valor 655359999
  12.     MOVE.L #NUMASC,A0
  13.     JSR ITOA
  14.     MOVE.L A0,A1
  15.     MOVE.L #13,D0
  16.     TRAP #15
  17.     SIMHALT             ; halt simulator
  18.  
  19. ITOA MOVEM.L A0-A1/D0-D2,-(A7)
  20.     CLR.L D1  
  21.     MOVE.L A0,A1      *Hace una copia del inicio de la cadena
  22.     CMP.L #655360,D0  *Máximo número + 1 que se puede divir por 10 con resultado .W
  23.     BCS PASO2         *Directos a PASO2 si es menor
  24. PASO1
  25.     DIVU #10000,D0    *Fraccionamos el número grande para poder dividir por 10 cada parte
  26.     MOVE.W D0,D1      *Guardamos el cociente para el PASO2
  27.     CLR.W D0          *Lo eliminamos de D0
  28.     SWAP D0           *Procesaremos en primer lugar el resto
  29.     MOVE.L #4,D2      *Contador. En este caso hay que sacar las 4 cifras aunque sean ceros
  30.     JSR BUCDIG        *Sacamos sus cifras
  31.     MOVE.L D1,D0      *Ahora procesaremos el cociente en el PASO2
  32. PASO2
  33.     CLR.L D2          *Aquí ya no hay que sacar un número de cifras exacta
  34.     JSR BUCDIG
  35.  
  36.  *Pasamos a invertir la cadena porque las cifras se calculaban
  37.  *en orden inverso
  38.  
  39.     MOVE.B #0,(A0)  *Marca de fin de cadena
  40. INVERT              *Intercambia los dígitos del final con los del principio.
  41.     MOVE.B -(A0),D0 *Usa D0 como registro intermedio                    
  42.     CMP.L A1,A0     *¿Se han encontrado los registros en el centro?
  43.     BCS FINITOA     *Si es así, hemos acabado
  44.     MOVE.B (A1),(A0) *Intercambiando valores
  45.     MOVE.B D0,(A1)+
  46.     JMP INVERT  *bucle
  47. FINITOA
  48.     MOVEM.L (A7)+,A0-A1/D0-D2
  49.     RTS
  50.    
  51. BUCDIG
  52.     DIVU #10,D0
  53.     SWAP D0
  54.     ADD.B #$30,D0   *Suma
  55.     MOVE.B D0,(A0)+ *Va guardando los restos de dividir por 10
  56.     TST.L D2
  57.     BEQ NOSUB       *Si es 0 no hay que hacer cuenta atrás
  58.     SUB.L #1,D2     *Descuenta un dígito del contador      
  59. NOSUB
  60.     CLR.W D0        *Borra el resto ya almacenado
  61.     SWAP D0         *Recupera el cociente para seguir dividiendo
  62.     BNE BUCDIG      *Hasta que nos de cociente 0
  63.     TST.L D2
  64.     BNE BUCDIG
  65.     RTS
  66.  
  67.    
  68.  
  69.  
  70. * Put variables and constants here
  71.     ORG $5000
  72.  
  73. NUMASC  DS.B 10
  74.  
  75.     END    START        ; last line of source
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement