top of page

15 programas en lenguaje ensam

PROGRAMA 1

CR EQU 13 ; Constante CR (Retorno de carro) En decimal o LF EQU 0Ah ; Constante LF (Salto de línea) en hexadecimal es igual ;=========================================================================== ; DECLARACION DEL SEGMENTO DE DATOS ;=========================================================================== DATOS SEGMENT ; Inicio del segmento de datos ;----------------------------------------------------------------------- MENSAJE DB CR,LF,'? Good Afternoom, world!',CR,LF,'$' ;----------------------------------------------------------------------- DATOS ENDS ; Fin del segmento de datos ;=========================================================================== ; DECLARACION DEL SEGMENTO DE PILA ;=========================================================================== PILA SEGMENT STACK ; Inicio del segmento de pila ;----------------------------------------------------------------------- DB 64 DUP('PILA') ; Inicialización de la pila ;----------------------------------------------------------------------- PILA ENDS ; Fin del segmento de pila ;=========================================================================== ; DECLARACION DEL SEGMENTO DE CODIGO ;=========================================================================== CODIGO SEGMENT ; Inicio del segmento de código ;----------------------------------------------------------------------- pe01_hol PROC FAR ; Inicio procedimiento p1_hola ;------------------------------------------------------------------- ASSUME CS:CODIGO,DS:DATOS,SS:PILA ; Asignar segmentos ;------------------------------------------------------------------- MOV AX,DATOS ; AX=Dirección del segmento de datos MOV DS,AX ; DS=AX. Indicar el segmento de datos LEA DX,MENSAJE ; DS:DX = dirección de MENSAJE ;------------------------------------------------------------------- MOV AH,9 ; Función DOS para escribir texto en pantalla INT 21H ; Llamar a la interrupción del DOS ;------------------------------------------------------------------- MOV AX,4C00H ; Función para terminar el programa INT 21H ; y volver al DOS ;------------------------------------------------------------------- pe01_hol ENDP ; Fin del procedimiento p1_hola ;----------------------------------------------------------------------- CODIGO ENDS ; Fin del segmento código ;=========================================================================== END pe01_hol ; Empezar a ejecutar el procedimiento p1_hola

PROGRAMA 2

CR EQU 13 LF EQU 10 IMPRIMIR EQU 9 FIN EQU 4C00H DOS EQU 21H ;=========================================================================== ; DECLARACION DEL SEGMENTO DE DATOS ;=========================================================================== DATOS SEGMENT ;----------------------------------------------------------------------- TEXTO DB 'ejemplo del uso de constantes.',CR,LF,'$' ;----------------------------------------------------------------------- DATOS ENDS ;=========================================================================== ; DECLARACION DEL SEGMENTO DE PILA ;=========================================================================== PILA SEGMENT STACK ;----------------------------------------------------------------------- DB 64 DUP('PILA') ;----------------------------------------------------------------------- PILA ENDS ;=========================================================================== ; DECLARACION DEL SEGMENTO DE CODIGO ;=========================================================================== CODIGO SEGMENT ;------------------------------------------------------------------- ASSUME CS:CODIGO,DS:DATOS,SS:PILA ;------------------------------------------------------------------- INICIO: MOV AX,DATOS MOV DS,AX MOV DX,OFFSET TEXTO ; OFFSET retorna la direccion de una variable MOV AH,IMPRIMIR INT DOS MOV AX,FIN INT DOS ;------------------------------------------------------------------- CODIGO ENDS

PROGRAMA 3

CR EQU 13 ; Constante CR (Retorno de carro) En decimal o LF EQU 10 ; Constante LF (Salto de línea) en hexadecimal es igual ;=========================================================================== ; DECLARACION DEL SEGMENTO DE DATOS ;=========================================================================== DATOS SEGMENT ; Inicio del segmento de datos ;----------------------------------------------------------------------- MENSAJE DB CR,LF,'hola mundo! (con Función o Procedimiento)',CR,LF,'$' ;----------------------------------------------------------------------- DATOS ENDS ; Fin del segmento de datos ;=========================================================================== ; DECLARACION DEL SEGMENTO DE PILA ;=========================================================================== PILA SEGMENT STACK ; Inicio del segmento de pila ;----------------------------------------------------------------------- DB 64 DUP('PILA') ; Inicialización de la pila ;----------------------------------------------------------------------- PILA ENDS ; Fin del segmento de pila ;=========================================================================== ; DECLARACION DEL SEGMENTO DE CODIGO ;=========================================================================== CODIGO SEGMENT ; Inicio del segmento de código ;----------------------------------------------------------------------- pe04_hol PROC FAR ; Inicio procedimiento p4_hola2 ;------------------------------------------------------------------- ASSUME CS:CODIGO,DS:DATOS,SS:PILA ; Asignar segmentos ;------------------------------------------------------------------- MOV AX,DATOS ; AX=Dirección del segmento de datos MOV DS,AX ; DS=AX. Indicar el segmento de datos LEA DX,MENSAJE ; DS:DX = dirección de MENSAJE ;------------------------------------------------------------------- CALL ESCRIBE ; Llamar al procedimiento ESCRIBE ;------------------------------------------------------------------- MOV AX,4C00H ; Función para terminar el programa INT 21H ; y volver al DOS ;------------------------------------------------------------------- pe04_hol ENDP ; Fin del procedimiento EJEMPLO ;----------------------------------------------------------------------- ESCRIBE PROC ; Inicio procedimiento ESCRIBE MOV AH,9 ; Función DOS para escribir texto en pantalla INT 21H ; Llamar a la interrupción del DOS RET ; Volver o retornar ESCRIBE ENDP ; Fin del procedimiento ESCRIBE ;---------------------------------------------------------------------- CODIGO ENDS ; Fin del segmento código ;=========================================================================== END pe04_hol ; Empezar a ejecutar el procedimiento p4_hola2

