Sunteți pe pagina 1din 54

MICROPROCESADORES Y CONTROL DE

PERIFÉRICOS
ENSAMBLADORES
LENGUAJE ENSAMBLADOR
•Ensambladores
•Directivas del lenguaje ensamblador
•Creación y depuración de programa
•Ejemplos básicos
•Formatos de memoria
•Interrupciones DOS
LENGUAJE DE MÁQUINA
El lenguaje de máquina es el lenguaje con el que trabaja la
computadora. Este lenguaje binario posee reglas de composición de
instrucciones y los programas con este lenguaje son reconocidos por el
microprocesador.
El lenguaje de máquina no puede ser ejecutado por otro
microprocesador de arquitectura distinta o que no sea compatible.
LENGUAJE DE MÁQUINA
El lenguaje de máquina es sin embargo un lenguaje difícil de manejar
por el programador, se presta para cometer errores en la escritura de
instrucciones y en el cálculo de direcciones.
Existe sin embargo una correspondencia uno a uno entre las
instrucciones del lenguaje de máquina y las del lenguaje ensamblador.
El ensamblador es un programa que permite escribir programas en lenguaje
ENSAMBLADORES
ensamblador y agrega un conjunto de pseudo-operaciones (directivas) que
sirven para definir datos y rutinas que facilitan la tarea de programar.
Los ensambladores convierten las rutinas escritas en lenguaje ensamblador en
lenguaje de máquina para formar el código objeto y cambian toda referencia
simbólica (etiquetas) por las direcciones o datos correspondientes.
ENSAMBLADORES
Los ensambladores permiten al programador utilizar el lenguaje
ensamblador para escribir los programas.
Para crear el programa ejecutable a partir del código objeto, se requiere
llamar a otros programas y servicios del sistema operativo y agregar
rutinas de run-time. Este proceso se conoce como link.
Eventualmente se puede utilizar el Debugger para ejecutar paso a paso
el programa ejecutable.
ENSAMBLADORES
Existen 2 ensambladores muy usados:
•Macro Assembler de Microsoft (MASM).
•Turbo Assembler de Borland (TASM).
La diferencia entre los ensambladores radica en la forma de generar el
código y en las directivas con que cuenta, pero en general las
diferencias son mínimas.
DIRECTIVAS DEL
ENSAMBLADOR
Las directivas del lenguaje ensamblador indican la forma en se va a
procesar un programa. Algunas directivas generan y almacenan
información en memoria.
Por ejemplo: la directiva DB (definir byte) almacena bytes de datos en
memoria; la directiva BYTE PTR (puntero de byte) indica más bien el
tamaño de los datos a los que un apuntador o registro índice hace
referencia.
DIRECTIVAS DEL
ENSAMBLADOR
El ensamblador acepta por omisión las instrucciones del 8086, a menos
que un programa esté precedido de la directiva .386 ó .386P ó por algún
otro modificador de selección del microprocesador.
Una lista de algunas directivas básicas se dan en la siguiente tabla.
DIRECTIVAS
.MODEL Selecciona el modelo de programación

.STARTUP Indica el inicio del programa cuando se


utilizan modelos de programa
.EXIT Regresa al DOS

ASSUME Informa al ensamblador del nombre de cada


segmento para definir segmento completo
OFFSET Especifica una dirección de desplazamiento

PROC Inicia un procedimiento


DIRECTIVAS
SEGMENT Inicia un segmento

STACK Inicio del segmento de pila

BYTE Indica tamaño de Byte; al igual que BYTE


PTR
DB Define un dato de 8 bits

DW Define un dato de 16 bits

DD Define un dato de 32 bits


DIRECTIVAS
DQ Define un dato de 64 bits

DT Define un dato de 10 Bytes (80 bits)

DUP Genera duplicados

DWORD Indica tamaño de palabra doble; al igual que


DWORD PTR
EQU Relaciona datos con etiqueta

NEAR Define un puntero cercano


DIRECTIVAS
FAR Define un puntero lejano

ORG Establece el inicio dentro de un segmento

MACRO Señala el inicio de una secuencia de macros

PTR Designa un puntero

STRUC Define el inicio de una estructura de datos

WORD Indica el tamaño de palabra; así como


WORD PTR
DIRECTIVAS
END Finaliza un archivo de programa

ENDM Finaliza una secuencia de macros

ENDP Finaliza un procedimiento

ENDS Finaliza un segmento o estructura de datos

.386 Reconoce las instrucciones del 386

.386P Reconoce las instrucciones del 386 en el modo


protegido
DIRECTIVAS
.586 Reconoce las instrucciones del Pentium

.586P Reconoce las instrucciones del Pentium en el


