top of page

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


Estrategia de Negocios

 

CURSO GRATUITO 
(Valuado en 250 )
 

Aprende todo lo que necesitas saber sobre cómo hacer una estrategia de negocios exitosa.

Business Plan

Writing A-Z

 
FREE COURSE
(Valued at $250)
 

Learn all you need in order to create a

stellar business plan for your endeavor!

Mi Libro
 

Párrafo. Haz clic aquí para agregar tu texto y editar. Permite que tus usuarios te conozcan.

Búsqueda por Tags
No hay tags aún.
  • Facebook Black Round
  • Google+ Black Round
  • Tumblr Black Round

© 2023 por TuCamino. Creado con Wix.com

  • Facebook Black Round
  • Google+ Black Round
  • Tumblr Black Round
bottom of page