PROGRAMA 5

CR EQU 13 ; Constante CR (Retorno de carro) LF EQU 10 ; Constante LF (Salto de linea) ;=========================================================================== ; DECLARACION DEL SEGMENTO DE DATOS ;=========================================================================== DATOS SEGMENT ; Inicio del segmento de datos ;----------------------------------------------------------------------- LINEA1 DB CR,LF,'Juan Juarez Fuentes',CR,LF,'$' LINEA2 DB 'Cubiculo 25',CR,LF,'$' LINEA3 DB 'Instituto de Computacion',CR,LF,'$' LINEA4 DB 'Universidad tecnológica de la mixteca,CR,LF,'$' ;----------------------------------------------------------------------- DATOS ENDS ; Fin del segmento de datos ;=========================================================================== ; DECLARACION DEL SEGMENTO DE PILA ;=========================================================================== PILA SEGMENT STACK ; Inicio del segmento de pila ;----------------------------------------------------------------------- DB 64 DUP('PILA') ; Inicialización de la pila ;----------------------------------------------------------------------- PILA ENDS ; Fin del segmento de pila ;=========================================================================== ; DECLARACION DEL SEGMENTO DE CODIGO ;=========================================================================== CODIGO SEGMENT ; Inicio del segmento de código ;----------------------------------------------------------------------- p5_iden2 PROC FAR ; Inicio procedimiento p5_iden2 ;------------------------------------------------------------------ ASSUME CS:CODIGO,DS:DATOS,SS:PILA ; Asignar segmentos ;------------------------------------------------------------------- MOV AX,DATOS ; AX=Dirección del segmento de datos MOV DS,AX ; DS=AX. Indicar el segmento de datos LEA DX,LINEA1 ; DS:DX = dirección de LINEA1 ;------------------------------------------------------------------- CALL ESCRIBE ; Llamar al procedimiento ESCRIBE ;------------------------------------------------------------------- LEA DX,LINEA2 ; DS:DX = dirección de LINEA2 ;------------------------------------------------------------------- CALL ESCRIBE ; Llamar al procedimiento ESCRIBE ;------------------------------------------------------------------- LEA DX,LINEA3 ; DS:DX = dirección de LINEA3 ;------------------------------------------------------------------- CALL ESCRIBE ; Llamar al procedimiento ESCRIBE ;------------------------------------------------------------------- LEA DX,LINEA4 ; DS:DX = dirección de LINEA4 ;------------------------------------------------------------------- CALL ESCRIBE ; Llamar al procedimiento ESCRIBE ;------------------------------------------------------------------- MOV AX,4C00H ; Función para terminar el programa

INT 21H ; y volver al DOS ;------------------------------------------------------------------- p5_iden2 ENDP ; Fin del procedimiento p3_iden ;----------------------------------------------------------------------- ESCRIBE PROC ; Inicio procedimiento ESCRIBE MOV AH,9 ; Funcion DOS para escribir texto en pantalla INT 21H ; Llamar a la interrupcion del DOS RET ; Volver o retornar ESCRIBE ENDP ; Fin del procedimiento ESCRIBE ;----------------------------------------------------------------------- CODIGO ENDS ; Fin del segmento codigo ;=========================================================================== END p5_iden2 ; Empezar a ejecutar el procedimiento p5_iden2

PROGRAMA 6

FIN_4C00H EQU 4C00H DOS_21H EQU 21H BIOS_10H EQU 10H PILA SEGMENT STACK DW 100 DUP('0') PILA ENDS ;=========================================================================== ; DECLARACION DEL SEGMENTO DE CODIGO ;=========================================================================== CODIGO SEGMENT ;----------------------------------------------------------------------- pe06_cls PROC FAR ; Inicio procedimiento pe06_cls ;------------------------------------------------------------------- ASSUME CS:CODIGO,SS:PILA ;------------------------------------------------------------------- CALL LIMPIA_PANTALLA ; Llama a procedimiento para limpiar pantalla. ;------------------------------------------------------------------- MOV AX,FIN_4C00H ; Fin del programa INT DOS_21H ;------------------------------------------------------------------- pe06_cls ENDP ; Fin del procedimiento EJEMPLO ;----------------------------------------------------------------------- LIMPIA_PANTALLA PROC NEAR MOV AX,0600H ; Establecer modo texto y CLS MOV BH,0AH ; Colores de fondo (negro=0) y texto (verde=A). MOV CX,0000H ; Desde el inicio de pantalla MOV DX,484FH ; Hasta el fin de la pantalla Reng (48)72 col(79)4F INT BIOS_10H ; Interrupción que llama al BIOS RET LIMPIA_PANTALLA ENDP ;----------------------------------------------------------------------- CODIGO ENDS ;=========================================================================== END pe06_cls

