You are on page 1of 34

Introduccin al Lenguaje

Ensamblador

VENTAJAS DE LENGUAJE ENSAMBLADOR


Velocidad
Eficiencia de tamao
Flexibilidad

DESVENTAJAS
Tiempo de programacin
Programas fuente grandes
Peligro de afectar recursos inesperadamente
Falta de portabilidad

ARQUITECTURA INTERNA DEL MICROPROCESADOR

EXISTEN 4 REGISTROS SEGMENTOS

DS: Data Segment (Segmento de Datos)


Este registro selecciona una seccin de 64 Kb.
que se dedica generalmente a colocar en ella
nuestras variables, por lo cual toma su nombre:
seccin de memoria dedicada a datos.

CS: Code Segment (Segmento de


Cdigo)
Este registro selecciona el rea de 64 Kb. que
generalmente dedicamos al cdigo. En este caso,
el CPU (especficamente, el BIU), siempre toma
las instrucciones de esta regin de memoria; por lo
que cuando requerimos ms de 64 Kb. de cdigo
(instrucciones), este registro tendr que moverse,
tomando distintos valores segn recorremos
distintas regiones de memoria.

SS: Stack Segment (Segmento de Pila)


Este registro selecciona la regin de 64 Kb. que
va a contener la pila del sistema. Como su
nombre lo indica, tendremos una estructura de
datos, con poltica LIFO (Last In, First Out = El
ltimo elemento en entrar, es el primero en salir),
con instrucciones bsicas PUSH y POP para su
manejo. Esta estructura es usada por los
programas de aplicacin, pero tambin por el
procesador para el control de instrucciones que lo
requieren, tales como las llamadas a subrutinas y
la atencin de interrupciones.

ES: Extra Segment (Segmento Extra)


Este registro nos permite seleccionar una seccin
de 64 Kb., que no est destinada a ningn uso
especfico; por lo que el programador puede
aplicarla como comodn, generalmente como un
segundo segmento de datos; o bien, para el
acceso a regiones de memoria del sistema, tales
como la memoria de video o las variables del
BIOS.

UNIDAD DE CONTROL
Es la seccin del procesador que contiene la lgica de
funcionamiento del mismo; es decir, esta circuitera
gobierna el comportamiento de los distintos elementos en
el procesador, coordinando los procesos , as como las
distintas microoperaciones necesarias para la ejecucin.
Por tanto, tiene dos funciones principales:
Generar la secuencia de estados del procesador, lo que
logra gracias a la ejecucin del microcdigo.
Decodificar las instrucciones, determinando as los pasos
para su ejecucin.

REGISTROS DE PROPOSITO
GENERAL
AX: Registro de acumulador
Este registro es el ms usado, siendo de
propsito general; y tiene ciertas
especializaciones, de ah su nombre:
Es el nico que puede ser usado como
multiplicando en la multiplicacin
Es el nico que puede ser usado como
dividendo en la divisin
Es el parmetro que selecciona los distintos
servicios del Sistema Operativo, usados
mediante el mecanismo de Interrupciones.

REGISTROS DE PROPOSITO
GENERAL
BX: Registro de Base
Este registro, adems de las
caractersticas generales de los registros
de propsito general, se especializa
en el acceso a memoria en combinacin
con los registros de ndice, especialmente
para el manejo de arreglos.

REGISTROS DE PROPOSITO
GENERAL
CX: Registro de Contador
Este registro, como su nombre indica, ser
ampliamente usado como contador. Puede ser
usado como cualquier registro de propsito
general, pero tiene capacidades especiales para
ser usado en instrucciones:
de manejo de ciclos
como contador en los corrimientos
de manejo de memoria y strings

REGISTROS DE PROPOSITO
GENERAL
DX: Registro de Datos
Este registro de propsito general tiene como
especializaciones:
Formar con AX nmeros de 32 bits, siendo en
este caso la parte ms significativa.
El acceso a puertos. Las instrucciones IN y
OUT, que permiten dicho acceso, requerirn en
ciertos casos que el nmero de puerto est en
DX.

REGISTROS INDICES

No pueden conectarse directamente con los registros de segmentos.


No pueden verse como dos registros de 8 bits (parte alta y parte baja).

