miércoles, 20 de septiembre de 2017

programa 17

;===========================================================================
;===========================================================================
; PROGRAMA : pe17_cbi.asm
; FUNCION : Convierte un conjunto de caracteres ASCII a Binario.
; REALIZADO POR : Prof. Juan Juárez Fuentes
; COMPILADOR EN EL QUE SE EJECUTO: TASM 5.0
; FECHA : 20091203130128
;===========================================================================
; 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', 'B', 'C', 'D', 'E', 'F', 'G', 'H'
ESPACIO DB CR,LF,"$"
BINARIO DB 64 DUP (?), "$"
MENSAJE1 DB CR,LF,TAB,"ANTES DE LA CONVERSION: ", "$"
MENSAJE2 DB CR,LF,TAB,"DESPUES DE LA CONVERSION: ", "$"
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, BINARIO ; Imprimimos el número binario ya convertido
 CALL ESCRIBE
;-------------------------------------------------------------------
LEA DX, ESPACIO
CALL ESCRIBE
;-------------------------------------------------------------------
;-------------------------------------------------------------------
LEA SI, ASCII
LEA DI, BINARIO
CALL ASCII2BIN
;-------------------------------------------------------------------
;-------------------------------------------------------------------
 LEA DX, MENSAJE2
 CALL ESCRIBE
 ;-------------------------------------------------------------------
 LEA DX, ESPACIO
 CALL ESCRIBE
 ;-------------------------------------------------------------------
 LEA DX, ASCII
 CALL ESCRIBE ; Imprimimos el ASCII original
 ;-------------------------------------------------------------------
 LEA DX, ESPACIO
 CALL ESCRIBE
 ;-------------------------------------------------------------------
 LEA DX, BINARIO ; Imprimimos el número binario ya convertido
 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
 MOV CX, 8 ; Movemos al CX la cantidad de caracteres ASCII para hacer un loop
 ;-------------------------------------
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
 ;===========================================================================
 ;===========================================================================

No hay comentarios:

Publicar un comentario