PROGRAMA 7

CR EQU 13 ; Constante CR (Retorno de carro) LF EQU 10 ; Constante LF (Salto de línea) TECLADO_8 EQU 8 IMPRIMIR_9 EQU 9 FIN_4C00H EQU 4C00H DOS_21H EQU 21H BIOS_10H EQU 10H TAB EQU 09H BELL EQU 07H ;=========================================================================== ; DECLARACION DEL SEGMENTO DE DATOS ;=========================================================================== DATOS SEGMENT RENGLON DB 0 COLUMNA DB 0 MENSAJE DB CR,LF,'POSICION (x,y), del mensaje: Hola Mundo !',CR,LF,'$' DATOS ENDS ;=========================================================================== ; DECLARACION DEL SEGMENTO DE DATOS ;=========================================================================== PILA SEGMENT STACK DW 100 DUP('0') PILA ENDS ;=========================================================================== ; DECLARACION DEL SEGMENTO DE CODIGO ;=========================================================================== CODIGO SEGMENT ;----------------------------------------------------------------------- pe07_cur PROC FAR ; Inicio procedimiento pe06_cls ;------------------------------------------------------------------- ASSUME CS:CODIGO,DS:DATOS,SS:PILA ;------------------------------------------------------------------- MOV AX,DATOS ; AX=Dirección del segmento de datos MOV DS,AX ; DS=AX. Indicar el segmento de datos LEA DX,MENSAJE ; DS:DX = dirección de MENSAJE ;------------------------------------------------------------------- CALL POSICIONA_CURSOR ; Llama a procedimiento par posionar cursor. ;------------------------------------------------------------------- MOV AH,IMPRIMIR_9 ; Función DOS para escribir texto en pantalla INT DOS_21H ; Llamar a la interrupción del DOS ;------------------------------------------------------------------- MOV AX,FIN_4C00H ; Fin del programa INT DOS_21H ;------------------------------------------------------------------- pe07_cur ENDP ; Fin del procedimiento EJEMPLO ;----------------------------------------------------------------------- POSICIONA_CURSOR PROC NEAR MOV AH,02 ; Servicio para Fija posicion del Cursor MOV BH,00 ; Numero de pagina o pantalla MOV DH,RENGLON MOV DL,COLUMNA INT BIOS_10H RET POSICIONA_CURSOR ENDP CODIGO ENDS ;=========================================================================== END pe07_cur

PROGRAMA 8

CR EQU 13 ; Constante CR (Retorno de carro) LF EQU 10 ; Constante LF (Salto de línea) TECLADO_8 EQU 8 IMPRIMIR_9 EQU 9 FIN_4C00H EQU 4C00H DOS_21H EQU 21H BIOS_10H EQU 10H TAB EQU 09H BELL EQU 07H ;=========================================================================== ; DECLARACION DEL SEGMENTO DE DATOS ;=========================================================================== DATOS SEGMENT RENGLON DB 0 COLUMNA DB 0 MENSAJE DB CR,LF,'posicion (x,y), del mensaje: Hola Mundo ! ' DB 'Despues de Borrar pantalla.',CR,LF,'$' DATOS ENDS ;=========================================================================== ; DECLARACION DEL SEGMENTO DE DATOS ;=========================================================================== PILA SEGMENT STACK DW 100 DUP('0') PILA ENDS ;=========================================================================== ; DECLARACION DEL SEGMENTO DE CODIGO ;=========================================================================== CODIGO SEGMENT ;----------------------------------------------------------------------- pe08_clp PROC FAR ; Inicio procedimiento pe06_cls ;------------------------------------------------------------------- ASSUME CS:CODIGO,DS:DATOS,SS:PILA ;------------------------------------------------------------------- MOV AX,DATOS ; AX=Dirección del segmento de datos MOV DS,AX ; DS=AX. Indicar el segmento de datos LEA DX,MENSAJE ; DS:DX = dirección de MENSAJE ;------------------------------------------------------------------- CALL LIMPIA_PANTALLA ; Llama a procedimiento par limpiar pantalla. CALL POSICIONA_CURSOR ; Llama a procedimiento par posionar cursor. ;------------------------------------------------------------------- MOV AH,IMPRIMIR_9 ; Función DOS para escribir texto en pantalla INT DOS_21H ; Llamar a la interrupción del DOS ;------------------------------------------------------------------- MOV AX,FIN_4C00H ; Fin del programa INT DOS_21H ;------------------------------------------------------------------- pe08_clp ENDP ; Fin del procedimiento EJEMPLO ;----------------------------------------------------------------------- LIMPIA_PANTALLA PROC NEAR MOV AX,0600H ; Establecer modo texto y CLS MOV BH,0AH ; Colores de fondo (negro=0) y texto (verde=A). MOV CX,0000H ; Desde el inicio de pantalla MOV DX,484FH ; Hasta el fin de la pantalla Reng (48)72 col(79)4F INT BIOS_10H ; Interrupción que llama al BIOS RET LIMPIA_PANTALLA ENDP ;----------------------------------------------------------------------- POSICIONA_CURSOR PROC NEAR MOV AH,02 ; Servicio para Fija posicion del Cursor MOV BH,00 ; Numero de pagina o pantalla MOV DH,RENGLON MOV DL,COLUMNA INT BIOS_10H RET POSICIONA_CURSOR ENDP CODIGO ENDS ;=========================================================================== END pe08_clp ;=============