SI: Source Index, o Apuntador a la Fuente


Este registro se especializa en el acceso a bytes o words dentro del
segmento de datos; existen instrucciones que lo toman por defecto
como el registro que apunta a una localidad de memoria que se va a
leer, por lo cual toma su nombre.
DI: Destination Index, Apuntador al Destino
Este registro se especializa en el acceso a bytes o words dentro del
segmento de datos o el extra; existen instrucciones que lo toman por
defecto como el registro que en combinacin con el ES apunta a una
localidad de memoria que se va a escribir, por lo cual toma su nombre.

REGISTROS DE PILA

BP: Base Pointer, o apuntador a la Base de la Pila.


Este registro es usado para accesar, dentro del segmento de pila, la
informacin. Principalmente nos permite determinar cuando hay un
underflow, es decir, cuando se quiere sacar ms informacin de la
pila que la que se ha colocado en ella; y el acceso a variables
locales y parmetros.
SP: Stack Pointer, o apuntador al tope de la Pila.
Este registro tambin est siempre asociado al manejo de la pila.
Su funcin especial es marcar el tope de la pila, y por tanto, indica
en qu localidad de memoria se localiza la informacin de la pila; se
incrementa cuando se hace un POP, con lo que apunta al siguiente
elemento en la pila; y se decrementa al hacer un PUSH, con lo que
controla el acceso a la memoria de la pila.

ALU: UNIDAD ARITMETICO


LOGICA
Este componente, como su nombre indica,
contiene la circuitera necesaria para realizar las
diversas operaciones aritmticas y lgicas.
Recibe sus operandos por el Bus A, y genera los
resultados regresndolos al mismo bus. Una
particularidad que es importante recalcar es su
conexin al registro de banderas, por lo cual
todas las operaciones aritmticas y lgicas, de
acuerdo a su resultado, lo alterarn.

BANDERAS
ZF: Bandera de resultado 0
Se prende cuando el resultado de la ltima operacin
realizada en el ALU fue un 0.
CF: Bandera de carry
Se prende cuando el resultado de la ltima operacin
realizada en el ALU (necesariamente, una suma o resta)
gener un carry o un borrow.
OF: Bandera de overflow
Se prende cuando el resultado de la ltima operacin
realizada en el ALU excedi la capacidad del registro
donde se almacena (overflow).

BANDERAS
SF: Bandera de signo
Se prende cuando el resultado de la ltima operacin
realizada en el ALU fue negativo, segn la
representacin de complemento a 2 q
AF: Bandera de carry auxiliar
Se prende cuando el resultado de la ltima operacin
realizada en el ALU gener un carry cuando estaba a la
mitad. Por ejemplo, si sumamos dos nmeros de 16 bits,
nos indicar si la suma de las partes bajas (primeros 8
bits) haba generado carry; si sumamos dos nmeros de
8 bits, indica si el resultado intermedio despus de
sumar los 4 bits menos significativos, gener carry para
sumarse a los bits 5.

BANDERAS

DF: Bandera de direccin


A diferencia de las anteriores, esta bandera no se prende como
resultado del ALU, sino que el programador la usa para controlar la
direccin del acceso mediante apuntadores, especialmente en las
instrucciones de strings.
IF: Bandera de interrupcin
Se prende cuando el procesador es interrumpido, y est ejecutando
una rutina de atencin de interrupcin. Esto evita que el procesador
acepte interrupciones mientras est procesando interrupciones
previas, de manera que no se pierda el control del procesador.

MODOS DE
DIRECCIONAMIENTO
Direccionamiento implcito
Depende solamente de la instruccin, es decir, la instruccin
no lleva parmetros.
Particularmente en instrucciones que no accesan memoria, o
bien que tienen una forma especfica de accesarla.
Ejemplos: PUSHF, POPF, NOP

MODOS DE
DIRECCIONAMIENTO
Modo registro
Usa solamente registros como operandos
Es el ms rpido, pues minimiza los recursos
necesarios (toda la informacin fluye dentro del EU
del CPU)
Ejemplo:
MOV AX, BX