modo protegido
EL USO DEL TASM
El Turbo Assembler de Borland (TASM) tiene varias versiones. En su
versión más simple debe considerar los siguientes archivos:
C:>\Tasm\
Tasm.exe
Tlink.exe
También se pueden agregar los archivos Td.exe y rtm.exe para
depuración.
EL USO DEL TASM
•Para escribir un programa se puede usar el editor del DOS:
C: > \TAsm\edit
Escribir el programa y guardar como
<nombre>.asm dentro de \TAsm\
También se puede utilizar el notepad2.
•Para obtener el archivo objeto:
C:>\TAsm\Tasm <nombre>
se crea el archivo <nombre>.obj
EL USO DEL TASM
•Para obtener el archivo ejecutable:
C:>\TAsm\Tlink <nombre>
se crea el archivo <nombre>.exe
•Se puede utilizar el depurador (Debug) del sistema operativo para
revisar los programas ejecutables en lenguaje de máquina o para
ejecutarlos paso a paso. También es posible revisar el contenido del
segmento de datos y del segmento de pila.
•A continuación, algunos programas básicos:
EJEMPLO 01
.model small
.stack 100h
.code
main proc
mov dl, “A”
mov ah,2
int 21h
mov ah,4Ch
int 21h
main endp
end main
EJEMPLO 01
En este programa contiene varias directivas pertenecientes al TASM
además de las instrucciones que permite el lenguaje ensamblador del
procesador.
El programa empieza con la directiva “.model small” que significa que se
va a utilizar para este programa un espacio de memoria del tipo “small”
de acuerdo al formato de memoria.
FORMATOS DE MEMORIA
MODELO CODIGOS DATOS PILA
Tiny (diminuto) 64KB
Small (pequeño) 64KB 64KB
Medium (mediano) 1MB 64KB

Compact 64KB 1MB