PROGRAMA 11

CR EQU 13 ; Constante CR (Retorno de carro) LF EQU 10 ; Constante LF (Salto de l?nea) TECLADO EQU 8 IMPRIMIR EQU 9 FIN EQU 4C00H DOS EQU 21H BIOS EQU 10H TAB EQU 09H BELL EQU 07H ;=========================================================================== ; DECLARACION DEL SEGMENTO DE DATOS ;=========================================================================== DATOS SEGMENT NOMBRE DB 30 DUP(32),'$' DIR DB 30 DUP(32),'$' TLF DB 15 DUP(32),'$' MENS1 DB 'NOMBRE : $' MENS2 DB 'DIRECCION: $' MENS3 DB 'TELEFONO : $' ENTERR DB CR,LF,'$' DATOS ENDS ;=========================================================================== ; DECLARACION DEL SEGMENTO DE DATOS ;=========================================================================== PILA SEGMENT STACK DB 64 DUP('PILA') PILA ENDS ;=========================================================================== ; DECLARACION DEL SEGMENTO DE CODIGO ;=========================================================================== CODIGO SEGMENT ;----------------------------------------------------------------------- ASSUME CS:CODIGO,DS:DATOS,SS:PILA INICIO: MOV AX,DATOS ; pone el inicio del segmento de datos en el registro AX MOV DS,AX ; pone el inicio dle segmento de datos en su registro correspondiente ; DS, mediante el registro AX ;------------------------------------------------------------------- CALL MODO_DE_VIDEO ; Establece modo de video ;------------------------------------------------------------------- MOV DX,OFFSET MENS1 ; Imprimir MENS1: 'NOMBRE: ' CALL ESCRIBE ;------------------------------------------------------------------- MOV SI,OFFSET NOMBRE ; Direccion destino del nombre MOV CX,30 ; Longitud del nombre CALL PEDIR ; Solicitud de datos ;------------------------------------------------------------------- CALL SALTO_DE_LINEA ;------------------------------------------------------------------- MOV DX,OFFSET MENS2 ; Imprimir MENS2: 'DIRECCION: ' CALL ESCRIBE ;------------------------------------------------------------------- MOV SI,OFFSET DIR ; Direccion destino de la direcci?n MOV CX,30 ; Longitud de la direccion CALL PEDIR ; Solicitud de datos ;------------------------------------------------------------------- CALL SALTO_DE_LINEA ;------------------------------------------------------------------- MOV DX,OFFSET MENS3 ; Imprimir MENS3 'TELEFONO: ' CALL ESCRIBE ;------------------------------------------------------------------- MOV SI,OFFSET TLF ; Direccion destino del telefono MOV CX,15 ; Longitud del telefono CALL PEDIR ; Solicitud de datos ;------------------------------------------------------------------- MOV DX,OFFSET ENTERR ; Imprimir salto de linea 3 veces CALL ESCRIBE CALL ESCRIBE CALL ESCRIBE ;------------------------------------------------------------------- MOV DX,OFFSET NOMBRE ; Imprimir nombre capturado CALL ESCRIBE ;------------------------------------------------------------------- CALL SALTO_DE_LINEA MOV DX,OFFSET DIR ; Imprimir direccion capturado CALL ESCRIBE ;------------------------------------------------------------------- CALL SALTO_DE_LINEA ;------------------------------------------------------------------- MOV DX,OFFSET TLF ; Imprimir teléfono capturado CALL ESCRIBE ;------------------------------------------------------------------- CALL SALTO_DE_LINEA ;------------------------------------------------------------------- CALL SALIR ; Fin del programa ;----------------------------------------------------------------------- ; Procedimiento PEDIR. Solicita un dato y lo guarda en la memoria ; Entrar en SI la dirección de memoria donde almacenar los datos ; Entrar en CX el número de caracteres del dato ;----------------------------------------------------------------------- PEDIR PROC NEAR ;------------------------------------------------------------------- BUCLE: ;------------------------------------------------------------------- MOV AH,TECLADO ; Leer una tecla INT DOS ;------------------------------------------------------------------- MOV [SI],AL ; Guardar tecla en memoria MOV AH,2 ; Imprimir la tecla o caracter MOV DL,AL INT DOS ;------------------------------------------------------------------- INC SI ; Incrementar puntero de memoria LOOPNZ BUCLE ; Repetir hasta agotar la longitud (Loop While Not Zero) ;------------------------------------------------------------------- RET ;------------------------------------------------------------------- PEDIR ENDP ;----------------------------------------------------------------------- ; Procedimiento ESCRIBE. Escribe en pantalla una cadena ; Entrar en DX la dirección de la cadena o variable con cadena ;----------------------------------------------------------------------- ESCRIBE PROC NEAR MOV AH,IMPRIMIR ; Servicio del DOS para imprimir cadena INT DOS RET ESCRIBE ENDP ;PROCEDIMIENTO QUE IMPRIME SALTO DE LINEA ;----------------------------------------------------------------------- SALTO_DE_LINEA PROC NEAR MOV DX,OFFSET ENTERR CALL ESCRIBE RET SALTO_DE_LINEA ENDP ;---------------------------------------------------------------------- ; ESTABLECE MODO DE VIDEO ;---------------------------------------------------------------------- MODO_DE_VIDEO PROC NEAR MOV AX,3 ; Establecer modo 80x25 car. 16 col. INT BIOS RET MODO_DE_VIDEO ENDP ;---------------------------------------------------------------------- ; TERMINA PROGRAMA ;---------------------------------------------------------------------- SALIR PROC NEAR MOV AX, FIN ;Mueve la instruccion para terminar el programa. INT DOS ;Ejecuta la interrupción. RET SALIR ENDP ;---------------------------------------------------------------------- CODIGO ENDS ;=========================================================================== END INICIO

