Vous êtes sur la page 1sur 2

pe24_as2.

asm 1 / 2

1: ;===========================================================================
2: ;===========================================================================
3: ; PROGRAMA : pe24_as2.asm ex p14_nbin.asm
4: ; FUNCION : COMVIERTE UN NUMERO ASCII A BINARIO, Y
5: ; : LA CANTIDAD SE CAPTURA.
6: ; REALIZADO POR : Prof. Juan Juárez Fuentes
7: ; COMPILADOR EN EL QUE SE EJECUTO: TASM 5.0
8: ; FECHA : 2009120909395820121213132818
9: ;===========================================================================
10: ;===========================================================================
11: ; DECLARACION DE CONSTANTES
12: ;===========================================================================
13: CR EQU 13 ; Constante CR (Retorno de carro)
14: LF EQU 10 ; Constante LF (Salto de línea)
15: IMPRIMIR EQU 9
16: FIN EQU 4C00H
17: DOS EQU 21H
18: TAB EQU 09H
19: BELL EQU 07H
20: TECLADO EQU 8
21: ;===========================================================================
22: ; DECLARACION DEL SEGMENTO DE DATOS
23: ;===========================================================================
24: DATOS SEGMENT
25: NUMERO_BINARIO DW 0,"$"
26: NUMERO_ASCII DB 6,0,6 DUP (?),"$" ;Variable que almacena la cantidad uno.
27: M_ENCABEZADO DB 13,10,13,10,TAB,"============================================================"
28: DB 13,10,13,TAB,"PROGRAMA QUE CONVIERTE UN NUMERO ASCII (CAPTURADO) A BINARIO"
29: DB 13,10,13,TAB,"============================================================",13,10,"$"
30: M_ESPACIO DB 13,10,13,10,13,10,13,10,13,10,13,10,"$"
31: M_ASCII_ASCII DB 13,10,13,10,"NUMERO ASCII IMPRESO NORMALMENTE COMO LO HACE UNA PC (EN ASCII)",13,10,"$"
32: M_BINARIO_ASCII DB 13,10,13,10,"NUMERO BINARIO (YA CONVERTIDO), ",13,10,"IMPRESO NORMALMENTE COMO LO HACE UNA PC (EN ASCII): ","$"
33: ;-------------------------------------------------------------
34: ; Tabla de potencias usada para convertir el resultado binario de la
35: ; operacion en formato ASCII. Se usan las potencias de 10 (1,10,100,1000
36: ; y 10000), porque el numero mas grande es 65535. En caso de que quiera
37: ; operar sobre numeros mas grandes amplie la tabla.
38: ;-------------------------------------------------------------
39: Potencia DW 001H, 000AH, 0064H, 03E8H, 2710H, "$"
40: ;-----------------------------------------------------------------------
41: DATOS ENDS
42: ;===========================================================================
43: ; DECLARACION DEL SEGMENTO DE PILA
44: ;===========================================================================
45: PILA SEGMENT STACK 'STACK'
46: DW 128 DUP('P')
47: PILA ENDS
48: ;===========================================================================
49: ; DECLARACION DEL SEGMENTO DE CODIGO
50: ;===========================================================================
51: CODIGO SEGMENT ; Inicio del segmento de código
52: ;-----------------------------------------------------------------------
53: pe24_as2 PROC NEAR ; Inicio procedimiento
54: ;-------------------------------------------------------------------
55: ASSUME CS:CODIGO, SS:PILA, DS:DATOS
56: MOV AX, DATOS
57: MOV DS, AX
58: ;-----------------------------------------------------------------------
59: MOV AH, 0AH ; Captura la cantidad (hasta 8 digitos)
60: MOV DX, Offset NUMERO_ASCII
61: INT 21h
62: ;-----------------------------------------------------------------------
63: MOV DI, Offset NUMERO_ASCII + 1 ; Bytes leidos de la cantidad 1
64: MOV CX, [DI] ; NUMERO DE DIGITOS
65: MOV SI, Offset NUMERO_ASCII + 2 ; La cantidad 1

December 13, 2012 Crimson Editor


pe24_as2.asm 2 / 2

66: XOR CH, CH ; CH = 0