(compacto)
Large (grande) 1MB 1MB
Huge (enorme) 1MB 64KB 64KB
EJEMPLO 01
Al elegir “model small” se le indica al sistema que
se va a separar un espacio de memoria de 64KB
para el segmento de códigos y de 64KB para los
datos y la pila.
El modelo “tiny” se utiliza para los programas del
tipo *.com, en tanto que los otros modelos se usan
para los programas exe.
EJEMPLO 01
Luego viene la directiva “.stack 100h”, que inicia la pila
y separa dentro del espacio reservado para datos 256
bytes.
La directiva “.code” permite iniciar el segmento de
códigos, dentro del cual se pueden escribir varias
rutinas.
En este programa no figuran datos y por tanto no se
inicia el segmento de datos.
El programa termina con “end” y se agrega el nombre
del procedimiento con el que empieza el programa.
EJEMPLO 01
El programa en sí aparece entre las expresiones “main proc” y “main
endp”.
Cualquier rutina debe tener un nombre, en este caso “main”.
La rutina pudo haberse llamado con otro nombre, por ejemplo
“pancho”.
Entonces la rutina empieza después de la fórmula “pancho proc” y
termina con “pancho endp”.
EJEMPLO 01
Las tres primeras instrucciones de la rutina imprimen en la pantalla la
letra “A”. Para ello se utiliza “int 21h” que es una interrupción del DOS.
Esta interrupción actúa siempre con el contenido del registro AH.
Cuando AH=2, entonces significa que el contenido del registro DL será
enviado al monitor. Por esta razón se carga previamente DL con el
código ASCII de la letra A.
EJEMPLO 01
En el Tasm, el código ASCII de un caracter puede referirse escribiendo el
caracter entre comillas.
Las dos últimas instrucciones sirven para terminar el programa principal
y devolver el control al sistema operativo.
Más adelante se da una tabla con algunas interrupciones INT 21h.
EJEMPLO 01
Al compilar el programa recordando la secuencia:
C:>\TAsm\ Tasm ejem01
C:>\TAsm\ Tlink ejem01
Se puede ejecutar directo ejem01.exe;
pero también se puede ejecutar paso a paso con el debug:
C:>\TAsm\ debug ejem01.exe
EJEMPLO 01
C:\Tasm>debug ejem01.exe
-u
15D4:0000 B241 MOV DL,41
15D4:0002 B409 MOV AH,09
15D4:0004 CD21 INT 21
15D4:0006 B44C MOV AH,4C
15D4:0008 CD21 INT 21
15D4:000A FFFF ??? DI
EJEMPLO 01
Obsérvese que el programa está constituido por las cinco primera líneas
a partir de CS:0000, las demás líneas tienen información de la memoria
que no va a ser ejecutada.
También se puede visualizar el segmento de datos y el segmento de
pila, los registros y las banderas. Se puede ejecutar paso a paso. Estas
son las facilidades del Debug.
EJEMPLO 01
Nótese que, (al apelar al comando “u” del debug), se observa que en las
cinco líneas del programa hay una columna para las direcciones, otra
columna para el lenguaje de máquina y otra para el listado en lenguaje
ensamblador.
Igualmente se ve que en la primera instrucción ya no aparece “A” sino el
correspondiente código ASCII de “A”; también que no figuran las sufijos
“h” que indicas cantidad hexadecimal.
EJEMPLO 02
; Este programa visualiza en el mov ah,9
monitor una cadena de caracteres
lea dx,mensaje
int 21h
.model small
mov ah,4Ch
.stack 100h
int 21h
.code
main endp
main proc
.data
mov ax,@data
mensaje db ‘Hola camaron con
mov ds,ax cola',0dh,0ah,‘$’
end main
EJEMPLO 02
Este programa tiene una estructura parecida al del ejemplo anterior, sin
embargo se introduce esta vez el segmento de datos con una
información:
mensaje db “Hola camaron con cola”,0Dh,0Ah,“$”
•Se trata de una cadena de datos del tamaño de 1byte cada uno. El
nombre de la cadena es mensaje y debe terminar con el código ASCII de
“$”.
EJEMPLO 02
•Esta cadena está formada por un conjunto de códigos ASCII, cada uno
ocupa una posición de memoria en el segmento de datos. El byte 0Dh
indica retornar al inicio de línea y el byte 0Ah, saltar a la siguiente línea.
•Int 21h con AH = 9 hace que la cadena de caracteres se visualice en la
pantalla.
EJEMPLO 02
Las dos primeras instrucciones hacen que la posición de memoria,
donde ha sido ubicado el segmento de datos por el sistema operativo,
se cargue en el registro DS.
•La expresión @data es utilizada para adquirir este dato, que
inicialmente el programador no lo conoce. No existe una instrucción
para cargar de modo inmediato el dato en DS.
EJEMPLO 02
La instrucción lea dx,mensaje permite cargar en DX la posición de
memoria donde empieza la cadena mensaje.
El segmento de datos pudo haberse escrito después del segmento de
pila y antes del segmento de códigos.
.model small
EJEMPLO 03
.stack 100h
.code
main proc
mov cx,26
mov dl,'A'
L1: mov ah,2
int 21h
inc dl
loop L1
mov ah,4Ch
int 21h
main endp
End main
EJEMPLO 03
El programa del ejemplo 03 imprime en la pantalla 28 caracteres ASCII
empezando por el código de “A”. Este programa incluye dos
instrucciones nuevas.
•La instrucción INC reg, incrementa el contenido del registro en una
unidad.
•La instrucción Loop direcc., ejecuta un bucle un número de veces igual
al contenido de CX desde la posición direcc.
EJEMPLO 03
•Así L1: es una etiqueta que reemplaza la posición de memoria de la
instrucción escrita en esa línea en el segmento de códigos.
•En este caso el bucle se ejecutará 28 veces antes de terminar con el
programa. En cada vez el contenido de DL se incrementará en 1 para
obtener el siguiente código ASCII a imprimir.
.model small L2: push ax
EJEMPLO 04
.stack 100h mov ah,2
.code int 21h
main proc pop ax
mov al,7Ah loop L1
mov cx,8 mov ah,4Ch
L1: shl al,1 int 21h
mov dl,'0' main endp
jnc L2 End main
mov dl,'1'
EJEMPLO 04
Este programa imprime en el monitor el contenido del registro AL en
binario. El número 7Ah = 01111010 aparecerá en la pantalla. En este
programa aparecen dos nuevas instrucciones.
•La instrucción SHL AL,1 desplaza todos sus bits una posición hacia la
derecha, el bit que sale se carga en el Carry y el espacio vacío se llena
con un “0”.
EJEMPLO 04
•La instrucción jnc L2 es un salto condicional dentro del segmento de
códigos. Si Carry = 0, entonces el programa continúa en la dirección L2;
si Carry = 1, el programa continúa con la instrucción que sigue sin
efectuar ningún salto.
EJEMPLO 04
•La idea de las instrucciones
mov dl,'0'
jnc L2
mov dl,‘1’
L2: ---
es cargar en DL el código ASCII de ‘0’ ó de ‘1’ dependiendo de si
Carry = 0 ó si Carry = 1.
INTERRUPCIONES
Los recursos del sistema se utilizan a través de un conjunto de rutinas
que realizan una serie de funciones. Existen dos tipos de rutinas:
•BIOS (Basic Input Output System): son rutinas básicas de entrada o
salida como leer una tecla, escribir un carácter por pantalla, acceder a
un sector de disco.
INTERRUPCIONES
•DOS (Disk Operating System): son las rutinas del sistema operativo que
facilitan el desarrollo de aplicaciones.
Una de las rutinas más frecuentes del DOS se conoce como la INT 21h,
cuya acción recurre a transferir datos por un dispositivo de
Entrada/Salida. El tipo de acción depende del valor que tome el registro
AH y de algunos otros valores que tomen otros registros, por ejemplo el
registro DX o DL.
INTERRUPCIONES
Algunas otras rutinas del BIOS son útiles para controlar el ambiente E/S.
Estas rutinas están almacenadas en la ROM del sistema y de video.
La INT 10h se conoce como interrupción de servicios de video porque
controla directamente la visualización de la pantalla
INTERRUPCIONES
La INT 13h controla las unidades de disco flexible y las unidades de
disco duro conectados al sistema.
La INT 14h controla los puertos COM seriales que sirven para
comunicaciones.
INTERRUPCIONES
La INT 15h controla a varios dispositivos de entrada/ salida y permite el
acceso a la operación en modo protegido y al sistema de memoria
extendido.
La INT 16h se utiliza como una interrupción de teclado.
La INT 17h accede al puerto paralelo de la impresora.
La INT 33h controla el uso del ratón.
INT 21h (tabla resumida)
AH OPERACIÓN Detalle
01 Lee el teclado AL = carácter ASCII; lo
escrito en el teclado hace eco
en el monitor
02 Escribe en el monitor DL = carácter ASCII a
(pantalla) visualisar