MODOS DE
DIRECCIONAMIENTO
Modo inmediato
Tiene dos operandos: un registro y una constante
que se usa por su valor.
El valor constante no se tiene que buscar en
memoria, pues ya se obtuvo al hacer el "fetch" de la
instruccin.
Por tanto, es rpido aunque no tanto como el modo
registro; requiere ir al BIU por el dato.
Ejemplo:
MOV AH, 9

MODOS DE
DIRECCIONAMIENTO
Modo directo
Uno de los operandos involucra una localidad
especfica de memoria
El valor constante se tiene que buscar en memoria,
en la localidad especificada.
Es ms lento que los anteriores, pero es el ms
rpido para ir a memoria, pues ya "sabe" la
localidad, la toma de la instruccin y no la tiene que
calcular.
Ejemplo:
MOV AH, [0000]
MOV AH, Variable

MODOS DE
DIRECCIONAMIENTO
Modo indirecto
Se usan los registros SI, DI como apuntadores
El operando indica una localidad de memoria, cuya
direccin (slo la parte desplazamiento) est en SI o DI.
Es ms lento que los anteriores, pues tiene que
"calcular" la localidad
Ejemplos:
MOV AL, [SI]
MOV BL, ES:[SI] ; Aqu se dice que se usa un "segment
override", donde se indica que en vez de usar el
segmento de datos por defecto, se use en su lugar como
referencia el segmento extra.

MODOS DE
DIRECCIONAMIENTO
Modo indexado de base
Formato:
[
BX o BP
+ SI o DI (opcionales)
+ constante (opcional)
]
BX o BP indica una localidad base de la memoria
A partir de BX o BP, se puede tener un desplazamiento variable y uno
constante
La diferencia es el segmento sobre el que trabajan por defecto:
BX por defecto en el segmento de datos
BP por defecto en el segmento de pila.
Ejemplos:
MOV AX, [BX]
MOV DX, [BX+2]
MOV CX, [BX+DI]
MOV DL, [BX+SI+3]

Instrucciones aritmticas:

Instruccin

Operandos

Funcin equivalente en
"C"

ADD

op1, op2

op1 = op1 + op2

SUB

op1, op2

op1 = op1 - op2

ADC

op1, op2

op1 = op1 + op2 + Carry

SBB

op1, op2

op1 = op1 - op2 - Carry

INC

op1

op1 ++;

DEC

op1

op1 --;

MUL

op1

Si op1 es tipo byte:

AX = AL * op1

Si op1 es tipo word:

(DX:AX) = AX * op1

Si op1 es tipo byte:

AL = AX / op1

DIV

op1

Resultados

AH = AX % op1
Si op1 es tipo word:

AX = (DX : AX) / op1


DX = (DX : AX) % op1

NEG

op1

op1 = - op1

ROTACIONES Y
DESPLAZAMIENTOS

SHL op1, cuenta op1 <<= cuenta


SHR op1, cuenta op1 >>= cuenta
ROL op1, cuenta (no hay equivalente)
ROR op1, cuenta (no hay equivalente)
En todas las instrucciones de rotacin/desplazamiento de bits,
cuenta puede ser 1 o bien CX.

OPERACIONES LOGICAS

Instruccin

Operandos

Funcin equivalente en "C"

AND

op1, op2

op1 = op1 & op2

OR

op1, op2

op1 = op1 | op2

XOR

op1, op2

op1 = op1 ^ op2

NOT

op1

op1 = ~op1

CONDICIONES Y SALTOS
Instruccin

Operandos

JMP

etiqueta

CMP

op1, op2

Descripcin

Bandera
Examinada

Comparaciones
sin signo
JB/JNAE

etiqueta

Salta si es menor o salta si no


es mayor o igual

CF

JNB/JAE

etiqueta

Salta si es mayor o igual o salta


si no es menor

CF

JBE/JNA

etiqueta

Salta si es menor o igual o salta


si no es mayor

CF, AF

JNBE/JA

etiqueta

Bifurca si es mayor o salta si no


es menor o igual

CF, ZF

JE/JZ

etiqueta

Salta si es igual o salta si es


cero

ZF

JNE/JNZ

etiqueta

Salta si no es igual o salta si no


es cero

ZF

CONDICIONES Y SALTOS
Bandera
Examinada

Instruccin

Operandos

Descripcin

JL/JNGE

etiqueta

Salta si es menor o salta si no es mayor o igual

