You are on page 1of 4

Programación en Ensamblador

Ejemplo del uso del teclado y la pantalla


Carlos F. Jiménez P.
Cali Julio 9 de 2005

;En ensamblador se deben definir los segmentos de memoria donde se alojaran el código, ;los datos y la pila.

;-El código son las instrucciones que se da al microprocesador


;-Los datos son tablas y espacio para variables.
;-El segmento de stack es un área de pila de memoria la cual usa el procesador para ;
;almacenar las direcciones de memoria para retornar después de instrucciones call o
;interrupciones, también puede ser usada por el usuario para guardar datos mediante las
;instrucciones push y pop.

;Comenzamos por definir el segmento de pila o stack reservando para este 256 bytes.
STACK SEGMENT PARA STACK 'STACK'
DB 256 DUP(0) ;256 BYTES DE ESPACIO EN EL STACK
STACK ENDS
ASSUME CS:COD ,DS:COD

;Ahora comienza el segmento de codigo


COD SEGMENT

;Primero declaramos algunas variables

; Convenciones
;Instrucciones del procesador o compilador en mayúscula normal ejemplo “MOV AX,BX”
;identificadores o datos insertados por el usuaria en cursiva “oprima enter”

;Vamos a declarar los mensajes que aparecerán en pantalla durante la ejecución del ;programa la sintaxis es la
siguiente

; nombre_de_cadena DB 'Mensaje','$'
;el $ es porque en asm toda cadena debe terminar con este caracter

POR DB 'Ejemplo del uso del teclado y la pantalla ','$'


POR2 DB 'Presentado por Carlos F. Jiménez. Cali Julio 9 de 2005,'$'
MES DB 'ESCRIBA UN CARACTER=> ','$'
ME DB 'CARACTER INVALIDO!!!!','$'
RESPMIN DB 'USTED OPRIMIO UNA MINUSCULA ESTA EL LA MAYUSCULA
CORRESPONDIENTE: ','$'
RESPMAY DB 'LA LETRAS MAYUSCULA QUE USTED OPRIMIO FUE: ','$'
RESPNUM DB 'EL NUMERO OPRIMIDO FUE: ','$'
P DB 0

; Ahora comenzamos con el procedimiento principal, es algo así como el main( ) en C,.
; por aquí se comienza a ejecutar el un programa escrito en asm.

MAIN PROC FAR

;
MOV AX,CS ;se pasa a AX la dirección del segmento de codigo
MOV DS,AX ;Se asigna al segmento de datos la misma dirección del segmento
;de código osea segmentos de código y datos se solapan
;esto es importante para poder usar algunas funciones que requieren
;que los datos estén en el segmento de datos con datos que se
;encuentran en el segmento de codigo.

; Desplegar los mensajes de portada del programa,


; Para desplegar un mensaje en pantalla se debe cargar en el registro DX al offset de la cadena de
;caracteres esto se logra mediante la instrucción MOV DX, OFFSET nombre_de_a_cadena
;luego se invoca a la función 09 de la interrupción 21H.
;Este tipo de interrupciones si es que se les puede llamar así porque en realidad forman parte del
;flujo normal del progre, son una colección de funciones del sistema operativo o del BIOS que
;permite realizar varias funciones como por ejemplo acceder al disco, escribir en pantalla, leer el
;teclado, etc.
; Para invocarlas normalmente se escribe en AH el número de la función a usar y se invoca la interrupción
; mediante el comando INT, por ejemplo INT21H

MOV AH,09H ;Queremos invocar la función 09 de la INT 21H para imprimir en pantalla
MOV DX, OFFSET POR ;Movemos a DX el offset del mensaje POR
INT 21H ;Invocamos la interrupción 21.
CALL RETOR ;Insertamos un RETURN para pasar a la otra línea

MOV DX, OFFSET POR2 ;Movemos a DX el offset del mensaje POR2


INT 21H ;Invocamos la interrupción 21 de nuevo
CALL RETOR ;Insertamos un RETURN para pasar a la otra línea

; Ahora entramos en el bucle principal

