Programa 17 - De hexadecimal a binario con comas.
El código es el mismo que mostré en clase--no le cambié nada, por lo que aún los mensajes de arriba aparecen distorsionados pero los binarios están funcionando bien. Próximamente le haré ajustes para arreglar lo de arriba. Por el momento si gustan editarlo o algo, adelante.
El código:
;===========================================================================
;===========================================================================
; PROGRAMA : pe17_cbi.asm
; FUNCION : Convierte un conjunto de caracteres ASCII a Binario.
; REALIZADO POR : Prof. Juan Juárez Fuentes
; EDITADO POR : Ing. Álan Alexander Valdez Casas
; COMPILADOR EN EL QUE SE EJECUTO: TASM 5.0
; FECHA : Septiembre 28 del 2017
;===========================================================================
; DECLARACION DE CONSTANTES
;===========================================================================
CR EQU 13
LF EQU 10
IMPRIMIR EQU 9
FIN EQU 4C00H
DOS EQU 21H
TAB EQU 09H
;===========================================================================
; DECLARACION DEL SEGMENTO DE DATOS
;===========================================================================
DATOS SEGMENT
ASCII DB 'A'
ASCII2 DB 'B'
ASCII3 DB 'C'
ASCII4 DB 'D'
ASCII5 DB 'E'
ASCII6 DB 'F'
ASCII7 DB 'G'
ASCII8 DB 'H'
ESPACIO DB CR,LF," ", "$"
BINARIO1 DB 8 DUP (100),"* ", "$", TAB, TAB
BINARIO2 DB 8 DUP (100),"* ", "$", TAB, TAB
BINARIO3 DB 8 DUP (100),"* ", "$", TAB, TAB
BINARIO4 DB 8 DUP (100),"* ", "$", TAB, TAB
BINARIO5 DB 8 DUP (100),"* ", "$", TAB, TAB
BINARIO6 DB 8 DUP (100),"* ", "$", TAB, TAB
BINARIO7 DB 8 DUP (100),"* ", "$", TAB, TAB
BINARIO8 DB 8 DUP (100)," ", "$", TAB, TAB
MENSAJE1 DB CR,LF,TAB,"AC", "$"
MENSAJE2 DB CR,LF,TAB,"DC", "$"
DATOS ENDS
;===========================================================================
; DECLARACION DEL SEGMENTO DE PILA
;===========================================================================
PILA SEGMENT STACK 'STACK'
DW 128 DUP('P')
PILA ENDS
;===========================================================================
; DECLARACION DEL SEGMENTO DE CODIGO
;===========================================================================
CODIGO SEGMENT ; Inicio del segmento de c?digo
;-----------------------------------------------------------------------
pe17_cbi PROC FAR ; Inicio procedimiento pe15_cbi
;-------------------------------------------------------------------
ASSUME CS:CODIGO, SS:PILA, DS:DATOS ; EN DEBUG SE OBSERVA QUE HAST AAQUI
MOV AX, DATOS ; LOS SEGMENTOS DE PILA Y CODIGO YA TIENEN
MOV DS, AX ; SU VALORES FINALES, SOLO EL DE DATOS NO LO TIENE.
;-------------------------------------------------------------------
LEA DX, MENSAJE1
CALL ESCRIBE
;-------------------------------------------------------------------
LEA DX, ESPACIO
CALL ESCRIBE
;-------------------------------------------------------------------
LEA DX, ASCII
CALL ESCRIBE ; Imprimimos el ASCII original
LEA DX, ESPACIO
CALL ESCRIBE
;-------------------------------------------------------------------
LEA DX, ESPACIO
CALL ESCRIBE
;-------------------------------------------------------------------
LEA DX, BINARIO1 ; Imprimimos el n?mero binario ya convertidO
LEA DX, ESPACIO
CALL ESCRIBE
LEA DX, BINARIO2
LEA DX, ESPACIO
CALL ESCRIBE
LEA DX, BINARIO3 ; Imprimimos el n?mero binario ya convertidO
LEA DX, ESPACIO
CALL ESCRIBE
LEA DX, BINARIO4
LEA DX, ESPACIO
CALL ESCRIBE
LEA DX, BINARIO5 ; Imprimimos el n?mero binario ya convertidO
LEA DX, ESPACIO
CALL ESCRIBE
LEA DX, BINARIO6
LEA DX, ESPACIO
CALL ESCRIBE
LEA DX, BINARIO7 ; Imprimimos el n?mero binario ya convertidO
LEA DX, ESPACIO
CALL ESCRIBE
LEA DX, BINARIO8
LEA DX, ESPACIO
CALL ESCRIBE
;-------------------------------------------------------------------
LEA DX, ESPACIO
CALL ESCRIBE
;-------------------------------------------------------------------
;-------------------------------------------------------------------
LEA SI, ASCII
LEA DI, BINARIO1
CALL ASCII2BIN
LEA SI, ASCII2
LEA DI, BINARIO2
CALL ASCII2BIN
LEA SI, ASCII3
LEA DI, BINARIO3
CALL ASCII2BIN
LEA SI, ASCII4
LEA DI, BINARIO4
CALL ASCII2BIN
LEA SI, ASCII5
LEA DI, BINARIO5
CALL ASCII2BIN
LEA SI, ASCII6
LEA DI, BINARIO6
CALL ASCII2BIN
LEA SI, ASCII7
LEA DI, BINARIO7
CALL ASCII2BIN
LEA SI, ASCII8
LEA DI, BINARIO8
CALL ASCII2BIN
;-------------------------------------------------------------------
;-------------------------------------------------------------------
LEA DX, MENSAJE2
CALL ESCRIBE
;-------------------------------------------------------------------
LEA DX, ESPACIO
CALL ESCRIBE
;-------------------------------------------------------------------
LEA DX, ASCII
CALL ESCRIBE ; Imprimimos el ASCII original
LEA DX, ASCII2
CALL ESCRIBE
LEA DX, ASCII3
CALL ESCRIBE
LEA DX, ASCII4
CALL ESCRIBE
LEA DX, ASCII5
CALL ESCRIBE
LEA DX, ASCII6
CALL ESCRIBE
LEA DX, ASCII7
CALL ESCRIBE
LEA DX, ASCII8
CALL ESCRIBE
;-------------------------------------------------------------------
LEA DX, ESPACIO
CALL ESCRIBE
;-------------------------------------------------------------------
LEA DX, ESPACIO
LEA DX, BINARIO1 ; Imprimimos el n?mero binario ya convertido
CALL ESCRIBE
LEA DX, BINARIO2
CALL ESCRIBE
LEA DX, BINARIO3
CALL ESCRIBE
LEA DX, BINARIO4
CALL ESCRIBE
LEA DX, BINARIO5
CALL ESCRIBE
LEA DX, BINARIO6
CALL ESCRIBE
LEA DX, BINARIO7
CALL ESCRIBE
LEA DX, BINARIO8
CALL ESCRIBE
;-------------------------------------------------------------------
LEA DX, ESPACIO
CALL ESCRIBE
;-------------------------------------------------------------------
CALL SALIR ; Salimos del programa
;-------------------------------------------------------------------
pe17_cbi ENDP ; Fin del procedimiento pe15_cbi
;-----------------------------------------------------------------------
;----------------------------------------------------------------------
; Definicion del procedimiento. toma un buffer de 8 bits y lo transforma
; en uno de 64, recibe en el SI el de 8 y en DI el de 64
;----------------------------------------------------------------------
ASCII2BIN PROC NEAR
XOR AX, AX ; Limpiamos el AX para eliminar basura
; Movemos al CX la cantidad de caracteres ASCII para hacer un loop
MOV CX, 0
LEA DX, ESPACIO
CALL ESCRIBE
MOV CX, 1
;-------------------------------------
ASCII1: ; Este loop ir? de ASCII en ASCII transform?ndolo a binario
MOV AL, [SI] ; Movemos el siguiente car?cter ASCII al AL
PUSH CX ; Metemos el CX a la pila para guardar temporalmente el valor
MOV CX, 8 ; Metemos un nuevo valor al CX para un nuevo loop anidado
;---------------------------------
LOOP_SHIFT: ; Este loop producir? el n?mero binario para el ASCII actual
SHL AL, 1 ; Hacemos un SHIFT LEFT para mover el sig n?m binario al CF (1= UN BIT)
JC BIN_UNO ; Si el CF est? en uno es por que el siguiente n?m binario debe ser uno
MOV [DI], BYTE PTR '0' ; Sino el siguiente n?mero binario debe ser 0. Cuando se hace una escritura
JMP CICLO_SHIFT ; directa a memoria, es necesario indicar qu? tama?o posee el dato.
BIN_UNO: ; Para ello, se ha indicar un puntero a memoria, de tama?o BYTE o WORD:
MOV [DI], BYTE PTR '1' ; Cuando se hace una escritura directa a memoria, es necesario indicar qu?
CICLO_SHIFT: ; tama?o posee el dato. Para ello,
INC DI ; se ha indicar un puntero a memoria, de tama?o BYTE o WORD.
LOOP LOOP_SHIFT ; Seguimos con el ciclo anidado para sacar el siguiente n?m binario
;---------------------------------
POP CX ; Devolvemos al CX su valor original
INC SI
LOOP ASCII1 ; Seguimos con el siguiente ciclo para el siguiente valor ASCII
;-------------------------------------
RET ; Terminamos y regresamos
ASCII2BIN ENDP
;-----------------------------------------------------------------------
ESCRIBE PROC ; Inicio procedimiento ESCRIBE
MOV AH,IMPRIMIR ; Funci?n DOS para escribir texto en pantalla
INT DOS ; Llamar a la interrupci?n del DOS
RET ; Volver o retornar
ESCRIBE ENDP ; Fin del procedimiento ESCRIBE
;----------------------------------------------------------------------
SALIR PROC NEAR
MOV AX, FIN ; Mueve la instruccion para terminar el programa.
INT DOS ; Ejecuta la interrupci?n.
SALIR ENDP
;----------------------------------------------------------------------
CODIGO ENDS
;===========================================================================
END pe17_cbi
;===========================================================================
;===========================================================================
El código:
;===========================================================================
;===========================================================================
; PROGRAMA : pe17_cbi.asm
; FUNCION : Convierte un conjunto de caracteres ASCII a Binario.
; REALIZADO POR : Prof. Juan Juárez Fuentes
; EDITADO POR : Ing. Álan Alexander Valdez Casas
; COMPILADOR EN EL QUE SE EJECUTO: TASM 5.0
; FECHA : Septiembre 28 del 2017
;===========================================================================
; DECLARACION DE CONSTANTES
;===========================================================================
CR EQU 13
LF EQU 10
IMPRIMIR EQU 9
FIN EQU 4C00H
DOS EQU 21H
TAB EQU 09H
;===========================================================================
; DECLARACION DEL SEGMENTO DE DATOS
;===========================================================================
DATOS SEGMENT
ASCII DB 'A'
ASCII2 DB 'B'
ASCII3 DB 'C'
ASCII4 DB 'D'
ASCII5 DB 'E'
ASCII6 DB 'F'
ASCII7 DB 'G'
ASCII8 DB 'H'
ESPACIO DB CR,LF," ", "$"
BINARIO1 DB 8 DUP (100),"* ", "$", TAB, TAB
BINARIO2 DB 8 DUP (100),"* ", "$", TAB, TAB
BINARIO3 DB 8 DUP (100),"* ", "$", TAB, TAB
BINARIO4 DB 8 DUP (100),"* ", "$", TAB, TAB
BINARIO5 DB 8 DUP (100),"* ", "$", TAB, TAB
BINARIO6 DB 8 DUP (100),"* ", "$", TAB, TAB
BINARIO7 DB 8 DUP (100),"* ", "$", TAB, TAB
BINARIO8 DB 8 DUP (100)," ", "$", TAB, TAB
MENSAJE1 DB CR,LF,TAB,"AC", "$"
MENSAJE2 DB CR,LF,TAB,"DC", "$"
DATOS ENDS
;===========================================================================
; DECLARACION DEL SEGMENTO DE PILA
;===========================================================================
PILA SEGMENT STACK 'STACK'
DW 128 DUP('P')
PILA ENDS
;===========================================================================
; DECLARACION DEL SEGMENTO DE CODIGO
;===========================================================================
CODIGO SEGMENT ; Inicio del segmento de c?digo
;-----------------------------------------------------------------------
pe17_cbi PROC FAR ; Inicio procedimiento pe15_cbi
;-------------------------------------------------------------------
ASSUME CS:CODIGO, SS:PILA, DS:DATOS ; EN DEBUG SE OBSERVA QUE HAST AAQUI
MOV AX, DATOS ; LOS SEGMENTOS DE PILA Y CODIGO YA TIENEN
MOV DS, AX ; SU VALORES FINALES, SOLO EL DE DATOS NO LO TIENE.
;-------------------------------------------------------------------
LEA DX, MENSAJE1
CALL ESCRIBE
;-------------------------------------------------------------------
LEA DX, ESPACIO
CALL ESCRIBE
;-------------------------------------------------------------------
LEA DX, ASCII
CALL ESCRIBE ; Imprimimos el ASCII original
LEA DX, ESPACIO
CALL ESCRIBE
;-------------------------------------------------------------------
LEA DX, ESPACIO
CALL ESCRIBE
;-------------------------------------------------------------------
LEA DX, BINARIO1 ; Imprimimos el n?mero binario ya convertidO
LEA DX, ESPACIO
CALL ESCRIBE
LEA DX, BINARIO2
LEA DX, ESPACIO
CALL ESCRIBE
LEA DX, BINARIO3 ; Imprimimos el n?mero binario ya convertidO
LEA DX, ESPACIO
CALL ESCRIBE
LEA DX, BINARIO4
LEA DX, ESPACIO
CALL ESCRIBE
LEA DX, BINARIO5 ; Imprimimos el n?mero binario ya convertidO
LEA DX, ESPACIO
CALL ESCRIBE
LEA DX, BINARIO6
LEA DX, ESPACIO
CALL ESCRIBE
LEA DX, BINARIO7 ; Imprimimos el n?mero binario ya convertidO
LEA DX, ESPACIO
CALL ESCRIBE
LEA DX, BINARIO8
LEA DX, ESPACIO
CALL ESCRIBE
;-------------------------------------------------------------------
LEA DX, ESPACIO
CALL ESCRIBE
;-------------------------------------------------------------------
;-------------------------------------------------------------------
LEA SI, ASCII
LEA DI, BINARIO1
CALL ASCII2BIN
LEA SI, ASCII2
LEA DI, BINARIO2
CALL ASCII2BIN
LEA SI, ASCII3
LEA DI, BINARIO3
CALL ASCII2BIN
LEA SI, ASCII4
LEA DI, BINARIO4
CALL ASCII2BIN
LEA SI, ASCII5
LEA DI, BINARIO5
CALL ASCII2BIN
LEA SI, ASCII6
LEA DI, BINARIO6
CALL ASCII2BIN
LEA SI, ASCII7
LEA DI, BINARIO7
CALL ASCII2BIN
LEA SI, ASCII8
LEA DI, BINARIO8
CALL ASCII2BIN
;-------------------------------------------------------------------
;-------------------------------------------------------------------
LEA DX, MENSAJE2
CALL ESCRIBE
;-------------------------------------------------------------------
LEA DX, ESPACIO
CALL ESCRIBE
;-------------------------------------------------------------------
LEA DX, ASCII
CALL ESCRIBE ; Imprimimos el ASCII original
LEA DX, ASCII2
CALL ESCRIBE
LEA DX, ASCII3
CALL ESCRIBE
LEA DX, ASCII4
CALL ESCRIBE
LEA DX, ASCII5
CALL ESCRIBE
LEA DX, ASCII6
CALL ESCRIBE
LEA DX, ASCII7
CALL ESCRIBE
LEA DX, ASCII8
CALL ESCRIBE
;-------------------------------------------------------------------
LEA DX, ESPACIO
CALL ESCRIBE
;-------------------------------------------------------------------
LEA DX, ESPACIO
LEA DX, BINARIO1 ; Imprimimos el n?mero binario ya convertido
CALL ESCRIBE
LEA DX, BINARIO2
CALL ESCRIBE
LEA DX, BINARIO3
CALL ESCRIBE
LEA DX, BINARIO4
CALL ESCRIBE
LEA DX, BINARIO5
CALL ESCRIBE
LEA DX, BINARIO6
CALL ESCRIBE
LEA DX, BINARIO7
CALL ESCRIBE
LEA DX, BINARIO8
CALL ESCRIBE
;-------------------------------------------------------------------
LEA DX, ESPACIO
CALL ESCRIBE
;-------------------------------------------------------------------
CALL SALIR ; Salimos del programa
;-------------------------------------------------------------------
pe17_cbi ENDP ; Fin del procedimiento pe15_cbi
;-----------------------------------------------------------------------
;----------------------------------------------------------------------
; Definicion del procedimiento. toma un buffer de 8 bits y lo transforma
; en uno de 64, recibe en el SI el de 8 y en DI el de 64
;----------------------------------------------------------------------
ASCII2BIN PROC NEAR
XOR AX, AX ; Limpiamos el AX para eliminar basura
; Movemos al CX la cantidad de caracteres ASCII para hacer un loop
MOV CX, 0
LEA DX, ESPACIO
CALL ESCRIBE
MOV CX, 1
;-------------------------------------
ASCII1: ; Este loop ir? de ASCII en ASCII transform?ndolo a binario
MOV AL, [SI] ; Movemos el siguiente car?cter ASCII al AL
PUSH CX ; Metemos el CX a la pila para guardar temporalmente el valor
MOV CX, 8 ; Metemos un nuevo valor al CX para un nuevo loop anidado
;---------------------------------
LOOP_SHIFT: ; Este loop producir? el n?mero binario para el ASCII actual
SHL AL, 1 ; Hacemos un SHIFT LEFT para mover el sig n?m binario al CF (1= UN BIT)
JC BIN_UNO ; Si el CF est? en uno es por que el siguiente n?m binario debe ser uno
MOV [DI], BYTE PTR '0' ; Sino el siguiente n?mero binario debe ser 0. Cuando se hace una escritura
JMP CICLO_SHIFT ; directa a memoria, es necesario indicar qu? tama?o posee el dato.
BIN_UNO: ; Para ello, se ha indicar un puntero a memoria, de tama?o BYTE o WORD:
MOV [DI], BYTE PTR '1' ; Cuando se hace una escritura directa a memoria, es necesario indicar qu?
CICLO_SHIFT: ; tama?o posee el dato. Para ello,
INC DI ; se ha indicar un puntero a memoria, de tama?o BYTE o WORD.
LOOP LOOP_SHIFT ; Seguimos con el ciclo anidado para sacar el siguiente n?m binario
;---------------------------------
POP CX ; Devolvemos al CX su valor original
INC SI
LOOP ASCII1 ; Seguimos con el siguiente ciclo para el siguiente valor ASCII
;-------------------------------------
RET ; Terminamos y regresamos
ASCII2BIN ENDP
;-----------------------------------------------------------------------
ESCRIBE PROC ; Inicio procedimiento ESCRIBE
MOV AH,IMPRIMIR ; Funci?n DOS para escribir texto en pantalla
INT DOS ; Llamar a la interrupci?n del DOS
RET ; Volver o retornar
ESCRIBE ENDP ; Fin del procedimiento ESCRIBE
;----------------------------------------------------------------------
SALIR PROC NEAR
MOV AX, FIN ; Mueve la instruccion para terminar el programa.
INT DOS ; Ejecuta la interrupci?n.
SALIR ENDP
;----------------------------------------------------------------------
CODIGO ENDS
;===========================================================================
END pe17_cbi
;===========================================================================
;===========================================================================
Comentarios
Publicar un comentario