Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Manual Assembler
Manual Assembler
ndice
I
II
III
IV
V
VI
- Hardware 80x86
- Instrucciones bsicas. Ensamblador
- Control de flujo y Entrada/Salida
- Instrucciones aritmticas y procedimientos
- Salida a Pantalla
- Listado de Interrupciones
I Hardware 80x86
Un poco de historia. El 80x86 de Intel comienza su andadura en 1981 con la versin
8086, hasta las nuevas versiones del Pentium, la primera en 1994. Todas ellas
compatibles hacia atrs una con otra. Cada generacin ha sumado nuevos atributos y
mayor velocidad que la anterior, tal que hoy en da ser muy difcil encontrar un
microprocesador en operacin de la primera generacin, el 8088 o el 8086, puesto que
son muy lentos y obsoletos. Sobre las versiones 286 y 386, se puede decir lo mismo,
pero aqu es el software el que pide ms proceso de clculo. Hace unos aos, los 486's
se han reemplazado en su totalidad por los Pentiums, los Pentium PRO, los MMX, II,
III, IV y V. Todos los CPUs de Intel mantienen un incremento en el rendimiento. En
adelante se usar exclusivamente el modo ms sencillo de operacin de la arquitectura
80x86; el llamado modo real.
Recordando el binario
Antes de comenzar a describir lo que es el lenguaje ensamblador en 80x86, vamos a
recordar cmo se representan los nmeros en una CPU. Una CPU es la Unidad Central
de Proceso dentro de un microprocesador, tal que la informacin en una CPU se
representa en binario, esto es, usando base 2. Un BIT es el elemento que representa el
elemento bsico unidad. A partir de ah tenemos:
1 NIBBLE:
0000 (4 BITS ). Es base del hexadecimal, e.j. 1111 = Fh.
1 BYTE:
00000000 (8 BITS) 2 NIBBLES
1 WORD: 0000000000000000 (16 BITS) 2 BYTES 4 NIBBLES. Es el tamao
usado para un registro de 16-bit.
Registros
Los registros son los elementos principales de almacenamiento de la CPU. Pueden
almacenar y mantener la informacin. En INTEL, existen tres tamaos de registros: de
8-bit, de 16-bit y de 32-bit (para versiones superiores al 386). Adems, se especifican 4
tipos de registros bsicos y registros de control:
15
AH
BH
CH
DH
Bits
AX
BX
CX
DX
SP
BP
SI
DI
AL
BL
CL
DL
H=High
L=Low
(acumulador)
(base)
(contador)
(datos)
(puntero de pila)
(puntero de base)
(Indice a origen)
(Indice a destino)
(puntero de instrucciones)
(registro de estado)
Registros de control
AL
01110001
6071 (hexadecimal)
- Registros de ndices.
Estos registros de 16 bits tambin son llamados registros punteros. Su utilidad es para
el uso de instrucciones que operan con cadenas de caracteres. Lo forman el registro de
ndice SI (origen) y el registro DI (destino). Al igual que los registros de propsito
general, en las versiones del 386 y superiores de Intel, existen los registros ESI y EDI.
- Registros de Pila
Los registros de control de pila, BP y SP, se usan cuando manejamos una pila (stack).
Estos registros se ven ms adelante en el prrafo que corresponde al STACK.
Dos registros de 16 bits, uno que contiene el segmento y otro el offset, generan una
direccin fsica de 20 bits. Para ello, se colocan en posicin tal que, el registro segmento
se mueve 4 posiciones a la izquierda y el de offset a la derecha, tambin 4 posiciones,
dejando 4 bits a 0 respectivamente. Si se unen (se suman) los 2 registros, se obtiene una
direccin de 20 bits, que nos da la direccin fsica en memoria.
SEGMENTO
OFFSET
DIRECCION FISICA
CS
SS
DS
ES
(segmento de cdigo)
(segmento de pila)
(segmento de datos)
(segmento extra de datos)
Registros de segmentos
Offset
desplazamiento
Segmento
Sumador
Direccin
fsica
Otros registros
Existen adems otros registros de control. Los ms importantes son, el registro IP
(puntero de instruccin) y el registro de estado (FLAGS), que contiene la informacin
del estado de la CPU.
La pila (stack)
En general, en la arquitectura de Intel, seis registros de propsito general, son
insuficientes para almacenar todos los valores requeridos para las operaciones en
ensamblador. Para el caso de mantener y recuperar los valores de estos registros, existe
un rea de memoria llamada PILA (stack). El nombre de PILA no es por otra cosa sino
por su forma de uso. Es decir, el ltimo que entra es el primero que sale, comnmente
tambin llamado Last In First Out (LIFO).
Puntero a
Pila (SP)
Espacio
libre en
Pila
Puntero a Segm
de Pila (SS)
ax
bx
cx
dx
Tipos de Operandos
Hay tres tipos de operandos en ensamblador:
- TIPO INMEDIATO
- TIPO REGISTRO
- TIPO MEMORIA
El operando inmediato es un nmero conocido en compilacin, es decir una constante.
El operando tipo registro es cualquier registro de propsito general o registro de ndice.
Un operando tipo memoria es una variable almacenada en memoria.
Instrucciones bsicas
Hay una serie de instrucciones importantes y necesarias para cualquier programa en
ensamblador. La ms importante es la instruccin MOV.
MOV: mueve un valor de un lugar a otro.
MOV destino, origen
Ejemplos:
mov ax,10
mov bx,cx
mov dx,Number
push cx
push ax
pop cx
pop ax
Llamada a interrupcin
Los PC estn compuestos fsicamente por: monitor, teclado, CPU, discos (flexibles y
duros), perifricos y componentes adicionales. Todos estos perifricos y otras funciones
se pueden leer o escribir desde programa a travs de una solicitud de servicio llamada
interrupcin. Una interrupcin es una operacin que invoca la ejecucin de una rutina
especfica que suspende la ejecucin del programa que la llam, de tal manera que el
sistema toma control del computador colocando en el stack el contenido de los registros
CS e IP. El programa suspendido vuelve a activarse cuando termina la ejecucin de la
interrupcin y son restablecidos los registros salvados. Existen dos razones para ejecutar
una interrupcin: (1) intencionalmente como peticin para la entrada o salida de datos
de un dispositivo, y (2) un error serio y no intencional, como un resultado de
desbordamiento de la ALU o de divisin por cero. En un PC el control de estos
servicios se hace a travs del BIOS (Basic Input-Output System) o del sistema operativo
MS-DOS (MicroSoft Disk Operating System), que le llamaremos DOS. Existen
interrupciones software e interrupciones hardware, los ejemplos siguientes muestran
cmo llamar al DOS y a la BIOS.
INT: llama a una funcin del DOS o BIOS a travs de una subrutina para realizar un
servicio especial, por ejemplo manipular el vdeo, la pantalla, abrir un fichero, escribir
en un puerto, etc. En este texto usaremos una de ellas, la salida a pantalla, que se
corresponde con la 21h. Las dems se pueden consultar en la bibliografa.
INT interrupt number
Ejemplos:
int 21h
int 10h
Casi todas las interrupciones tienen asociados ms de un servicio, por ello es necesario
pasar el nmero de servicio deseado. Se utiliza para ello el registro AH. El ejemplo ms
usado es escribir algo en la pantalla del monitor:
mov ah,9
int 21h
; ok
; error
mov bx,Number2
mov bl,Number2
; ok
; error
Lo que indica que, nicamente se pueden usar bytes en registros de 8 bits y palabras en
registros de 16 bits.
En resumen, el proceso de una interrupcin software es el siguiente:
Memoria libre
Mi programa.exe
Direccin retorno
STACK
CODIGO
INT 21H
DOS
rutinas de servicio
IRET
Vector 21
Tabla de vectores
mov ds,ax
mov
int
mov
int
ah,9
21h
ax,4c00h
21h
;
;
;
;
END start
; fin
El Ensamblador
Para la compilacin de un programa en ensamblador y su enlazado, hay que seguir una
serie de pasos. Usaremos el ensamblador llamado TurboAssembler (TASM). Este
ensamblador lo que hace es obtener un programa ejecutable para un ordenador que
tenga integrado un microprocesador de la familia 80x86. La figura siguiente detalla los
cuatro pasos que lleva a cabo el compilador:
Edicin del
programa
.ASM
Ensambla
Enlaza
TASM
TLINK
.asm
.obj
Ejecuta
programa
.exe
Debugger
TD
1.- Edicin del programa. Se utiliza cualquier editor de texto para escribir el cdigo del
programa en ensamblador. Para que pueda ser interpretado por el compilador TASM, la
condicin es que el fichero de este programa lleve extensin .ASM y el nombre del
fichero no debe ser mayor a ocho caracteres. Para la edicin, por ejemplo, se puede usar
EDIT como programa editor de texto. En este caso, vaya a Inicio -> Accesorios>Smbolo del sistema. Aparecer una ventana de DOS. Vaya al directorio de trabajo que
est usando e invoque al editor.
C:\MiDirectorio\TASM> edit prueba.asm
; Ejem_1 : PRUEBA.ASM
; Un programa en ensamblador que enva un mensaje
; a pantalla. A ver que pasa.
.model tiny
.stack
.data
Message db "Prctica 1. EyTC$"
; mensaje a pantalla
.code
start:
mov dx,OFFSET Message
mov ax,SEG Message
mov ds,ax
mov
int
mov
int
ah,9
21h
ax,4c00h
21h
END start
; offset en DX
; segmento en AX
; DS:DX apunta al mensaje
; fin
El depurador (debugger)
El depurador es una herramienta que permite observa r lo que est haciendo un
programa. El ejemplo que veremos aqu tiene como objetivo una breve introduccin y
uso del depurador con la herramienta Turbo Debugger (TD). El TD nos permite
comprobar lo que est haciendo el programa paso a paso. Antes de esto se necesita
generar un programa. Para ello, invoque un editor de texto y a continuacin escriba el
siguiente programa que nos permitir supervisar el programa paso a paso y con mayor
amplitud el depurador. Este programa consiste en comprobar instrucciones de suma, de
multiplicacin, el uso del stack y la llamada a una funcin.
; Ejem_1 : UNO.ASM
; Ejemplo para demostrar el uso del depurador TD.
.model tiny
.code
.stack
start:
; inicio de programa
push ax
push bx
push cx
mov ax,10
mov bx,20
mov cx,3
; ax = 10
; bx = 20
; cx= 3
Call ChangeNumbers
; llamada a subrutina
pop cx
pop bx
pop ax
; recupera cx
; recupera bx
; recupera dx
mov ax,4C00h
int 21h
; subrutina
ChangeNumbers PROC
add ax,bx
mul cx
mov dx,ax
ret
;
;
;
;
; inicio de subrutina
suma al valor de ax, el valor de bx
multiplica ax por cx
guarda el resultado en dx
vuelve de subrutina
; fin de programa
Para trabajar con el depurador se necesita un fichero ensamblado. Este fichero, con
extensin .EXE, es un fichero del tipo ejecutable. Invoque al depurador:
td uno.exe
Tambin hay dos mens. El principal (fila superior) que es una barra de control de
ventanas, as como de funciones de usuario y el de la fila inferior, que incluye una barra
con un men de funciones rpidas a travs de las teclas F1 a F10.
Volviendo a las ventanas principales. Se ve en primera instancia en el primer recuadro o
ventana que contiene las primeras lneas:
cs:0000 50
cs:0001 53
cs:0002 51
push ax
push bx
push cx
mov ax,000A
mov bx,0014
mov cx,0003
; mensaje a la pantalla
; usando la funcin 09h
; e interrupcin 21h
; mueve al (ASCII) a dl
; servicio 02h de interrupcin 21h
; llamada a la interrupcin 21h
Control de Flujo
En ensamblador hay un conjunto de instrucciones para el control de flujo de un
programa, como en cualquier otro lenguaje. El ms comn es el salto incondicional, por
ejemplo:
jmp Alabel
Esta instruccin lo que hace es indicar a travs de una etiqueta (Alabel) el cambio del
control de flujo del programa. Ejemplo:
jmp ALabel
.
.
.
ALabel:
En caso de que un programa est sujeto a una condicin, este salto es del tipo
condicional a travs de la instruccin correspondiente. Primeramente comparamos y
luego usamos la instruccin de salto que corresponda. Ejemplo:
cmp ax,3
je correcto
; AX = 3?
; si
JNZ
JNE
JC
Ejemplo;
cmp al,'Y'
je IGUAL
; mensaje a la pantalla
; usando 09h
; e interrupcin 21h
; mensaje a la pantalla
; usando la funcin 09h
; e interrupcin 21h
jmp First_Time
Prompt_Again:
; mensaje a la pantalla
; usando 09h
; e interrupcin 21h
First_Time:
mov dx,OFFSET Again
mov ah,9
int 21h
; mensaje a la pantalla
; usando la funcin 09h
; e interrupcin 21h
xor ah,ah
int 16h
mov
mov
mov
int
;
;
;
;
bl,al
dl,al
ah,02h
21h
cmp bl,'Y'
je Prompt_Again
almacena en bl
mueve al a dl
funcin 02hcaracter a pantalla
llamada al servicio de DOS
; al=Y?
; si si, nuevo mensaje a pantalla
cmp bl,'y'
je Prompt_Again
; al=y?
; si si, nuevo mensaje a pantalla
theEnd:
mov dx,OFFSET GoodBye
mov ah,9
int 21h
; adis
; funcin 9
; interrupcin 21h
mov ah,4Ch
int 21h
; fin
.data
CR equ 13
LF equ 10
Message
Prompt
Again
Another
GoodBye
DB
DB
DB
DB
DB
end start
"Programa de Entrada-Salida$"
CR,LF,"Entrada.$"
CR,LF,"De nuevo? $"
CR,LF,"Aqu esta de nuevo!$"
CR,LF,"Adis."
IV - Instrucciones aritmticas y
procedimientos
Instrucciones aritmticas
Adems de las instrucciones vistas anterio rmente, hay otro grupo muy importante que
se introducen a continuacin:
ADD: Suma un nmero a otro.
ADD operando1,operando2
Esto es, multiplica AL o AX por el valor del registro o variable dado. Si se emplea un
operando de tamao un byte, se emplea la parte del registro correspondiente a AL y el
resultado se almacena en AX. Si el operando es de tamao word, entonces se multiplica
AX y el resultado se almacena en DX:AX.
DIV: Divide dos nmeros enteros sin signo (positivos)
IDIV: Divide dos nmeros enteros con signo (positivo o negativo)
DIV registro o variable
IDIV registro o variable
Procedimientos
En ensamblador un procedimiento es equivalente a una funcin en C o Pascal. Es
tambin un mecanismo sencillo de encapsular partes de cdigo. Para definir un
procedimiento se siguen los siguientes pasos:
PROC AProcedure
.
.
.
ret
ENDP AProcedure
; cdigo
Ejemplo:
; Ejem_3 : TRES.ASM
; Ejemplo de un procedimiento que enva a pantalla Hola
.model tiny
.stack
.code
Start:
call Display_Hola
mov ax,4C00h
int 21h
Display_Hola PROC
mov dx,OFFSET HolaMuyBuenas
mov ah,9
int 21h
ret
Display_Hola ENDP
.data
HolaMuyBuenas DB 13,10 "Que pasa chaval! $"
end Start
; mensaje
- por registro
Es el ms sencillo y el ms rpido. Se necesita mover los parmetros a los registros y
despus hacer la llamada al procedimiento.
; Ejem_4: CUATRO.ASM
dh,4
dl,5
al,254
bl,4
call PrintChar
mov ax,4C00h
int 21h
;
;
;
;
; a pantalla
; fin del programa
PrintChar PROC
push bx
push cx
; salvaguarda registros
xor bh,bh
mov ah,2
int 10h
pop bx
; recupera bx
xor
mov
mov
int
;
;
;
;
bh,bh
ah,9
cx,1
10h
pop cx
; recupera registro
ret
; return
PrintChar ENDP
end Start
- por memoria
Tambin es sencillo, pero el programa resultante es ms grande y ms lento que el
anterior.
Para pasar parmetros a travs de memoria es necesario copiar estos en variables
almacenados en memoria.
;Ejem_5: CINCO.ASM
; lo mismo pero por paso de parmetros
.model tiny
.code
.stack
Start:
mov
mov
mov
mov
Row,4
Col,5
Char,254
Colour,4
call PrintChar
mov ax,4C00h
int 21h
;
;
;
;
fila
columna
ASCII
color
; llamada a funcin
; termina programa
PrintChar PROC
push ax cx bx
; guarda registros
xor
mov
mov
mov
int
bh,bh
ah,2
dh,Row
dl,Col
10h
mov
mov
xor
mov
mov
int
al,Char
bl,Colour
bh,bh
ah,9
cx,1
10h
; llamada a la Bios
;
; funcion 09h escribe
;
; llamada a servicio de la Bios
pop bx cx ax
; recupera registros
ret
PrintChar ENDP
; return
?
?
?
?
end Start
;
;
;
;
;
fila
columna
ascii
color
guarda parametros en stack
call PrintString
; funcion a pantalla
pop bx ax dx
mov ax,4C00h
int 21h
;recupera registros
;termina programa
PrintString PROC
push bp
mov bp,sp
push cx
; guarda bp
; mueve sp a bp
; guarda registro (se va a usar cx)
xor
mov
mov
int
bh,bh
ah,2
dx,[bp+8]
10h
;
;
;
;
limpia bh
funcion 2 - mover cursor
recupera dx
llamada a Bios
mov
mov
xor
mov
mov
int
ax,[bp+6]
bx,[bp+4]
bh,bh
ah,9
cx,1
10h
;
;
;
;
caracter
atributo
pantalla en pgina 0
funcion 09h escribe
pop cx
pop bp
; recupera de stack
ret
PrintString ENDP
; return
end Start
Segundo
parmetro
STACK +
Direccin +
Primer
parmetro
Direccin de
vuelta
Modelos de Memoria
Se ha venido utilizando la directiva .MODEL a lo largo de los programas de este texto.
Para el MSDOS solamente existen dos tipos de ficheros, los .COM y los .EXE. Los del
tipo .EXE que pueden usar hasta cuatro segmentos (STACK, DATA, EXTRA y CODE)
cada uno de 64 KB de tamao. Un fichero .COM solo tiene un segmento de 64KB y
; guarda registros
; recupera registros
PUSHA y POPA
PUSHA es una instruccin que coloca todos los registros de propsito general en la pila.
Al igual que el mecanismo anterior, facilita la codificacin. Su equivalente es el
siguiente:
push
push
push
push
push
push
push
push
ax
cx
dx
bx
sp
bp
si
di
Desplazamientos
Las instrucciones de desplazamiento mueven bit a bit un registro. Lo ha y del tipo lgico
(sin signo) y aritmtico (con signo). Adems esas instrucciones permiten hacer
operaciones en base 2 de multiplicacin y divisin, aunque son muy lentas
comparativamente con otro tipo de instrucciones aritmticas. Para hacer este tipo de
operaciones aritmticas, se puede emplear el desplazamiento binario hacia la izquierda o
derecha una o varias posiciones. Cada desplazamiento equivale a dividir o multiplicar
en potencia de 2. Su equivalente son los operadores << y >> en lenguaje C.
Existen cuatro formas diferentes para efectuar estos desplazamientos.
SHL
SHR
SAR
SAL
Bucles (loops)
Una forma de optimizar el uso de instrucciones de salto anidadas con instrucciones del
tipo JMP, es por medio de una instruccin de tipo bucle. Esto es, usando la instruccin
LOOP y colocando el valor del nmero de veces que se tiene que hacer el bucle en el
registro CX. En cada pasada del bucle se va decrementado el valor de CX (CX-1). Esto
significa hacer un salto corto, con un valor de hasta 128 bytes, es decir 127 bytes o
anterior a la posicin donde se localiza la instruccin LOOP.
mov cx,100
Label:
.
.
.
Loop Label:
Label:
dec cx
jnz Label
; CX = CX-1
; continua hasta que el valor de CX=0
V - Salida a Pantalla
Modo texto
Adems de la salida a pantalla de vista anteriormente, existen otros mecanismos para
trabajar con la pantalla.
;Ejem_8: TEXTO_1.ASM
;este ejemplo posiciona el cursor en un punto concreto de la pantalla
.model tiny
.code
.stack
start:
mov
mov
mov
xor
int
dh,12
dl,32
ah,02h
bh,bh
10h
;
;
;
;
;
cursor a columna 12
cursor a fila 32
pone en ah el nmero de servicio
bh se pone a 0 (pagina 0 del video)
llamada al bios
mov ax,4C00h
int 21h
; salida a dos
.data
Texto DB "Esta es una prueba para enviar texto a pantalla$"
end start
ax,@data
ds,ax
ah,40h
bx,1
cx,21
dx,OFFSET Texto
21h
mov ax,4C00h
int 21h
; fin
.data
Texto DB "Un poco ms de texto"
end
mov
mov
mov
xor
mov
mov
mov
mov
int
;
;
;
;
;
;
;
;
;
bp,OFFSET Texto
ah,13h
al,01h
bh,bh
bl,5
cx,21
dh,5
dl,5
10h
mov ax,4C00h
int 21h
; vuelve al DOS
.data
Text DB "Un poco ms de texto
end
ax,0B800h
es,ax
di,di
ah,4
al,"G"
cx,4000
stosw
mov ax,4C00h
int 21h
;
;
;
;
;
;
;
;
; vuelve al DOS
end
Lo mismo pero ahora con una cadena de caracteres escribiendo en la memoria de video.
;Ejem_13: TEXTO5.ASM
.model small
.stack
.code
mov ax,@data
mov ds,ax
mov
mov
mov
mov
mov
xor
ax,0B800h
es,ax
ah,3
cx,21
si,OFFSET Texto
di,di
;
;
;
;
;
lodsb
mov es:[di],al
inc di
mov es:[di],ah
inc di
;
;
;
;
siguiente carcter a al
escribe en memoria de video
mueve a la siguiente columna
atributo del carcter
loop Wr_Char
; bucle definido en cx
mov ax,4C00h
int 21h
; vuelve al DOS
Wr_Char:
.data
Texto DB "Esto es un poco ms de texto"
end
VI Listado de Interrupciones
DIRECCION (hex)
INTERRUPCION(hex) FUNCION
0-3
4-7
8-B
C-F
10-13
14-17
18-1F
20-23
24-27
28-37
38-3B
3C-3F
40-43
44-47
48-4B
4C-4F
50-53
54-57
58-5B
5C-5F
60-63
64-67
68-6B
6C-6F
70-73
74-77
78-7B
7C-7F
0
1
2
3
4
5
6,7
8
9
A,B,C,D
E
F
10
11
12
13
14
15
16
17
18
19
1A
1B
1C
1D
1E
1F
80-83
84-87
88-8B
90-93
94-97
98-9B
9C-9F
A0-FF
100-1FF
200-217
218-3C3
3C4-3FF
20
21
22
24
25
26
27
28-3F
40-7F
80-85
86-F0
F1-FF
Division by zero
Single step trace
Nonmaskable interrupt
Breakpoint instruction
Overflow
Print screen
Reserved
Timer
Keyboard interrupt
Reserved
Diskette interrupt
Reserved
Video screen I/O
Equipment check
Memory size check
Diskette I/O
Communication I/O
Cassete I/O
Keyboard input
Printer Output
ROM Basic entry code
Bootstrap loader
Time of day
Get control on keyboard break
Get control on timer interrupt
Pointer to video initialization table
Pointer to diskette parameter table
Pointer to table for graphics
characters ASCII 128-255
DOS program terminate
DOS function call
DOS terminate address
DOS fatal error vector
DOS absolute disk read
DOS absolute disk write
DOS terminate, fix in storage
Reserved for DOS
Not used
Reserved by BASIC
Used by BASIC interpreter
Not Used