PROGRAMA 14

CR EQU 13 ; Constante CR (Retorno de carro) En decimal o LF EQU 10 ; Constante LF (Salto de línea) en hex es igual BIOS EQU 10H ; Definición de constantes o símbolos DOS EQU 21H TEXTO EQU 3 FIN EQU 4C00H ;=========================================================================== ; DECLARACION DEL SEGMENTO DE DATOS ;=========================================================================== DATOS SEGMENT ; Inicio del segmento de datos ;----------------------------------------------------------------------- TITULO DB 'ENSAMBLADOR' ; Texto a imprimir COLORES DB 01001110B ; Atributo de 'E' los números binarios se pueden convertir a hexa DB 01101111B ; Atributo de 'N' siendo dos digitos hexa el primero representa el DB 00110001B ; Atributo de 'S' fondo y el segundo el texto. DB 01011100B ; Atributo de 'A' DB 00110001B ; Atributo de 'M' DB 01011111B ; Atributo de 'B' DB 01101011B ; Atributo de 'L' DB 01011100B ; Atributo de 'A' DB 01101111B ; Atributo de 'D' DB 01001110B ; Atributo de 'O' DB 00110001B ; Atributo de 'R' ;----------------------------------------------------------------------- DATOS ENDS ; Fin del segmento de datos ;=========================================================================== ; DECLARACION DEL SEGMENTO DE PILA ;=========================================================================== PILA SEGMENT STACK ; Inicio del segmento de pila ;----------------------------------------------------------------------- DB 64 DUP('PILA') ; Asignar espacio PILA ENDS ; Fin del segmento de pila ;=========================================================================== ; DECLARACION DEL SEGMENTO DE CODIGO ;=========================================================================== CODIGO SEGMENT ; Inicio del segmento de código ;----------------------------------------------------------------------- pe14_col PROC FAR ; Inicio procedimiento pe14_col ;------------------------------------------------------------------- ASSUME CS:CODIGO,DS:DATOS,SS:PILA ; Indicar segmentos MOV AX,DATOS ; Inicializar correctamente el MOV DS,AX ; registro de datos MOV AX,TEXTO ; Establecer modo de texto 80x25 16 colores INT BIOS ; Interrupción BIOS pantalla (10H) MOV CX,11 ; Bucle (11 caracteres) XOR SI,SI ; Contador de caracteres (SI=0) BUCLE: PUSH CX ; Guardar CX (contador de bucle) en pila MOV DX,SI ; DX=SI (DX=contador) ADD DX,35 ; Columna=35+contador MOV DH,12 ; Establecer fila (12) CALL COLOCA ; Colocar el cursor MOV AL,[SI+OFFSET TITULO] ; Obtener carácter MOV BL,[SI+OFFSET COLORES] ; Obtener atributo CALL COLOR ; Imprimir carácter y atributo POP CX ; Recuperar CX (contador de bucle) INC SI ; Incrementar contador o puntero LOOPNZ BUCLE ; Repetir bucle mientras CX no sea 0 MOV AH,8 ; Esperar tecla INT DOS ; Interrupción servicios del DOS (21H) XOR DX,DX ; Situar cursor en 0,0 (DH=0 y DL=0) CALL COLOCA ; Interrupción servicios del DOS (21H) MOV AX,FIN ; Fin del programa INT DOS ; Interrupcion servicios del DOS (21H) pe14_col ENDP ; Fin del procedimiento pe14_col ;----------------------------------------------------------------------- ;---------------------------------------------------------------------- ; Definicion del procedimiento COLOR, que imprime un caracter en color ; Pasar en AL el codigo del caracter, y en BL el atributo ;---------------------------------------------------------------------- COLOR PROC ; Principio del procedimiento COLOR MOV AH,9 ; Servicio que escribe caracter y atrib XOR BH,BH ; Numero de página de video (BH=0) INT BIOS ; Interrupcion BIOS pantalla (10H) RET ; Retornar COLOR ENDP ; Fin del procedimiento COLOR ;---------------------------------------------------------------------- ; Definición del procedimiento COLOCA, que sit£a el cursor en la pantalla ; Pasar en DH la fila y en DL la columna ;---------------------------------------------------------------------- COLOCA PROC ; Principio del procedimiento COLOCA MOV AH,2 ; Servicio que coloca el cursor XOR BX,BX ; Numero de pagina de video (BH=0) INT BIOS ; Interrupcion BIOS pantalla (10H) RET ; Retornar COLOCA ENDP ; Final del procedimiento COLOCA ;---------------------------------------------------------------------- CODIGO ENDS ; Fin del segmento de codigo ;=========================================================================== END pe14_col ; Fin del codigo e indicar direccion comienzo