03 Lee carácter del AL = carácter ASCII leído


COM1
04 Escribe en COM1 DL = carácter a enviar

05 Imprime en LPT1 DL = carácter ASCII a


(impresora) imprimir
INT 21h (tabla resumida)
AH OPERACIÓN Detalle
08 Lee entrada de Lee carácter de teclado en AL
dispositivo sin eco sin eco
09 Visualiza una cadena DS: DX = dirección de
de caracteres en el cadena; la cadena se termina
monitor con 24h; 0Dh para retorno al
inicio de línea; 0Ah para
saltar a la siguiente línea
0A Ingreso de cadena de DS:DX = dirección del buffer,
caracteres por el segundo byte del buffer
teclado a un buffer contiene el número de
caracteres pulsados, en el
tercer byte empieza la cadena
hasta terminar con 0Dh
INT 21h (tabla resumida)
AH OPERACIÓN Detalle
0E Selecciona unidad de DL = número de unidad de
disco por omisión disco; AL = número total de
unidades de discos presentes.
Unidad de disco A = 00h, B =
01h, C = 02h, etc
2A Lee fecha del sistema AL = día de la semana; CX =
año; DH = mes; DL = día del
mes (domingo = 00; sábado =
06)
2B Establece fecha del CX = año; DH = mes; DL =
sistema día del mes
INT 21h (tabla resumida)
AH OPERACIÓN Detalle
2C Lee hora del sistema CH = hora (0 a 23); CL =
minutos; DH = segundos; DL
= seg/10
2D Establece hora del CH = hora; CL = minutos;
sistema DH = segundos; DL = seg/10

36 Determina espacio DL = número de unidad; (ver


libre en disco detalles en manual)
39 Crear subdirectorio DX = dirección de subdirecto-
rio de cadena.
INT 21h (tabla resumida)
AH OPERACIÓN Detalle
3A Borra subdirectorio DS: DX = dirección de cadena
ASCII del nombre del
directorio
3B Cambiar DX = dirección de
subdirectorio subdirectorio

3C Crear nuevo archivo CX = palabra de atributo: 01h


acceso de sólo lectura, 02h archivo o
directorio oculto, 04h archivo del
sistema , 08h etiqueta volumen, 10h
subdirectorio, 20h bit de archivo.
DX = dirección de nombre de
archivo.
INT 21h (tabla resumida)
AH OPERACIÓN Detalle
3D Abrir un archivo DX = dirección de archivo. En
AL el código de acceso: 00h
sólo lectura, 01h sólo
escritura, 02h lectura o
escritura.
3E Cerrar un archivo BX = manejar archivo

3F Leer un archivo BX = manejar archivo, CX =


número de bytes a leer, DX =
dirección de buffer de archivo
INT 21h (tabla resumida)

AH OPERACIÓN Detalle
40 Escribe un archivo CX = número de bytes a
escribir; BX = asa del
archivo; DS: DX = dirección
del buffer de archivo que
contiene lo datos a escribir
41 Borra archivo DS: DX = dirección de cadena
ASCII del nombre del archivo

4C Devuelve el control al Si hay error este se guarda en


DOS AL

S-ar putea să vă placă și