67: MOV DI, Offset POTENCIA ; Direccion de la tabla de potencias
68: DEC SI ; Posiciona Si En el primer byte de la cadena capturada y
69: ADD SI, CX ; Suma el desplazamiento de bytes leidos, para que podamos posicionarnos al final de la misma (apunta al ultimo digito capturado). BX =0 y
70: ; lee la cadena en forma inversa: es decir, de atras hacia adelante.
71: XOR BX, BX ; BORRA BX
72: STD ; PONE LA BANDERA DE DIRECCION EN UNO
73: CICLO: ; LODSB: Levanta un byte del numero (el registro AL sera cargado con el contenido de la direccion apuntada por DS:SI.) toma la cadena
74: LODSB ; que se encuentre en la dirección especificada por SI, la carga al registro AL (o AX) y suma o resta 1 (segun el estado de DF) a SI si la
75: ; transferencia es de bytes o 2 si la transferencia es de palabras. LODSB PARA BYTE, LODSW PARA PALABRA.
76: SUB AL, 30h ; Convierte el digito de ascii a binario
77: CBW ; Convierte a palabra, PONE EN CEROS LAPARTE ALTA DEL REGISTRO AX. La instrucción CBW (convertir byte a palabra) permite convertir un
78: ; número de 8 bits con signo en AL en un número de 16 bits con signo en AX.
79: MOV DX, [DI] ; Obtiene la potencia de 10 que sera usada para multiplicar,
80: MUL DX ; Multiplica numero y lo suma a Bx
81: ADD DI, 2 ; Va a la siguiente potencia de 10
82: ADD BX, AX ; ACUMULA LA SUMA EN BX.
83: LOOP CICLO ; Itera hasta que Cx sea = 0.
84: MOV NUMERO_BINARIO,BX ; PONE EL RESULTADO EN MEMORIA
85: ;-----------------------------------------------------------------------
86: ;-----------------------------------------------------------------------
87: LEA DX, M_ENCABEZADO ; PONE EL ENCABEZADO DEL PROGRAMA
88: CALL ESCRIBE
89: ;-----------------------------------------------------------------------
90: ;-----------------------------------------------------------------------
91: LEA DX, M_ASCII_ASCII ; LETRERO PARA EL NUMERO ASCII
92: CALL ESCRIBE
93: ;-----------------------------------------------------------------------
94: LEA DX, NUMERO_ASCII - 1 ; EL NUMERO ASCII
95: CALL ESCRIBE
96: ;-----------------------------------------------------------------------
97: ;-----------------------------------------------------------------------
98: LEA DX, M_BINARIO_ASCII ; LETRERO PARA EL NUMERO BINARIO
99: CALL ESCRIBE
100: ;-----------------------------------------------------------------------
101: LEA DX, NUMERO_BINARIO ; EL NUMERO BINARIO
102: CALL ESCRIBE
103: ;-----------------------------------------------------------------------
104: ;-----------------------------------------------------------------------
105: LEA DX, M_ESPACIO ; IMPRIME LINEAS DE ESPACIO
106: CALL ESCRIBE
107: ;-----------------------------------------------------------------------
108: ;-----------------------------------------------------------------------
109: CALL SALIR ; TERMINA
110: ;-----------------------------------------------------------------------
111: pe24_as2 ENDP ; Fin del procedimiento
112: ;-----------------------------------------------------------------------
113: ESCRIBE PROC ; Inicio procedimiento ESCRIBE
114: MOV AH,IMPRIMIR ; Función DOS para escribir texto en pantalla
115: INT DOS ; Llamar a la interrupción del DOS
116: RET ; Volver o retornar
117: ESCRIBE ENDP ; Fin del procedimiento ESCRIBE
118: ;----------------------------------------------------------------------
119: SALIR PROC NEAR
120: MOV AX, FIN ;Mueve la instruccion para terminar el programa.
121: INT DOS ;Ejecuta la interrupción.
122: SALIR ENDP
123: ;----------------------------------------------------------------------
124: CODIGO ENDS
125: ;===========================================================================
126: END pe24_as2
127: ;===========================================================================
128: ;===========================================================================
129: ;===========================================================================

December 13, 2012 Crimson Editor

Vous aimerez peut-être aussi