PROGRAMA 15

CR EQU 13 ; Constante CR (Retorno de carro) LF EQU 10 ; Constante LF (Salto de línea) IMPRIMIR EQU 9 FIN EQU 4C00H DOS EQU 21H TAB EQU 09H BELL EQU 07H ;=========================================================================== ; DECLARACION DEL SEGMENTO DE DATOS ;=========================================================================== DATOS SEGMENT ;----------------------------------------------------------------------- ENCABEZADO DB 13,10,13,TAB,TAB,"=====================================================" DB 13,10,13,TAB,TAB," programa que imprime un valor binario" DB 13,10,13,TAB,TAB,"=====================================================",13,10,"$" VALOR_ASCII DB '21314151', "$" ;----------------------------------------------------------------------- DATOS ENDS ;=========================================================================== ; DECLARACION DEL SEGMENTO DE PILA ;=========================================================================== PILA SEGMENT STACK ;----------------------------------------------------------------------- DB 64 DUP('0') ;----------------------------------------------------------------------- PILA ENDS ;=========================================================================== ; DECLARACION DEL SEGMENTO DE CODIGO ;=========================================================================== CODIGO SEGMENT pe15_asc PROC NEAR ; Inicio procedimiento ;------------------------------------------------------------------- ASSUME CS:CODIGO,DS:DATOS,SS:PILA ;------------------------------------------------------------- MOV AX,DATOS ; AX=Dirección del segmento de datos MOV DS,AX ; DS=AX. Indicar el segmento de datos ;------------------------------------------------------------------- LEA DX, ENCABEZADO ; CARGA ETIQUETA ENCABEZADO CALL ESCRIBE ; IMPRIME CONTENIDO DE ETIQUETA ;------------------------------------------------------------------- LEA DX, VALOR_ASCII ; CARGA ETIQUETA VALOR_ASCII CALL ESCRIBE ; IMPRIME CONTENIDO DE ETIQUETA ;------------------------------------------------------------- CALL SALIR ; FUNCION SALIAR ;------------------------------------------------------------------- pe15_asc ENDP ; Fin del procedimiento ;----------------------------------------------------------------------- ESCRIBE PROC ; Inicio procedimiento ESCRIBE MOV AH,9 ; Función DOS para escribir texto en pantalla INT 21H ; 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 instrucción para terminar el programa. INT DOS ;Ejecuta la interrupción. RET SALIR ENDP ;---------------------------------------------------------------------- CODIGO ENDS ;=========================================================================== END pe15_asc

PROGRAMA 16

