Está en la página 1de 28

Assembly

Registros 8086

Registros de x86 (post-386) son de 32 bits (menos los de


segmento), se agrega una E
EAX, EBX, ECX, EDX
Estructura Programa Assembly
Indica el tipo de programa
.MODEL small que es, valoresstack
Inicializa dependen de
en direccin
assembler
indicada, necesario si se usar
.STACK 200h stack (push, pop). Puede no
Inicializa zonaindicarse
de datos,unesvalor y se asigna
.DATA opcional (algunos assembler
direccin automticamente
usan DATASEG)
; Aqu se definen variables y datos
Indica inicio zona de cdigo
.CODE (algunos assembler usan
CODESEG)
; Aqu viene el cdigo
Label que indica inicio del
START: main del programa
; Aqu est el cdigo
END START
Cmo ver el contenido de los registros?

Iniciar una sesin DOS

Teclear la orden DEBUG

Cuando aparezca el prompt -,


Pulsar r y Enter.

Para salir escribir q


Interrupciones

Una interrupcin es una operacin que suspende


la ejecucin de un programa de modo que el
sistema pueda realizar una accin especial.
Se ejecuta la rutina de interrupcin
Regresa el control al procedimiento que fue
interrumpido, el cual entonces reasume su ejecucin.
Interrupciones - Ubicacin

BIOS y DOS
Localidades de memoria 000h 3FFh
256 (100h) interrupciones posibles
Cada una de 4 bytes
Los 4 bytes representa el lugar donde se encuentra
ubicado el procedimiento a realizar por la interrupcin
Interrupciones - Llamada

Al llamar a una interrupcin el contenido del registro de


flags, el CS, y el IP son guardados en el stack.

Dos bytes son guardados en el IP y los otros dos en el


CS.

Se ejecuta la interrupcin.

Finalmente es devuelta con la instruccin IRET, que


vuelve a cargar los valores guardados en el stack y
contina el programa.
Interrupciones - Tipos

Externas Generadas por un agente externo al


procesador (disco duro, teclado, etc)

Internas Provocadas por el programa en


ejecucin.
Llamar a la instruccin INT
Realizar una divisin por 0
Realizar una peticin de una interrupcin externa.
Interrupciones - Ejemplos

UBICACION TIPO DESCRIPCIN


INT 09h Externa Interrupcin provocada por presionar o soltar
una tecla en el teclado.
INT 0Bh, INT 0Ch Externa Controla los puertos seriales COM2 y COM1.

INT 0Dh, INT 0Fh Externa Controla los puertos paralelos LPT1 y LPT2.

INT 20h Interna Finaliza la ejecucin de un programa


devolvindole el control al SO.
INT 21h Interna Peticin de funcin al DOS.
INT 05h Interna Imprime el contenido de la pantalla.
INT 04h Interna Desbordamiento de la memoria.
Interrupciones de Hardware

Todas aquellas que son producidas por un


hardware externo.

Estas interrupciones son manejadas por el


Controlador de Interrupciones (PIC 8259).

Los PC normales poseen 2 8259 conectados en


cascada a travs del IRQ 2.
Interrupciones de Hardware
IRQ 0 Temporizador (INT 08h)
IRQ 1 Teclado (INT 09h)
IRQ 2 En los PC/XT: canal E/S (INT 0Ah)
IRQ 8 Reloj de tiempo real (INT 70h)
IRQ 9 Simulacin de IRQ2 (INT 71h)
IRQ 10 Reservado (INT 72h)
IRQ 11 Reservado (INT 73h)
IRQ 12 Reservado (INT 74h)
IRQ 13 Coprocesador aritmtico (INT 75h)
IRQ 14 Controlador de disco duro (INT 76h)
IRQ 15 Reservado (INT 77h)
IRQ 3 COM2 (INT 0Bh)
IRQ 4 COM1 (INT 0Ch)
IRQ 5 Disco duro PC/XT (LPT2 en el AT) (INT 0Dh)
IRQ 6 Controlador de disquetes (INT 0Eh)
IRQ 7 LPT1 (INT 0Fh)
Interrupciones de Hardware

Las interrupciones en el 8259 pueden habilitarse


o deshabilitarse.

Para comunicarse con el primero se utilizan los


puertos 20h y 21h

Para el segundo 0A0h y 0A1h.


Interrupciones de Hardware
Cuando se procesa una interrupcin de hardware el
Registro de Interrupciones Activas (ISR) indica que
interrupcin en concreto se est realizando.

Con ello si llegara otra interrupcin de hardware con


menor o igual prioridad no se ejecutar.

Por esto al terminar de procesar la interrupcin es


importante limpiar el ISR para que no quede bloqueado
el sistema.
La forma de hacerlo es pasndole un 20h a 20h y a 0A0h:
MOV AL, 20h
OUT 20h, AL
OUT 0A0h, AL
Interrupciones de Hardware

La activacin de las interrupciones es a travs de


los puertos 21h y 0a1h respectivamente.

Se enva un byte que contiene la habilitacin de


cada una de las interrupciones
1 significa deshabilitada
0 implica que est habilitada
Interrupciones de Hardware
Por ejemplo:
IN AL, 0A1h
AND AL, 11111110b
OUT 0A1h, AL
IN AL, 21h
AND AL, 11111011b
OUT 21h, AL