MAIN1:

; Se despliega el mensaje ESCRIBA UN CARACTER=>

MOV AH,09H
MOV DX, OFFSET MES
INT 21H

;Ahora capturamos una letra del teclado mediante la función 1 de la INT 21H.
;El carácter capturado queda almacenado en el registro AL

MOV AH,1
MOV DL,0FFH
INT 21H ; LEE EL CARACTER DEL TECLADO
CALL RETOR ; RETURN

; Verificamos si el carácter que se introdujo es el “?” 3FH, si es asi saltamos al FIN del programa
CMP AL,3FH ;CMP Compara dos registros
JE FIN ;JE Salta si en la ultima comparación los registro eran iguales

;A continuación se identifica si el carácter es una letra mayúscula, minúscula, un numero o un símbolo.


;Para lograr esto se debe tener en cuenta los siguiente:
; 2Fh<Números<3Ah
; 40h<Mayúsculas<5bh
; 60h<Minúsculas<7b
; Símbolos todos lo otros

CMP AL,30H ;Es un símbolo?


JB ERROR ;El comando JB salta si el registro a la izquierda es menor que el de la derecha

CMP AL,3AH
JB NUM ;Es un numero

CMP AL,41H
JB ERROR ;Es un símbolo

CMP AL,5BH
JB MAY ;Es una mayúscula

CMP AL,61H
JB ERROR ;Es un símbolo

CMP AL,7BH
JB MINU ;Es una minúscula

JMP ERROR ;Es un símbolo

ERROR:MOV AH,09H ; Procedimiento de error, se tecleo un símbolo o carácter no valido


MOV DX,OFFSET ME ;Se despliega el mensaje de error
INT 21H
JMP MAIN1 ;Se regresa al bucle principal

;PROCEDIMIENTO PARA MAYUSCULAS

MAY:
push ax; ;Guardamos AX,en la pila aunque en este caso no es necesario es una
;buena costumbre que siempre se guarde el contenido de los registros
; principales al llamar un procedimiento o subrutina.

MOV AH,09H ;Desplegamos el mensaje:


; “ 'LA LETRAS MAYUSCULA QUEUSTED OPRIMIO FUE”

MOV DX, OFFSET RESPMAY


INT 21H
pop ax ;Se re establece AX sacandolo de la pila
;Invocamos la función 06 de la interrupción 21H para imprimir en pantalla
;una sola letra que se encuentra almacenada en el registro DL
MOV AH,06H ;Función 06
MOV DL,AL ;Movemos la letra que estaba en AL a DL para imprimirla en pantalla
INT 21H ;Invocamos la función 21H
CALL RETOR ;Inserta un RETURN
JMP MAIN1 ;Salta al bucle principal

;PROCEDIMIENTO PARA NÚMEROS


NUM:
push ax ;
MOV AH,09H
MOV DX, OFFSET RESPNUM
INT 21H
pop ax
MOV AH,06H
MOV DL,AL
INT 21H
CALL RETOR
JMP MAIN1

; PROCEDIMIENTO PARA MINÚSCULAS


;Este procedimiento convierte las minúsculas a mayúsculas restándoles 20h a su valor ASCII

MINU:
push ax
MOV AH,09H
MOV DX, OFFSET RESPMIN
INT 21H
pop ax
MOV AH,06H
SUB AL,20H ; Convierte a mayúscula
MOV DL,AL
INT 21H
CALL RETOR
JMP MAIN1

PORTADA:

JMP MAIN1

FIN:
MOV AH,4CH ;Siempre antes de salir se invoca la función 4Ch de la INT 21h para
; retornar el control al sistema operativo.
INT 21H

MAIN ENDP

RETOR PROC NEAR ; TECLA RETURN


PUSH AX
MOV AH,06H
MOV DL,0DH
INT 21H ; RETORNO DE CARRO
MOV AH,06H
MOV DL,0AH
INT 21H ; ALIMENTACION DE LINEA
POP AX
RET
RETOR ENDP

COD ENDS
END MAIN

You might also like