CR EQU 13 ; Constante CR (Retorno de carro) LF EQU 10 ; Constante LF (Salto de línea) IMPRIMIR EQU 9 FIN EQU 4C00H DOS EQU 21H TAB EQU 09H BELL EQU 07H ;=========================================================================== ; DECLARACION DEL SEGMENTO DE DATOS ;=========================================================================== DATOS SEGMENT ;----------------------------------------------------------------------- ENCABEZADO DB 13,10,13,TAB,TAB,"=====================================================" DB 13,10,13,TAB,TAB," programa que imprime valores numericos dec y hexa" DB 13,10,13,TAB,TAB,"=====================================================",13,10,"$" VALOR_1 DW 41D, "$" ; VALOR_2 DW 42D, "$" ; VALOR_3 DW 43D, "$" ; VALOR_4 DW 44D, "$" ; VALOR_5 DW 45D, "$" ; EN DECIMAL SE PUEDE PONER UNA "D" AL FINAL O NO. VALOR_6 DW 46, "$" ; VALOR_7 DW 47, "$" ; VALOR_8 DW 48, "$" ; VALOR_9 DW 49, "$" ; VALOR_10 DW 50, "$" ;------------------------------ VALOR_11 DW 31H, "$" ;------------------------------ VALOR_12 DW 32H, "$" ; VALOR_13 DW 33H, "$" ; VALOR_14 DW 34H, "$" ; VALOR_15 DW 35H, "$" ; VALOR_16 DW 36H, "$" ; EN HEXA ES NECESARIO PONER UNA "H" VALOR_17 DW 37H, "$" VALOR_18 DW 38H, "$" ; VALOR_19 DW 39H, "$" ; VALOR_20 DW 40H, "$" ; ;----------------------------------------------------------------------- DATOS ENDS ;=========================================================================== ; DECLARACION DEL SEGMENTO DE PILA ;=========================================================================== PILA SEGMENT STACK ;----------------------------------------------------------------------- DB 64 DUP('0') ;----------------------------------------------------------------------- PILA ENDS ;=========================================================================== ; DECLARACION DEL SEGMENTO DE CODIGO ;=========================================================================== CODIGO SEGMENT ;----------------------------------------------------------------------- pe16_dhe PROC NEAR ; Inicio procedimiento ;------------------------------------------------------------------- ASSUME CS:CODIGO,DS:DATOS,SS:PILA ;------------------------------------------------------------- MOV AX,DATOS ; AX=Dirección del segmento de datos MOV DS,AX ; DS=AX. Indicar el segmento de datos ;------------------------------------------------------------------- LEA DX, ENCABEZADO ; CARGA ETIQUETA ENCABEZADO CALL ESCRIBE ; IMPRIME CONTENIDO DE ETIQUETA ;------------------------------------------------------------------- LEA DX, VALOR_1 ; CARGA ETIQUETA VALOR_1 CALL ESCRIBE ; IMPRIME CONTENIDO DE ETIQUETA ;------------------------------------------------------------------- ;------------------------------------------------------------------- LEA DX, VALOR_2 ; CARGA ETIQUETA VALOR_2 CALL ESCRIBE ; IMPRIME CONTENIDO DE ETIQUETA ;------------------------------------------------------------------- ;------------------------------------------------------------------- LEA DX, VALOR_3 ; CARGA ETIQUETA VALOR_3 CALL ESCRIBE ; IMPRIME CONTENIDO DE ETIQUETA ;------------------------------------------------------------------- ;------------------------------------------------------------------- LEA DX, VALOR_4 ; CARGA ETIQUETA VALOR_4 CALL ESCRIBE ; IMPRIME CONTENIDO DE ETIQUETA ;------------------------------------------------------------------- LEA DX, VALOR_5 ; CARGA ETIQUETA VALOR_5 CALL ESCRIBE ; IMPRIME CONTENIDO DE ETIQUETA ;------------------------------------------------------------------- ;------------------------------------------------------------------- LEA DX, VALOR_6 ; CARGA ETIQUETA VALOR_6 CALL ESCRIBE ; IMPRIME CONTENIDO DE ETIQUETA ;------------------------------------------------------------------- ;------------------------------------------------------------------- LEA DX, VALOR_7 ; CARGA ETIQUETA VALOR_7 CALL ESCRIBE ; IMPRIME CONTENIDO DE ETIQUETA ;------------------------------------------------------------------- ;------------------------------------------------------------------- LEA DX, VALOR_8 ; CARGA ETIQUETA VALOR_8 CALL ESCRIBE ; IMPRIME CONTENIDO DE ETIQUETA ;------------------------------------------------------------------- ;------------------------------------------------------------------- LEA DX, VALOR_9 ; CARGA ETIQUETA VALOR_9 CALL ESCRIBE ; IMPRIME CONTENIDO DE ETIQUETA ;------------------------------------------------------------------- ;------------------------------------------------------------------- LEA DX, VALOR_10 ; CARGA ETIQUETA VALOR_10 CALL ESCRIBE ; IMPRIME CONTENIDO DE ETIQUETA ;------------------------------------------------------------------- ;------------------------------------------------------------------- LEA DX, VALOR_11 ; CARGA ETIQUETA VALOR_11 CALL ESCRIBE ; IMPRIME CONTENIDO DE ETIQUETA ;------------------------------------------------------------------- ;------------------------------------------------------------------- LEA DX, VALOR_12 ; CARGA ETIQUETA VALOR_12 CALL ESCRIBE ; IMPRIME CONTENIDO DE ETIQUETA ;------------------------------------------------------------------- ;------------------------------------------------------------------- LEA DX, VALOR_13 ; CARGA ETIQUETA VALOR_13 CALL ESCRIBE ; IMPRIME CONTENIDO DE ETIQUETA ;------------------------------------------------------------------- ;------------------------------------------------------------------- LEA DX, VALOR_14 ; CARGA ETIQUETA VALOR_14 CALL ESCRIBE ; IMPRIME CONTENIDO DE ETIQUETA ;------------------------------------------------------------------- ;------------------------------------------------------------------- LEA DX, VALOR_15 ; CARGA ETIQUETA VALOR_15 CALL ESCRIBE ; IMPRIME CONTENIDO DE ETIQUETA LEA DX, VALOR_16 ; CARGA ETIQUETA VALOR_16 CALL ESCRIBE ; IMPRIME CONTENIDO DE ETIQUETA ;------------------------------------------------------------------- ;------------------------------------------------------------------- LEA DX, VALOR_17 ; CARGA ETIQUETA VALOR_17 CALL ESCRIBE ; IMPRIME CONTENIDO DE ETIQUETA ;------------------------------------------------------------------- ;------------------------------------------------------------------- LEA DX, VALOR_18 ; CARGA ETIQUETA VALOR_18 CALL ESCRIBE ; IMPRIME CONTENIDO DE ETIQUETA ;------------------------------------------------------------------- ;------------------------------------------------------------------- LEA DX, VALOR_19 ; CARGA ETIQUETA VALOR_19 CALL ESCRIBE ; IMPRIME CONTENIDO DE ETIQUETA ;------------------------------------------------------------------- ;------------------------------------------------------------------- LEA DX, VALOR_20 ; CARGA ETIQUETA VALOR_20 CALL ESCRIBE ; IMPRIME CONTENIDO DE ETIQUETA ;------------------------------------------------------------------- ;------------------------------------------------------------- CALL SALIR ; FUNCION SALIAR ;------------------------------------------------------------------- pe16_dhe ENDP ; Fin del procedimiento ;----------------------------------------------------------------------- ESCRIBE PROC ; Inicio procedimiento ESCRIBE MOV AH,9 ; Función DOS para escribir texto en pantalla INT 21H ; 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. RET SALIR ENDP ;---------------------------------------------------------------------- CODIGO ENDS ;=========================================================================== END pe16_dhe