La primera parte habilita la interrupcin 0 del segundo PIC, la que


equivale a la IRQ8 que es la que maneja el timer.

La segunda parte habilita la interrupcin 2 del primer PIC, lo que es


necesario para que se encuentren disponibles las interrupciones del
segundo PIC.
Interrupciones de Hardware
Tambin podemos indicar al sistema que ejecute un cdigo
especificado por nosotros al ocurrir una interrupcin.

Para ello debemos sobrescribir la direccin donde se encuentra


mapeada dicha interrupcin.

Por ejemplo si lo que queremos es que el sistema ejecute un


procedimiento al ocurrir una interrupcin del timer, debemos
sobrescribir la posicin 70h (IRQ8) de la siguiente forma:
XOR AX, AX
MOV ES, AX
MOV ES:[70h*4], OFFSET procedimiento
MOV ES:[70h*4+2], CS

En este caso le indicamos al sistema que ejecute el procedimiento


para la IRQ8.
Escribimos en los 2 bytes el offset de la ubicacin del cdigo
En los siguientes 2 el segmento donde se encuentra
Interrupciones - RTC

El RTC (Real Time Clock) es muy til de utilizar cuando


necesitamos hacer acciones peridicas.

Consta de 4 registros A, B, C y D que se identifican con


0Ah, 0Bh, 0Ch y 0Dh.
El registro A contiene entre otras cosas el encendido o apagado
del RTC (bits 5, 6 y 7) y la asignacin de la frecuencia, mediante
los 4 primeros bits y siguiendo lo definido en la Tabla que se
presenta a continuacin.
El registro B permite habilitar las interrupciones peridicas
mediante el bit 6, cuando se encuentra con valor 1.
El registro C posee una serie de flags que pueden ser accedidos
para ver el estado de ciertas acciones.
El registro D no se utiliza.
Interrupciones - RTC
Interrupciones - RTC
La forma de acceder a los registros es la siguiente:
Se escribe en la posicin 70h el valor del registro al cual se
quiere acceder.
Luego en la posicin 71h queda el valor del registro si se quiere
leer, o escribir.

Por ejemplo:
MOV AL, 0Ah
OUT 70h, AL
MOV AL, 2Fh
OUT 71h, AL

Escribe en el registro A el valor 2Fh, que significa que


est encendido el RTC (010) y que oscila cada medio
segundo (1111 ver Tabla).
Assembly en PC

Para compilar usaremos Turbo Assembler


TASM
TLINK

Abrir una ventana de comando


TASM nombreArchivo.asm
TLINK nombreArchivo.obj
Ejemplo 1 Leer el teclado

Escribir un programa que lea el ltimo carcter


presionado en el teclado y lo muestre en
pantalla. En caso de presionarse la tecla E el
programa debe terminar.
Ejemplo 1 Leer el teclado
.MODEL SMALL
.STACK
.CODE
START:
MOV ah, 00h ; Pone 00h en ah. Esto es para usar esa funcin
INT 16h ; Llama a la interrupcin 16h. El carcter
; ledo queda guardado en AL
MOV dl, al ; Carga el contenido de AL en DL
MOV ah, 02h ; Para usar la funcin 02h
INT 21h ; Llama a la interrupcin 21h, que
; con los valores dados, despliega el carcter
; en la pantalla
CMP dl, e ; Compara el carcter con e
JNE START ; Si no es igual vuelve a Start
MOV ax, 4C00h
INT 21h ; FIN
END START
Ejemplo 2 Escribir en Pantalla

Escribir un programa que escriba en pantalla


cada medio segundo el mensaje IIC2342
Estoy escribiendo
Puerto Paralelo

Est mapeado a memoria


Cmo sabe direccin en memoria?
Mi PC Propiedades
Etiqueta Hardware Administrador de Dispositivos
Puertos (COM & LPT) Doble Click LPT1
Etiqueta Recursos Intervalo E/S

Generalmente direccin 0378h


Puerto Paralelo
Desde Windows NT los puertos se encuentran
bloqueados
Error de privilegios
No es posible accederlos directamente

Solucin
Usar libreras existentes
Puerto Paralelo Inpout32

inpout32.dll
Permite acceso a puertos para win32
Out32(short puerto, short dato)
Int32(short puerto)

Puede ser usada directamente en assembler o


desde C++
Puerto Paralelo Inpout32
Cmo usarla en C++?
Agregar inpout32.lib al proyecto

Al comienzo
short _stdcall Inp32(short PortAddress);
void _stdcall Out32(short PortAddress, short data);

Luego
Ponemos todos los bits del puerto en 0

__asm
{
MOV EDX, puerto
MOV EAX, 0
PUSH EAX
PUSH EDX
CALL Out32
}

Puerto Paralelo Inpout32

__asm
{
MOV EDX, puerto
PUSH EDX
CALL Inp32 ; Lo ledo queda en EAX

MOV EDX, puerto


MOV ECX, Ox00000010 ; 4
OR EAX, ECX

PUSH EAX
PUSH EDX
CALL Out32
}

Pone un 1 en el bit 2 del puerto

También podría gustarte