Ejercicios TASM
Ejemplo 1: Hola mundo
1: ;=========================================================================== 2: ;=========================================================================== 3: ; PROGRAMA : pe01_hol.asm
4: ; FUNCION : ESCRITURA DE UNA FRASE EN PANTALLA
5: ; REALIZADO POR : prof. Juan Juárez Fuentes
6: ; COMPILADOR EN EL QUE SE EJECUTO: TASM 5.0
7: ; FECHA : 200910141034
8: ;=========================================================================== 9: ;=========================================================================== 10: ; DECLARACION DE CONSTANTES
11: ;=========================================================================== 12: CR EQU 13 ; Constante CR (Retorno de carro) En decimal o
13: LF EQU 0Ah ; Constante LF (Salto de línea) en hex es igual
14: ;=========================================================================== 15: ; DECLARACION DEL SEGMENTO DE DATOS
16: ;=========================================================================== 17: DATOS SEGMENT ; Inicio del segmento de datos
18: ;-----------------------------------------------------------------------
19: MENSAJE DB CR,LF,'¡ Hola Mundo !',CR,LF,'$'
20: ;-----------------------------------------------------------------------
21: DATOS ENDS ; Fin del segmento de datos
22: ;=========================================================================== 23: ; DECLARACION DEL SEGMENTO DE PILA
24: ;=========================================================================== 25: PILA SEGMENT STACK ; Inicio del segmento de pila
26: ;-----------------------------------------------------------------------
27: DB 64 DUP('PILA') ; Inicialización de la pila
28: ;-----------------------------------------------------------------------
29: PILA ENDS ; Fin del segmento de pila
30: ;=========================================================================== 31: ; DECLARACION DEL SEGMENTO DE CODIGO
32: ;=========================================================================== 33: CODIGO SEGMENT ; Inicio del segmento de código
34: ;-----------------------------------------------------------------------
35: pe01_hol PROC FAR ; Inicio procedimiento p1_hola
36: ;-------------------------------------------------------------------
37: ASSUME CS:CODIGO,DS:DATOS,SS:PILA ; Asignar segmentos
38: ;-------------------------------------------------------------------
39: MOV AX,DATOS ; AX=Dirección del segmento de datos
40: MOV DS,AX ; DS=AX. Indicar el segmento de datos
41: LEA DX,MENSAJE ; DS:DX = dirección de MENSAJE
42: ;-------------------------------------------------------------------
43: MOV AH,9 ; Función DOS para escribir texto en pantalla
44: INT 21H ; Llamar a la interrupción del DOS
45: ;-------------------------------------------------------------------
46: MOV AX,4C00H ; Función para terminar el programa
47: INT 21H ; y volver al DOS
48: ;-------------------------------------------------------------------
49: pe01_hol ENDP ; Fin del procedimiento p1_hola
50: ;-----------------------------------------------------------------------
51: CODIGO ENDS ; Fin del segmento código
52: ;=========================================================================== 53: END pe01_hol ; Empezar a ejecutar el procedimiento p1_hola
54: ;=========================================================================== 55: ;=========================================================================== 56: ;===========================================================================
Ejemplo 2: Uso de constantes
1: ;=========================================================================== 2: ;=========================================================================== 3: ; PROGRAMA : pe02_con.asm
4: ; FUNCION : Ejemplifica eñ uso de constantes.
5: ; REALIZADO POR : Prof. Juan Juárez Fuentes
6: ; COMPILADOR EN EL QUE SE EJECUTO: TASM 5.0
7: ; FECHA : 200910141034
8: ;=========================================================================== 9: ;=========================================================================== 10: ; DECLARACION DE CONSTANTES
11: ;=========================================================================== 12: CR EQU 13
13: LF EQU 10
14: IMPRIMIR EQU 9
15: FIN EQU 4C00H
16: DOS EQU 21H
17: ;=========================================================================== 18: ; DECLARACION DEL SEGMENTO DE DATOS
19: ;=========================================================================== 20: DATOS SEGMENT
21: ;-----------------------------------------------------------------------
22: TEXTO DB 'Ejemplo del uso de constantes.',CR,LF,'$'
23: ;-----------------------------------------------------------------------
24: DATOS ENDS
25: ;=========================================================================== 26: ; DECLARACION DEL SEGMENTO DE PILA
27: ;=========================================================================== 28: PILA SEGMENT STACK
29: ;-----------------------------------------------------------------------
30: DB 64 DUP('PILA')
31: ;-----------------------------------------------------------------------
32: PILA ENDS
33: ;=========================================================================== 34: ; DECLARACION DEL SEGMENTO DE CODIGO
35: ;=========================================================================== 36: CODIGO SEGMENT
37: ;-------------------------------------------------------------------
38: ASSUME CS:CODIGO,DS:DATOS,SS:PILA
39: ;-------------------------------------------------------------------
40: INICIO: MOV AX,DATOS
41: MOV DS,AX
42: MOV DX,OFFSET TEXTO ; OFFSET retorna la direcci¢n de una variable
43: MOV AH,IMPRIMIR
44: INT DOS
45: MOV AX,FIN
46: INT DOS
47: ;-------------------------------------------------------------------
48: CODIGO ENDS
49: ;=========================================================================== 50: END INICIO
51: ;=========================================================================== 52: ;=========================================================================== 53: ;===========================================================================
Ejemplo 4: hola mundo con procedimiento
1: ;=========================================================================== 2: ;=========================================================================== 3: ; PROGRAMA : pe04_hol.asm
4: ; FUNCION : ESCRITURA DE UNA FRASE EN PANTALLA HECHA
5: ; : CON PROCEDIMIENTO.
6: ; REALIZADO POR : Prof. Juan Juárez Fuentes
7: ; COMPILADOR EN EL QUE SE EJECUTO: TASM 5.0
8: ; FECHA : 200910281344
9: ;=========================================================================== 10: ;=========================================================================== 11: ; DECLARACION DE CONSTANTES
12: ;=========================================================================== 13: CR EQU 13 ; Constante CR (Retorno de carro) En decimal o
14: LF EQU 10 ; Constante LF (Salto de línea) en hex es igual
15: ;=========================================================================== 16: ; DECLARACION DEL SEGMENTO DE DATOS
17: ;=========================================================================== 18: DATOS SEGMENT ; Inicio del segmento de datos
19: ;-----------------------------------------------------------------------
20: MENSAJE DB CR,LF,'Hola Mundo ! (con Funcion o Procedimiento)',CR,LF,'$'
21: ;-----------------------------------------------------------------------
22: DATOS ENDS ; Fin del segmento de datos
23: ;=========================================================================== 24: ; DECLARACION DEL SEGMENTO DE PILA
25: ;=========================================================================== 26: PILA SEGMENT STACK ; Inicio del segmento de pila
27: ;-----------------------------------------------------------------------
28: DB 64 DUP('PILA') ; Inicialización de la pila
29: ;-----------------------------------------------------------------------
30: PILA ENDS ; Fin del segmento de pila
31: ;=========================================================================== 32: ; DECLARACION DEL SEGMENTO DE CODIGO
33: ;=========================================================================== 34: CODIGO SEGMENT ; Inicio del segmento de código
35: ;-----------------------------------------------------------------------
36: pe04_hol PROC FAR ; Inicio procedimiento p4_hola2
37: ;-------------------------------------------------------------------
38: ASSUME CS:CODIGO,DS:DATOS,SS:PILA ; Asignar segmentos
39: ;-------------------------------------------------------------------
40: MOV AX,DATOS ; AX=Dirección del segmento de datos
41: MOV DS,AX ; DS=AX. Indicar el segmento de datos
42: LEA DX,MENSAJE ; DS:DX = dirección de MENSAJE
43: ;-------------------------------------------------------------------
44: CALL ESCRIBE ; Llamar al procedimiento ESCRIBE
45: ;-------------------------------------------------------------------
46: MOV AX,4C00H ; Función para terminar el programa
47: INT 21H ; y volver al DOS
48: ;-------------------------------------------------------------------
49: pe04_hol ENDP ; Fin del procedimiento EJEMPLO
50: ;-----------------------------------------------------------------------
51: ESCRIBE PROC ; Inicio procedimiento ESCRIBE
52: MOV AH,9 ; Función DOS para escribir texto en pantalla
53: INT 21H ; Llamar a la interrupción del DOS
54: RET ; Volver o retornar
55: ESCRIBE ENDP ; Fin del procedimiento ESCRIBE
56: ;----------------------------------------------------------------------
57: CODIGO ENDS ; Fin del segmento código
58: ;=========================================================================== 59: END pe04_hol ; Empezar a ejecutar el procedimiento p4_hola2
60: ;===========================================================================
61: ;=========================================================================== 62: ;===========================================================================
Ejemplo 5: Identidad con procedimiento
1:;========================================================================= 2:;=========================================================================
3: ; PROGRAMA : pe05_id2.asm
4: ; FUNCION : ESCRITURA DE UN CONJUNTO DE DE LINEAS EN
5: ; : PANTALLA CON PROCEDIMIENTO.
6: ; REALIZADO POR : Prof. Juan Juárez Fuentes
7: ; COMPILADOR EN EL QUE SE EJECUTO: TASM 5.0
8: ; FECHA : 20091028125136
9: ;========================================================================= 10:======================================================================== 11: ; DECLARACION DE CONSTANTES
12: CR EQU 13 ; Constante CR (Retorno de carro)
13: LF EQU 10 ; Constante LF (Salto de línea)
14: ;=========================================================================== 15: ; DECLARACION DEL SEGMENTO DE DATOS
16: ;=========================================================================== 17: DATOS SEGMENT ; Inicio del segmento de datos
18: ;-----------------------------------------------------------------------
19: LINEA1 DB CR,LF,'Juan Juárez Fuentes',CR,LF,'$'
20: LINEA2 DB 'Cubiculo 25',CR,LF,'$'
21: LINEA3 DB 'Instituto de Computación',CR,LF,'$'
22: LINEA4 DB 'UNIVERSIDAD TECNOLÓGICA DE LA MIXTECA',CR,LF,'$'
23: ;-----------------------------------------------------------------------
24: DATOS ENDS ; Fin del segmento de datos
25: ;=========================================================================== 26: ; DECLARACION DEL SEGMENTO DE PILA 27: ;===========================================================================
28: PILA SEGMENT STACK ; Inicio del segmento de pila
29: ;-----------------------------------------------------------------------
30: DB 64 DUP('PILA') ; Inicialización de la pila
31: ;-----------------------------------------------------------------------
32: PILA ENDS ; Fin del segmento de pila
33: ;=========================================================================== 34: ; DECLARACION DEL SEGMENTO DE CODIGO
35: ;=========================================================================== 36: CODIGO SEGMENT ; Inicio del segmento de código
37: ;-----------------------------------------------------------------------
38: p5_iden2 PROC FAR ; Inicio procedimiento p5_iden2
39: ;-------------------------------------------------------------------
40: ASSUME CS:CODIGO,DS:DATOS,SS:PILA ; Asignar segmentos
41: ;-------------------------------------------------------------------
42: MOV AX,DATOS ; AX=Dirección del segmento de datos
43: MOV DS,AX ; DS=AX. Indicar el segmento de datos
44: LEA DX,LINEA1 ; DS:DX = dirección de LINEA1
45: ;-------------------------------------------------------------------
46: CALL ESCRIBE ; Llamar al procedimiento ESCRIBE
47: ;-------------------------------------------------------------------
48: LEA DX,LINEA2 ; DS:DX = dirección de LINEA2
49: ;-------------------------------------------------------------------
50: CALL ESCRIBE ; Llamar al procedimiento ESCRIBE
51: ;-------------------------------------------------------------------
52: LEA DX,LINEA3 ; DS:DX = dirección de LINEA3
53: ;-------------------------------------------------------------------
54: CALL ESCRIBE ; Llamar al procedimiento ESCRIBE
55: ;-------------------------------------------------------------------
56: LEA DX,LINEA4 ; DS:DX = dirección de LINEA4
57: ;-------------------------------------------------------------------
58: CALL ESCRIBE ; Llamar al procedimiento ESCRIBE
59: ;-------------------------------------------------------------------
60: MOV AX,4C00H ; Función para terminar el programa
Ejemplo 6: Borrar pantalla
1:;=========================================================================
2:;========================================================================= 3: ; PROGRAMA : pe06_cls.asm
4: ; FUNCION : Limpia pantalla
5: ; REALIZADO POR : Prof. Juan Juárez Fuentes
6: ; COMPILADOR EN EL QUE SE EJECUTO: TASM 5.0
7: ; FECHA : 20121029173658
8: ;========================================================================= 9: ; DECLARACION DE CONSTANTES
10: ;======================================================================== 11: FIN_4C00H EQU 4C00H
12: DOS_21H EQU 21H
13: BIOS_10H EQU 10H
14: ;======================================================================== 15: ; DECLARACION DEL SEGMENTO DE DATOS
16: ;======================================================================== 17: ;
18: ;======================================================================== 19: ; DECLARACION DEL SEGMENTO DE DATOS
20: ;======================================================================== 21: PILA SEGMENT STACK
22: DW 100 DUP('0')
23: PILA ENDS
24: ;======================================================================== 25: ; DECLARACION DEL SEGMENTO DE CODIGO
26: ;======================================================================== 27: CODIGO SEGMENT
28: ;-----------------------------------------------------------------------
29: pe06_cls PROC FAR ; Inicio procedimiento pe06_cls
30: ;-------------------------------------------------------------------
31: ASSUME CS:CODIGO,SS:PILA
32: ;-------------------------------------------------------------------
33: CALL LIMPIA_PANTALLA ; Llama a procedimiento par limpiar pantalla.
34: ;-------------------------------------------------------------------
35: MOV AX,FIN_4C00H ; Fin del programa
36: INT DOS_21H
37: ;-------------------------------------------------------------------
38: pe06_cls ENDP ; Fin del procedimiento EJEMPLO
39: ;-----------------------------------------------------------------------
40: LIMPIA_PANTALLA PROC NEAR
41: MOV AX,0600H ; Establecer modo texto y CLS
42: MOV BH,0AH ; Colores de fondo (negro=0) y texto (verde=A).
43: MOV CX,0000H ; Desde el inicio de pantalla
44: MOV DX,484FH ; Hasta el fin de la pantalla Reng (48)72 col(79)4F
45: INT BIOS_10H ; Interrupción que llama al BIOS
46: RET
47: LIMPIA_PANTALLA ENDP
48: ;-----------------------------------------------------------------------
49: CODIGO ENDS
50: ;========================================================================
51: END pe06_cls
52: ;======================================================================== 53: ;======================================================================== 54: ;========================================================================
Ejemplo 7: posiciona cursor
;=========================================================================== ;=========================================================================== ; PROGRAMA : pe07_cur.asm ; FUNCION : Posiciona el cursor en cordenada determinada. ; REALIZADO POR : Prof. Juan Juárez Fuentes ; COMPILADOR EN EL QUE SE EJECUTO: TASM 5.0 ; FECHA : 20121029183654 ;=========================================================================== ; DECLARACION DE CONSTANTES ;=========================================================================== 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 ;=========================================================================== ;=========================================================================== ;===========================================================================
Ejemplo 8: CLS y posiciona cursor
;=========================================================================== ;=========================================================================== ; PROGRAMA : pe08_clp.asm ; FUNCION : Borra pantalla y posiciona cursor. ; REALIZADO POR : Prof. Juan Juárez Fuentes ; COMPILADOR EN EL QUE SE EJECUTO: TASM 5.0 ; FECHA : 20121029182723 ;=========================================================================== ; DECLARACION DE CONSTANTES ;=========================================================================== 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 ;=========================================================================== ;=========================================================================== ;===========================================================================
Ejemplo 11: Datos
;=========================================================================== ;=========================================================================== ; PROGRAMA : pe11_dt1.asm ; FUNCION : Pide tres datos hasta agotar la longitud de cada uno. ; REALIZADO POR : Prof. Juan Juárez Fuentes ; COMPILADOR EN EL QUE SE EJECUTO: TASM 5.0 ; FECHA : 20091110104058 ;=========================================================================== ; DECLARACION DE CONSTANTES ;=========================================================================== 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 telefono 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 ;=========================================================================== ;=========================================================================== ;===========================================================================
Ejemplo 14: letrero con colores
;=========================================================================== ;=========================================================================== ; PROGRAMA : pe14_col.asm ; FUNCION : Imprime un texto utilizando colores. ; REALIZADO POR : Prof. Juan Juárez Fuentes ; COMPILADOR EN EL QUE SE EJECUTO: TASM 5.0 ; FECHA : 20091111175644 ;=========================================================================== ;=========================================================================== ; DECLARACION DE CONSTANTES ;=========================================================================== 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 ; Definicion de constantes o simbolos 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 numeros 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 caracter MOV BL,[SI+OFFSET COLORES] ; Obtener atributo CALL COLOR ; Imprimir caracter 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 ; Interrupcion servicios del DOS (21H) XOR DX,DX ; Situar cursor en 0,0 (DH=0 y DL=0) CALL COLOCA ; Interrupcion 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 pagina 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 ;=========================================================================== ;=========================================================================== ;===========================================================================
Ejemplo 15: Valor área de datos
;=========================================================================== ;=========================================================================== ; PROGRAMA : pe15_asc.asm ; FUNCION : Programa que imprime un valor del área de ; : datos (ASCII). ; REALIZADO POR : Prof. Juan Juárez Fuentes ; COMPILADOR EN EL QUE SE EJECUTO: TASM 5.0 ; FECHA : 20121211103120 ;=========================================================================== ;=========================================================================== ; DECLARACION DE CONSTANTES ;=========================================================================== 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 instruccion para terminar el programa. INT DOS ;Ejecuta la interrupción. RET SALIR ENDP ;---------------------------------------------------------------------- CODIGO ENDS ;=========================================================================== END pe15_asc ;=========================================================================== ;=========================================================================== ;===========================================================================
Ejemplo 16: imprimir numeros decimales y hexadecimales
;=========================================================================== ;=========================================================================== ; PROGRAMA : pe16_dhe.asm ; FUNCION : IMPRIME VALORES NUMÉRICOS DECIMALES Y HEXA. ; REALIZADO POR : Prof. Juan Juárez Fuentes ; COMPILADOR EN EL QUE SE EJECUTO: TASM 5.0 ; FECHA : 20121211112639 ;=========================================================================== ;=========================================================================== ; DECLARACION DE CONSTANTES ;=========================================================================== 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 ;=========================================================================== ;===========================================================================
Ejemplo 17: conversion de caracteres ASCII a su correspondiente binario
;=========================================================================== ;=========================================================================== ; 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 ;=========================================================================== ;=========================================================================== ;===========================================================================
Ejemplo 19: Imprime numeros en hexadecimal
;=========================================================================== ;=========================================================================== ; PROGRAMA : pe19_hex.asm ; FUNCION : Programa que imprime números en Hexadecimal. ; REALIZADO POR : Prof. Juan Juárez Fuentes ; COMPILADOR EN EL QUE SE EJECUTO: TASM 5.0 ; FECHA : 201211185236 ;=========================================================================== ; 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 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. SALIR ENDP ;---------------------------------------------------------------------- CODIGO ENDS ;=========================================================================== END pe19_hex ;=========================================================================== ;=========================================================================== ;===========================================================================
Ejemplo 23: convierte valor ASCII a numero binario
;=========================================================================== ;=========================================================================== ; PROGRAMA : pe23_asb.asm ex p13_nbin.asm ; FUNCION : COMVIERTE UN NUMERO ASCII A BINARIO POR ; : METODO D ELAS POTENCIAS. (CANTIDAD COMO CONSTANTE) ; REALIZADO POR : Prof. Juan Juárez Fuentes ; COMPILADOR EN EL QUE SE EJECUTO: TASM 5.0 ; FECHA : 2009102813442201212095339 ;=========================================================================== ;=========================================================================== ; DESCRIPCIÓN DEL FUNCIONAMIENTO ;=========================================================================== ; Cuando un ususario interactua con una computadora, lo que esta recibe por ; medio del teclado son caracteres ASCII. Cuando la computadora parocesa la ; cantidad, la ordena en los registros y memoria en binario, pero binario ; ASCII y si se requaiere hacer operaciones con esos digitos entonces es ; necesario hacer un amanipulacion de digito por digito para convertirlo a ; binario base dos. Ademas se tiene que tomar en cuanta la longitud de la ; cantidad porque puede ser necesario ir al último digito y retroceder hacia ; el primero para su proceso. ; Por ejemplo el número 33 que en ascii es el ! en binario debe ser después ; del proceso de los dos dígitos el 100001. ;=========================================================================== ; DECLARACION DE CONSTANTES ;=========================================================================== 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,10,TAB,TAB,"=====================================================" DB 13,10,13,TAB,TAB," PROGRAMA QUE CONVIERTE UN NUMERO ASCII A BINARIO" DB 13,10,13,TAB,TAB,"=====================================================",13,10,"$" VALOR_ASCII DB '33', "$" ;10 0001 que en ascii es el ! y por tanto la conversión a binario estaria bien hecha. VALOR_BINARIO DW 0, "$" LONGITUD_ASCII DW 2, "$" POTENCIA_10 DW 00000001B, "$" ;----------------------------------------------------------------------- DATOS ENDS ;=========================================================================== ; DECLARACION DEL SEGMENTO DE PILA ;=========================================================================== PILA SEGMENT STACK ;----------------------------------------------------------------------- DB 64 DUP('0') ;----------------------------------------------------------------------- PILA ENDS ;=========================================================================== ; DECLARACION DEL SEGMENTO DE CODIGO ;=========================================================================== CODIGO SEGMENT ;----------------------------------------------------------------------- pe23_asb 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, VALOR_ASCII CALL ESCRIBE ;------------------------------------------------------------- MOV BX, 00001010B MOV CX, LONGITUD_ASCII LEA SI, VALOR_ASCII+1 ; VALOR_ASCII TOMA EL VALOR DEL PRIMER DIGITO, PERO NECESITMAOS TOMAR EL ÚLTOMO, EN ESTE ETIQUETA_1: ; CASO SON DOS DÍGITOS PUES INCFEMENTAMOS SOLO UNA POSICIÓN PARA LLEGAR AL DÍGITO FINAL. MOV AL, [SI] AND AX, 000FH ; SÓLO DEJA EL VALOR DE AL Y BORRA LO DEMÁS. MUL POTENCIA_10 ; MULTIPLICA ESTE OPERADOR POR EL CONTENIDO DEL REGISTRO AH O AX SEGUN EL CASO ADD VALOR_BINARIO, AX MOV AX, POTENCIA_10 MUL BX ; MULTIPLICA ESTE OPERADOR POR EL CONTENIDO DEL REGISTRO AH O AX SEGUN EL CASO MOV POTENCIA_10, AX DEC SI LOOP ETIQUETA_1 ;------------------------------------------------------------------- LEA DX, ENCABEZADO CALL ESCRIBE ;------------------------------------------------------------------- LEA DX, VALOR_BINARIO CALL ESCRIBE ;------------------------------------------------------------- CALL SALIR ;------------------------------------------------------------------- pe23_asb 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 pe23_asb ;=========================================================================== ;=========================================================================== ;===========================================================================
Ejemplo 24: Convierte valor ASCII capturado a numero binario
;=========================================================================== ;=========================================================================== ; PROGRAMA : pe24_as2.asm ex p14_nbin.asm ; FUNCION : COMVIERTE UN NUMERO ASCII A BINARIO, Y ; : LA CANTIDAD SE CAPTURA. ; REALIZADO POR : Prof. Juan Juárez Fuentes ; COMPILADOR EN EL QUE SE EJECUTO: TASM 5.0 ; FECHA : 2009120909395820121213132818 ;=========================================================================== ;=========================================================================== ; DECLARACION DE CONSTANTES ;=========================================================================== 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 TECLADO EQU 8 ;=========================================================================== ; DECLARACION DEL SEGMENTO DE DATOS ;=========================================================================== DATOS SEGMENT NUMERO_BINARIO DW 0,"$" NUMERO_ASCII DB 6,0,6 DUP (?),"$" ;Variable que almacena la cantidad uno. M_ENCABEZADO DB 13,10,13,10,TAB,"============================================================" DB 13,10,13,TAB,"PROGRAMA QUE CONVIERTE UN NUMERO ASCII (CAPTURADO) A BINARIO" DB 13,10,13,TAB,"============================================================",13,10,"$" M_ESPACIO DB 13,10,13,10,13,10,13,10,13,10,13,10,"$" M_ASCII_ASCII DB 13,10,13,10,"NUMERO ASCII IMPRESO NORMALMENTE COMO LO HACE UNA PC (EN ASCII)",13,10,"$" M_BINARIO_ASCII DB 13,10,13,10,"NUMERO BINARIO (YA CONVERTIDO), ",13,10,"IMPRESO NORMALMENTE COMO LO HACE UNA PC (EN ASCII): ","$" ;------------------------------------------------------------- ; Tabla de potencias usada para convertir el resultado binario de la ; operacion en formato ASCII. Se usan las potencias de 10 (1,10,100,1000 ; y 10000), porque el numero mas grande es 65535. En caso de que quiera ; operar sobre numeros mas grandes amplie la tabla. ;------------------------------------------------------------- Potencia DW 001H, 000AH, 0064H, 03E8H, 2710H, "$" ;----------------------------------------------------------------------- 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 ;----------------------------------------------------------------------- pe24_as2 PROC NEAR ; Inicio procedimiento ;------------------------------------------------------------------- ASSUME CS:CODIGO, SS:PILA, DS:DATOS MOV AX, DATOS MOV DS, AX ;----------------------------------------------------------------------- MOV AH, 0AH ; Captura la cantidad (hasta 8 digitos) MOV DX, Offset NUMERO_ASCII INT 21h ;----------------------------------------------------------------------- MOV DI, Offset NUMERO_ASCII + 1 ; Bytes leidos de la cantidad 1 MOV CX, [DI] ; NUMERO DE DIGITOS MOV SI, Offset NUMERO_ASCII + 2 ; La cantidad 1 XOR CH, CH ; CH = 0 MOV DI, Offset POTENCIA ; Direccion de la tabla de potencias DEC SI ; Posiciona Si En el primer byte de la cadena capturada y 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 ; lee la cadena en forma inversa: es decir, de atras hacia adelante. XOR BX, BX ; BORRA BX STD ; PONE LA BANDERA DE DIRECCION EN UNO 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 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 ; transferencia es de bytes o 2 si la transferencia es de palabras. LODSB PARA BYTE, LODSW PARA PALABRA. SUB AL, 30h ; Convierte el digito de ascii a binario CBW ; Convierte a palabra, PONE EN CEROS LAPARTE ALTA DEL REGISTRO AX. La instrucción CBW (convertir byte a palabra) permite convertir un ; número de 8 bits con signo en AL en un número de 16 bits con signo en AX. MOV DX, [DI] ; Obtiene la potencia de 10 que sera usada para multiplicar, MUL DX ; Multiplica numero y lo suma a Bx ADD DI, 2 ; Va a la siguiente potencia de 10 ADD BX, AX ; ACUMULA LA SUMA EN BX. LOOP CICLO ; Itera hasta que Cx sea = 0. MOV NUMERO_BINARIO,BX ; PONE EL RESULTADO EN MEMORIA ;----------------------------------------------------------------------- ;----------------------------------------------------------------------- LEA DX, M_ENCABEZADO ; PONE EL ENCABEZADO DEL PROGRAMA CALL ESCRIBE ;----------------------------------------------------------------------- ;----------------------------------------------------------------------- LEA DX, M_ASCII_ASCII ; LETRERO PARA EL NUMERO ASCII CALL ESCRIBE ;----------------------------------------------------------------------- LEA DX, NUMERO_ASCII - 1 ; EL NUMERO ASCII CALL ESCRIBE ;----------------------------------------------------------------------- ;----------------------------------------------------------------------- LEA DX, M_BINARIO_ASCII ; LETRERO PARA EL NUMERO BINARIO CALL ESCRIBE ;----------------------------------------------------------------------- LEA DX, NUMERO_BINARIO ; EL NUMERO BINARIO CALL ESCRIBE ;----------------------------------------------------------------------- ;----------------------------------------------------------------------- LEA DX, M_ESPACIO ; IMPRIME LINEAS DE ESPACIO CALL ESCRIBE ;----------------------------------------------------------------------- ;----------------------------------------------------------------------- CALL SALIR ; TERMINA ;----------------------------------------------------------------------- pe24_as2 ENDP ; Fin del procedimiento ;----------------------------------------------------------------------- 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 pe24_as2 ;=========================================================================== ;=========================================================================== ;===========================================================================