PROGRAMA 17

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 ;================

PROGRAMA 19

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 ENCABEZADO DB 13,10,13,10,TAB,TAB,"=====================================================" DB 13,10,13,TAB,TAB," PROGRAMA QUE IMPRIME NUMEROS EN HEXADECIMAL" DB 13,10,13,TAB,TAB,"=====================================================",13,10,13,10,"$" DATOS ENDS ;=========================================================================== ; DECLARACION DEL SEGMENTO DE PILA ;=========================================================================== PILA SEGMENT STACK 'STACK' DB 64 DUP('0') PILA ENDS ;=========================================================================== ; DECLARACION DEL SEGMENTO DE CÓDIGO ;=========================================================================== CODIGO SEGMENT ; Inicio del segmento de código ;----------------------------------------------------------------------- pe19_hex PROC NEAR ; Inicio procedimiento pe17_hex ;------------------------------------------------------------------- ASSUME CS:CODIGO, SS:PILA, DS:DATOS ORG 100H ;------------------------------------------------------------------- MOV AX,DATOS ; AX=Dirección del segmento de datos MOV DS,AX ; DS=AX. Indicar el segmento de datos LEA DX, ENCABEZADO ; DS:DX = dirección de LINEA1 CALL ESCRIBE ;------------------------------------------------------------------- MOV CX, 200H ; Número de veces a repetir el ciclo XOR DX, DX ; DX = 0 CICLO: CALL ESCRIBE_HEX ; Imprime el valor en DX CALL ESCRIBE_CRLF ; Hacer un salto de linea INC DX ; Incrementar DX LOOP CICLO ; Regresa al ciclo ;------------------------------------------------------------------- CALL SALIR ; Salimos del programa ;------------------------------------------------------------------- pe19_hex ENDP ; Fin del procedimiento pe15_cbi ;----------------------------------------------------------------------- ;---------------------------------------------------------------------- ; Imprime en Hexadecimal. ; Entrada: DX palabra con el valor a mostrar. ; Llama: ESCRIBE_DIGITO_HEX ;---------------------------------------------------------------------- ESCRIBE_HEX PROC NEAR PUSH AX ; Guardar en el stack los registros que PUSH CX ; se utilizaron en el procedimiento, para PUSH DX ; no perder sus valores. MOV CX,4 ; CX = 4 número de digitos a imprimir. OTRO_DIGITO: ; El ciclo se ejecuta una vez por dígito. PUSH CX ; Guarda el contador del ciclo. MOV CL,4 ROL DX,CL ; Rotar el número 4 bits a la izquierda, DX contiene en su nibble mas bajo, el dígito. CALL ESCRIBE_DIGITO_HEX ; Imprime el dígito POP CX ; Recupera el contador del ciclo. LOOP OTRO_DIGITO ; Hacer el ciclo. POP DX ; Recupera los registros guardados en POP CX ; el stack POP AX RET ; Regresar del procedimiento. ESCRIBE_HEX ENDP ;----------------------------------------------------------------------- ; Escibe un dígito Hexadecimal. ; Entrada: DL el nibble menos significativo de DL, el valor del dígito. ; Llama: ;---------------------------------------------------------------------- ESCRIBE_DIGITO_HEX PROC NEAR PUSH AX ; Guarda los registros que queremos preservar. PUSH DX AND DX,0FH ; Apagar el nibble más alto. CMP DL,10 ; Compara con 10. JAE ES_MAYOR_A_10 ; Si es mayo o igual salta. ADD DL,48 ; Suma 48 para imprimir su ASCII si es 0,...9. JMP IMPRIME_DIGITO ES_MAYOR_A_10: ADD DL,55 ; Suma 55 para imprimir su ASCII si es A...F. IMPRIME_DIGITO: MOV AH,2 ; Servicio para imprimir un caracter. INT 21H ; Llamar a DOS. POP DX ; Recuperar los registros. POP AX RET ; Regresar dle procedimiento. ESCRIBE_DIGITO_HEX ENDP ;---------------------------------------------------------------------- ; Hace un CR y un LF ; Entrada: ; Llama: ;---------------------------------------------------------------------- ESCRIBE_CRLF PROC NEAR PUSH AX PUSH DX MOV AH,2 ; Servicio par aimprimir un caracter. MOV DL,13 ; Caracter 13 = CR INT 21H ; Llamar a DOS. MOV DL,10 ; Caracter 10 = LF. INT 21H ; Llamar a DOS. POP DX POP AX RET ; Regresar del procedimiento. ESCRIBE_CRLF ENDP ;---------------------------------------------------------------------- ESCRIBE PROC ; Inicio procedimiento ESCRIBE MOV AH,9 ; Función DOS para escribir texto en pantalla INT 21H ; 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. RET SALIR ENDP ;---------------------------------------------------------------------- CODIGO ENDS ;=========================================================================== END pe19_hex ;===================


Featured Review
Vuelve pronto
Una vez que se publiquen entradas, las verás aquí.
Tag Cloud
No hay etiquetas aún.
bottom of page