SF, OF

JNL/JGE

etiqueta

Salta si es mayor o igual o salta si no es menor

SF, OF

JLE/JNG

etiqueta

Salta si es menor o igual o salta si no es mayor

ZF, SF, OF

JNLE/JG

etiqueta

Salta si es mayor o salta si no es menor o igual

ZF, SF, OF

JP/JPE

etiqueta

Salta si hay paridad o salta si la paridad es par

PF

JNP/JPO

etiqueta

Salta si no hay paridad o salta si la paridad es


impar

PF

JS

etiqueta

Salta si el signo es negativo

SF

JNS

etiqueta

Salta si el signo es positivo

SF

JC

etiqueta

Salta si hay acarreo

CF

JNC

etiqueta

Salta si no hay acarreo

CF

JO

etiqueta

Salta si hay desbordamiento

OF

JNO

etiqueta

Salta si no hay desbordamiento

OF

Uso de
procedimientos/subrutinas
Instruccin

Operandos

Funcin equivalente en "C"

CALL

etiqueta

Llamada a funcin
PUSH IP
PUSH CS ; Slo si es llamada larga (CALL FAR)
JMP etiqueta

RET

(ninguno)

return
POP IP-temp
POP CS-temp ; Slo si es llamada larga (RETF)
JMP CS-temp:IP-temp

Instrucciones para Cdigo


.model <modelo de memoria>
Nos indica qu modelo de memoria se usar para ensamblar este programa.
Este concepto se ver ms adelante en el curso.
Para las aplicaciones comunes, usaremos siempre el modelo small. De esta
manera, un programa fuente iniciar con la directiva ".model small"
.stack <tamao en bytes>
Le indica al ensamblador cunto espacio deber reservar para la pila del
sistema. Como hay funciones bsicas que usan la pila, aunque nosotros no la
usemos explcitamente, debe dejarse un espacio razonable.
Para la generalidad de las aplicaciones, basta reservar unos 256 bytes (100h).
Por ello, generalmente veremos a los programas fuentes tener la directiva
".stack 100h"
.data
Esta directiva indica dnde inicia la definicin de las variables. Generalmente,
esta zona de memoria se asociar al registro DS; de hecho, se considera que
es la definicin del contenido y espacio reservado para el segmento de datos
por defecto.
.code
Esta directiva indicar al ensamblador dnde inicia el cdigo. A partir de ella, se
encontrarn las instrucciones propiamente dichas.

Para uso de procedimientos:


<etiqueta> PROC {NEAR/FAR}
Asocia una etiqueta a un procedimiento. Por ejemplo, si ponemos:
Principal PROC
esto definir el punto de inicio del procedimiento llamado "Principal".
NEAR o FAR son parmetros opcionales, que por el momento omitiremos, revisando
su uso en el tema de Modelos de Memoria.
<etiqueta> ENDP
Cierra un procedimiento, debe estar balanceado con un PROC para abrirlo.
END {etiqueta}
Cierra un mdulo de programa. Esta directiva le indica al Ensamblador que ignore
cualquier cosa que venga despus; es como decirle que ah acab el archivo con el
cdigo fuente.
El parmetro (opcional) "etiqueta" indica en qu procedimiento iniciar la ejecucin del
programa. As como en Pascal el programa inicia siempre en el begin principal, y en C
iniciar en la funcin main, sin importar su localizacin, en Ensamblador usaremos
esta directiva para indicar dnde iniciar el programa. Por ejemplo:
END Principal
indica al Ensamblador que la ejecucin iniciar en el procedimiento o etiqueta
Principal.
En caso de omitirse el parmetro opcional, la ejecucin se inicia en la primera
instruccin despus de la directiva .code.

Formato de Programa
.MODEL SMALL
.CODE
.DATA
Programa:
MOV AX,4C00H
INT 21H
.STACK
END Programa

Llamada a procedimientos
Page 60,132
Title llamada a procedimiento
.model small
.stack 64
.data
;
.code
Empezar proc far
Call B10
Mov AX, 4C00H
Int 21H
Empezar endp
;.
B10 proc near
Call C10
Ret
B10 endp
;.
C10 proc near
Ret
C10 endp
;...
End empezar

You might also like