You are on page 1of 21

1

Estructura de un programa y
direccionamiento en ensamblador.

Realizado por:
Arce Orozco Alejandro.
Luis Enrique Coln Contreras.
Jose ngel Gonzlez Herrera.
Jos Azmir Jimnez Jaime.
Oscar Sotelo Carrasco.


Fecha de entrega: 07/10/14.

Campus: Texcoco.

Materia: Lenguaje Ensamblador.

Carrera: Ingeniera en Sistemas Computacionales.

Semestre: Quinto.

Nombre del maestro: Orlando Baos Castorena.
2

ndice.
Introduccin......3
Objetivos5
Justificacin..5
Marco
conceptual.6
Preguntas de investigacin e
Hiptesis..




























3

Introduccin
Cuando se hacer programas (aunque fuesen sencillos) en lenguaje maquina
(empleando ceros y unos) requiere tiempo y es difcil de comprobar (ya que se
trabaja a nivel de bit), siendo fcil equivocarse; Por lo anterior empleamos el
recurso de dar un nombre a cada instruccin de forma que fuese fcil recordarlas
(Hexadecimal), indicando las direcciones de memoria en nmeros decimales, que
nos resultaba ms familiar.
Al lenguaje resultante de estos cambios lo llamamos lenguaje ensamblador o
simblico, porque se emplean smbolos mnemotcnicos.
Sin embargo, un programa escrito de esta forma no lo entiende la mquina, por lo
que una vez escrito y cuando creemos (despus de haber realizado manualidades
una traza del mismo) que funciona, debemos traducir dichos smbolos y
direcciones a binario para que el procesador pueda interpretarlos.
Cmo hemos realizado esas traducciones? Sencillamente con una lista en donde
constan, como si fuese un diccionario, todos los mnemotcnicos de las
instrucciones y al lado de cada uno de ellos el cdigo correspondiente en binario.
Pasando los nmeros decimales que indican direcciones de operandos binario
tambin hemos comprobado que este trabajo, aunque es sencillo, es muy pesado
fcilmente se pueden cometer errores, con lo que una equivocacin de solo un bit
en la traduccin puede dar al traste con todo el trabajo anterior de diseo y
verificacin a mano del programa, ya que este no funcionara al ejecutarlo la
mquina.
Por consiguiente, para facilitar el trabajo y evitar errores, conviene que esta
traduccin, en principio sencillo pero montono, sea realizada por la propia
mquina. Para ello debemos disear un programa que tome como datos las
instrucciones en lenguaje ensamblador, busque el cdigo correspondiente al
mnemotcnico y convierta la direccin del operando en un nmero binario,
guardando el resultado en la memoria. Tendramos as un traductor automtico
que reducira la tarea de traduccin a unos minutos y, adems, sin errores.
Existen en el mercado un buen nmero de programas traductores ms o menos
inteligentes (a mayor inteligencia realizan ms cosas y permiten al usuario una
mayor facilidad en la escritura, verificacin y depuracin de programas). El
programador solo tiene que escribir el programa en lenguaje ensamblador
siguiendo las normas que le indique el programa traductor que vaya a emplear
(reglas sin tcticas, instrucciones de control, etc.), creando lo que se denomina
programa fuente.
4

Una vez diseado se ejecuta en la maquina el programa traductor, el cual va
tomando las instrucciones escritas en el programa fuente y con el resultado de la
traduccin va formando el programa objeto. Cada procesador tiene un programa
traductor particular, ya que el repertorio de instrucciones maquina; pero pueden
existir varios traductores para una misma maquina: unos sencillos que se limitan a
traducir las instrucciones y poco ms, y otros ms complejos, que detectan
errores, permiten definicin de variables, etc.
A todo traductor de lenguajes ensambladores se les suele llamar simplemente
ensamblador y acompaa el tipo de mquina para el que ha sido diseado.
El campo de operacin de una instruccin especifica la operacin que se debe
realizar. sta debe ser ejecutada sobre algunos datos almacenados en registros
del computador o en palabras de memoria, es decir, sobre los operandos. El modo
de direccionamiento especifica la forma de interpretar la informacin contenida en
cada campo de operando para localizar, en base a esta informacin, el operando.
Los ordenadores utilizan tcnicas de direccionamiento con los siguientes fines:
Dar versatilidad de programacin al usuario proporcionando facilidades
tales como ndices, direccionamientos indirectos, etc., esta versatilidad nos
servir para manejar estructuras de datos complejas como vectores,
matrices, etc.
Reducir el nmero de bits del campo de operando.
Al usuario que tiene poca experiencia, la variedad de modos de direccionamiento
en un procesador le puede parecer excesivamente complicada. Sin embargo, la
disponibilidad de diferentes esquemas de direccionamiento le da al programador
experimentado flexibilidad para escribir programas que son ms eficientes en
cuanto a nmero de instrucciones y tiempo de ejecucin.
Es tal la importancia de los modos de direccionamiento que la potencia de una
mquina se mide tanto por su repertorio de instrucciones como por la variedad de
modos de direccionamiento que es capaz de admitir.
Definicin: Los modos de direccionamiento de un procesador son las diferentes
formas de transformacin del campo de operando de la instruccin en la direccin
del operando.
En esta definicin el trmino direccin debe interpretarse en su sentido ms
general de localizacin del operando, en cualquier lugar, y no en el sentido ms
estricto de direccin de memoria.
A la direccin obtenida de las transformaciones anteriores la llamaremos direccin
efectiva. Esta direccin, en el caso de tratarse de una direccin de memoria, es la
que se cargar en el MAR o registro de direccin de memoria.
5


Objetivos
Con ayuda de este trabajo de investigacin se pretende alcanzar los objetivos
siguientes:
1. Aprender a utilizar un entorno de programacin con lenguaje ensamblador.
2. Conocer el repertorio de instrucciones bsicas de los procesadores de la familia
x86, las diferentes formas de direccionamiento para tratar los datos y el control de
flujo dentro de un programa.
3. Saber estructurar en subrutinas un programa; pasar y recibir parmetros.
Justificacin.

POR QUE UTILIZAR UN LENGUAJE DE PROGRAMACION DE BAJO NIVEL
COMO ENSAMBLADOR?

Al enfrentarse a un proyecto de desarrollo, los programadores toman decisiones
acerca de los idiomas, las tecnologas y plataformas que utilizan. Esto puede
incluir los lenguajes de programacin de alto y bajo nivel. Utilizando el lenguaje
ensamblador, uno de bajo nivel, se les proporciona a los programadores la
oportunidad de mejorar sus habilidades de desarrollo en general.

Mediante el uso del lenguaje de ensamblador, los programadores pueden
maximizar la velocidad a un nivel que no es generalmente posible con lenguajes
de alto nivel. En los casos en los que las aplicaciones tienen requisitos de
rendimiento significativos, esto es una capacidad deseable. La razn por la que los
lenguajes de bajo nivel permiten esta mayor cantidad de control es que las
instrucciones de cdigo ejercen un impacto ms directo sobre los elementos de
hardware del equipo. Adems, ciertos algoritmos se pueden programar
nicamente con el lenguaje ensamblador.
Cualquier persona que trabaje en el campo de la ciencia de la computacin dentro
de cualquier contexto puede aprender acerca de los procesos informticos usando
el lenguaje ensamblador al rellenar algunos de los posibles espacios conceptuales
entre el hardware y el software. A diferencia de la programacin de alto nivel en
donde existe un importante nivel de abstraccin entre el desarrollo de las
aplicaciones y la implementacin del hardware, los programas de ensamblador
estn ms cerca conceptualmente y fsicamente del procesamiento bsico. Por
ejemplo, la programacin de ensamblador puede implicar el control directo sobre
los procesadores y la memoria tales como la programacin de los datos de
almacenamiento de un valor variable para un acceso posterior.

6

Los programadores que trabajan con lenguajes de alto nivel pueden aprender
algunos aspectos de buenas prcticas mediante el uso del lenguaje ensamblador.
Los lenguajes de programacin de alto nivel como Java pueden fomentar que el
programador no tenga en cuenta la aplicacin del hardware en lo absoluto, ya que
es posible aprender y utilizar dichos idiomas sin tener una idea real de lo que est
sucediendo en el nivel inferior. Lograr este tipo de entendimiento a travs de la
programacin de bajo nivel le proporciona a los programadores de alto nivel el
incremento de habilidades para maximizar su rendimiento.
El lenguaje ensamblador proporciona acceso a ciertos recursos y controles al
hardware que simplemente no estn disponibles a travs de lenguajes de alto
nivel. La capacidad de dirigirse a las caractersticas particulares de la arquitectura
dentro de una mquina de computacin especfica es un ejemplo. Otro ejemplo es
la la capacidad de controlar directamente componentes de entrada y de salida
dentro de una computadora.
Es importante como se puede ver, el Lenguaje Ensamblador es directamente
traducible al Lenguaje de Mquina, y viceversa; simplemente, es una abstraccin
que facilita su uso para los seres humanos. Por otro lado, la computadora no
entiende directamente al Lenguaje Ensamblador; es necesario traducirle a
Lenguaje de Mquina. Pero, al ser tan directa la traduccin, pronto aparecieron
los programas Ensambladores, que son traductores que convierten
el cdigo fuente (en Lenguaje Ensamblador) a cdigo objeto (es decir, a Lenguaje
de Mquina. Surge como una necesidad de facilitar al programador la tarea de
trabajar con lenguaje mquina sin perder el control directo con el hardware.
























7



Estructura de un programa en ensamblador.

Tpicamente, un programa ensamblador (assembler en ingls) moderno
crea cdigo objeto traduciendo instrucciones mnemnicas de lenguaje
ensamblador en opcodes, y resolviendo los nombres simblicos para las
localizaciones de memoria y otras entidades. El uso de referencias simblicas es
una caracterstica clave del lenguaje ensamblador, evitando tediosos clculos y
actualizaciones manuales de las direcciones despus de cada modificacin del
programa. La mayora de los ensambladores tambin incluyen facilidades
de macros para realizar sustitucin textual - ej. Generar cortas secuencias de
instrucciones como expansin en lnea en vez de llamar a subrutinas.
Procesos para la creacin de un programa:
Para la creacin de un programa es necesario seguir cinco pasos: Diseo del
algoritmo, codificacin del mismo, su traduccin a lenguaje mquina, la prueba del
programa y la depuracin. En la etapa de diseo se plantea el problema a resolver
y se propone la mejor solucin, creando diagramas esquemticos utilizados para
el mejor planteamiento de la solucin. La codificacin del programa consiste en
escribir el programa en algn lenguaje de programacin (en este caso en
ensamblador 8086), tomando como base la solucin propuesta en el paso anterior.
La traduccin al lenguaje mquina es la creacin del programa objeto, esto es, el
programa escrito como una secuencia de ceros y unos que pueda ser interpretado
por el procesador.
La prueba del programa consiste en verificar que el programa funcione sin errores,
o sea, que haga lo que tiene que hacer. La ltima etapa es la eliminacin de las
fallas detectadas en el programa durante la fase de prueba. La correccin de una
falla normalmente requiere la repeticin de los pasos comenzando desde el
primero o el segundo. Para crear un programa en ensamblador utilizaremos el
debugger, que se encuentra en cualquier PC con el sistema operativo MS-DOS, lo
cual lo pone al alcance de cualquier usuario que tenga acceso a una mquina con
estas caractersticas. Debug solo puede crear archivos con extensin .EXE, y por
las caractersticas de este tipo de programas no pueden ser mayores de 64 kb,
adems deben comenzar en el desplazamiento, offset, o direccin de memoria
0100Hh dentro del segmento especfico.
Software necesario:
Para poder crear un programa se requieren varias herramientas: Primero un editor
para crear el programa fuente. Segundo un compilador (Turbo Assembler) que no
8

es ms que un programa que "traduce" el programa fuente a un programa objeto.
Y tercero un enlazador (Turbo Linker), que genere el programa ejecutable a partir
del programa objeto. El editor puede ser cualquier editor de textos que se tenga a
la mano, como compilador utilizaremos el programa Turbo Assembler (TASM), y
como enlazador utilizaremos el Turbo Link (TLINK). La extensin usada para que
el TASM reconozca los programas fuente en ensamblador es .ASM, una vez
traducido el programa fuente, el TASM crea un archivo con la extensin .OBJ, este
archivo contiene un "formato intermedio" del programa, llamado as porque an no
es ejecutable pero tampoco es ya un programa en lenguaje fuente. El enlazador
genera, a partir de un archivo .OBJ o la combinacin de varios de estos archivos,
un programa ejecutable, cuya extensin es .EXE.
Sintaxis de una lnea en ensamblador.
Un programa en lenguaje ensamblador estar formado por una secuencia de
sentencias. Cada sentencia ocupa una sola lnea y tiene la siguiente estructura:
[Etiqueta] [Operacin] [Operandos] [; Comentarios]
Los cuatro campos de una sentencia son opcionales, si no aparece ninguno de
ellos (una lnea en blanco) tendramos una sentencia vaca.
Su estructura en un programa ejemplo muy simple:

Hemos visto la estructura general. Ahora veremos la posicin de los elementos del
cdigo por 4 columnas:
9


Columna 1: Etiquetas.
Es el nombre simblico de la primera posicin de una instruccin, puntero o dato.
Consta de hasta 31 caracteres que pueden ser las letras de la A a la Z, los
nmeros del 0 al 9 y algunos caracteres especiales como @, _, . y $.
Las etiquetas se rigen por las siguientes normas:
Si se utiliza el punto . ste debe colocarse como primer carcter de la
etiqueta.
El primer carcter no puede ser un dgito
No se pueden utilizar los nombres de instrucciones o registros como
nombres de etiquetas.
Debe situarse en la primera columna.
Debe contener nicamente caracteres alfanumricos.
El mximo de caracteres es de 31.
Las etiquetas son de tipo NEAR cuando el campo de etiqueta finaliza con dos
puntos (:); esto es, se considera cercana: quiere esto decir que cuando realizamos
una llamada sobre dicha etiqueta el ensamblador considera que est dentro del
mismo segmento de cdigo (llamadas intrasegmento) y el procesador slo carga
el puntero de instrucciones IP. Tngase en cuenta que hablamos de instrucciones;
las etiquetas empleadas antes de las directivas, como las directivas de definicin
de datos por ejemplo, no llevan los dos puntos y sin embargo son cercanas.
Las etiquetas son de tipo FAR si el campo de etiqueta no termina con los dos
puntos: en estas etiquetas la instruccin a la que apunta no se encuentra en el
mismo segmento de cdigo sino en otro. Cuando es referenciada en una
transferencia de control se carga el puntero de instrucciones IP y el segmento de
cdigo CS (llamadas intersegmento).
Columna 2: Operacin.
En este campo el programador puede escribir dos tipos de informaciones:
instrucciones ejecutables y pseudo-instrucciones o directivos de ensamblador. En
cualquier caso, el programador deber ceirse a los mnemotcnicos previamente
10

establecidos por el lenguaje ensamblador que se est utilizando y no puede elegir
libremente, como haca en el campo de etiquetas, los nombres a utilizar.
Instrucciones Ejecutables: Este tipo de informacin est compuesto por el
conjunto de mnemotcnicos que forman el repertorio de instrucciones de la
mquina. La principal tarea del traductor es, precisamente, convertir estos
mnemotcnicos en cdigo mquina. Deber adems determinar el nmero
de operaciones de cada instruccin y el tipo de los mismo, etc. La forma
como realice la traduccin depender de cada programa traductor, de la
complejidad del mismo y de la complejidad de la mquina.
Pseudo-instrucciones o directivos de ensamblador: Este tipo de
informacin est compuesta por un conjunto de mnemotcnicos dirigidos al
propio programa traductor para darle las indicaciones, necesarias para que
ste pueda realizar la traduccin de forma correcta. Por ejemplo, no basta
con convertir los mnemotcnicos en cdigo mquina, sino que, adems, se
deber guardar dicho cdigo en una posicin de memoria determinada.
Cmo sabe el traductor a partir de qu posicin de memoria debe ir
colocando los cdigos traducidos? En los programas se suelen emplear
como datos valores constantes guardados en posiciones determinadas.
Cmo ponemos un determinado valor dentro de una posicin de memoria
concreta al traducir el programa? Tambin se deben reservar posiciones de
memoria para guardar resultados. Cmo se hace dicha reserva? Para
resolver todas estas cuestiones y algunas ms se emplean los directivos de
ensamblador, tambin denominados pseudo-instrucciones, porque dichos
mnemotcnicos no se convierten en cdigo mquina, sino que son
ejecutados directamente por el programa traductor. Cada programa
traductor tiene establecidos sus propios directivos. Sin embrago, como las
funciones de todos ellos son similares, estudiaremos los ms comunes en
un apartado posterior.
Columna 3: Operandos.
El tipo de informacin que se puede poner en el campo de operandos depende de
la instruccin que se ha colocado en el campo de mnemotcnicos. En las
instrucciones ejecutables el procesador usa varios modos de direccionamiento
para obtener los operandos y guardar los resultados de las operaciones. El modo
de direccionamiento est determinado, generalmente, mediante una combinacin
del cdigo de operacin y la informacin del campo de operandos.
En el lenguaje ensamblador, en el campo de la instruccin ponamos nicamente
nmeros que representaban direcciones (con el direccionamiento absoluto) o
cantidades que se suman al CP para dar la direccin efectiva (en el
direccionamiento relativo). Esto limita las posibilidades de la traduccin automtica
y obliga al programador a calcular las direcciones para as indicarlas.
11

La mayora de traductores comerciales reconocen nmeros, smbolos y
expresiones en el campo operando. El programador podr elegir la forma de
indicar la direccin del operando para que la programacin le resulte lo ms
sencilla posible.
Nmeros y constantes alfabticos: Las cantidades colocadas en el
campo de operandos puede estar expresadas en diferentes bases de
numeracin. Las bases normalmente utilizadas son la binaria, octal, decimal
y hexadecimal. Para poder distinguir la base utilizada en un determinado
nmero se acompaa dicho nmero por un carcter alfabtico (precediendo
o siguiendo a la cantidad). Estos caracteres pueden cambiar de un
traductor a otro; los ms comunes son:
El carcter B o el % para indicar la base binaria
Ejemplo: B1001, 1101B, %0010, etc.
Los caracteres O, @, Q o C para la base octal, aunque el O se tiende
a no utilizar por la facilidad de confusin con el cero.
Ejemplos: O 172, @245, 327Q, C577.
El carcter D para el decimal. Si en una cantidad se ha omitido
cualquier indicacin de base, se suele suponer que est en base
decimal.
Ejemplos: D10824, 5841, 24D.
Los caracteres H o $ indican las bases hexadecimales.
Ejemplos: HAFF, $01FC, 1107H.

Smbolos: Se conoce como smbolos al conjunto de caracteres
alfanumricos empleados en el campo de operandos para indicar una
direccin. Para construir estos smbolos se deben seguir tambin las reglas
que establezca el traductor que se est utilizando (nos indicar qu tipo de
caracteres podemos emplear, el nmero de ellos, etc.). En algunos
traductores existen smbolos normalizados (con un significado predefinido
por el traductor), que el programador puede utilizar sin necesidad de
definirlos primero, como, por ejemplo, caracteres para indicar el CP(* o el
$), el acumulador (A) o cualquier otro registro interno de la UCP
(B,C,D,X,Y, etc.).
Salvo estos casos, el programador podr definir con amplia libertad sus
propios smbolos principalmente de dos maneras:
1. De forma implcita, cuando a una instruccin ejecutable se le pone
una etiqueta en el programa fuente y se identifica dicha etiqueta con
la direccin de memoria donde se guarda la instruccin en el
programa objetivo. Dicha etiqueta es un smbolo que podemos utilizar
en el campo de operandos para hacer referencia a la posicin
anteriormente mencionada.
2. De forma explcita, indicando al traductor el smbolo que vamos a
utilizar y el valor que deseamos que tenga por medio de las pseudo-
instrucciones, que veremos en apartados posteriores.
Columna 4: Comentario. El campo del comentario o de etiquetas es opcional.
Aqu se situar cualquier comentario personalizado que deseemos. Estos son
12

tiles para saber qu hace un programa sin tener que descifrar el cdigo entero. El
compilador (ensamblador) ignorar todo texto ms all del carcter punto y coma
";".
EJEMPLO

Este ejemplo est desarrollado en lenguaje ensamblador que usa servicios o
funciones de MS-DOS (system calls) para imprimir el mensaje Hola mundo!! en
pantalla.

; HOLA.ASM
; Programa clasico de ejemplo. Despliega una leyenda en pantalla.
.model small ;Tamano del programa.
STACK SEGMENT STACK ; Segmento de pila
DW 64 DUP (?) ; Define espacio en la pila
STACK ENDS
DATA SEGMENT ; Segmento de datos
SALUDO DB "Hola mundo!!",13,10,"$" ; Cadena
DATA ENDS

CODE SEGMENT ; Segmento de Codigo
ASSUME CS:CODE, DS:DATA, SS:STACK
Main: ; Punto de entrada al programa
MOV AX,DATA ; Pone direccin en AX
MOV DS,AX ; Pone la direccin en los registros
MOV DX,OFFSET SALUDO ; Obtiene direccin del mensaje
MOV AH,09H ; Funcin: Visualizar cadena
INT 21H ; Servicio: Funciones alto nivel DOS
MOV AH,4CH ; Funcin: Terminar
INT 21H
CODE ENDS

END INICIO ; Marca fin y define INICIO

Descripcin del programa

1. La declaracin model: Esta es una directiva, que selecciona uno de los 6
modos diferentes que son Pequeito (tiny), pequeo (small), medio
(medium), compacto (compact), grande (large) y extenso (huge).
2. Las declaraciones SEGMENT y ENDS definen los segmentos a usar.
3. La variable SALUDO en el segmento DATA, define la cadena a ser
desplegada. El signo de dlares al final de la cadena (denominado
centinela) es requerido por la funcin de visualizacin de la cadena de MS-
DOS. La cadena incluye los cdigos para carriage-return y line-feed.
4. La etiqueta START en el segmento de cdigo marca el inicio de las
instrucciones del programa.
5. La declaracin DW en el segmento de pila define el espacio para ser usado
por el stack del programa.
13

6. La declaracin ASSUME indica que registros de segmento se asociarn
con las etiquetas declaradas en las definiciones de segmentos.
7. Las primeras dos instrucciones cargan la direccin del segmento de datos
en el registro DS.
8. Las ltimas dos instrucciones del segmento CODE usa la funcin 4CH de
MS-DOS para regresar el control al sistema operativo. Existen muchas
otras formas de hacer esto, pero sta es la ms recomendada.
9. La directiva END indica el final del cdigo fuente y especfica a START
como punto de arranque.
INTRUCCIONES DEL PROGRAMA

Los operandos representan valores, registros o localidades de memoria a ser
accesadas de alguna manera. Las expresiones combinan operandos y operadores
aritmticos y lgicos para calcular en valor o la direccin a acceder.
Los operandos permitidos se enlistan a continuacin:
Constantes.- Pueden ser nmeros, cadenas o expresiones que representan un
valor fijo. Por ejemplo, para cargar un registro con valor constante usaramos la
instruccin MOV indicando el registro y el valor que cargaramos dicho registro.
mov ax,9
mov al,c
Directos: Aqu se debe especificar la direccin de memoria a accesar en la forma
segmento:offset.
mov ax,ss:0031h
mov al,data:0
mov bx,DGROUP:block
Relocalizables: Por medio de un smbolo asociado a una direccin de memoria y
que puede ser usado tambin para llamados.
mov ax, value
call main
mov al,OFFSET dgroup:tabla
mov bx, count
count slo ser vlido si fue declarado con la directiva DW.
14

Contador de localizacin: Usado para indicar la actual localizacin en el actual
segmento durante el ensamblado. Representado con el smbolo $ y tambin
conocido como centinela.
help DB OPCIONES,13,10
F1 DB F1 salva pantalla,13,10
F10 DB F10 exit,13,10,$
DISTANCIA = $-help
Registros: Cuando se hace referencia a cualquiera de los registros de propsito
general, apuntadores, ndices, o de segmento.
Basados: Un operador basado representa una direccin de memoria relativa a
uno de los registros de base (BP o BX). Su sintaxis es:
desplazamiento[BP]
desplazamiento[BX]
[desplazamiento][BP]
Indexado: Un operador indexado representa una direccin de memoria relativa a
uno de los registros ndice (SI o DI). Su sintaxis es:
desplazamiento[DI]
Desplazamiento[SI]
Estructuras.- Su sintaxis es variable.campo. variable es el nombre con que se
declar la estructura, y campo es el nombre del campo dentro de la estructura.
date STRUC
*Lista Alfabtica de Instrucciones
Lista Alfabtica de Instrucciones JZ Jump if Accumulator Zero
ACALL Absolute Call LCALL Long Call
ADD Add Accumulator LJMP Long Jump
ADDC Add Accumulator with Carry MOV Move byte variable
AJMP Absolute Jump MOV bit Move bit
ANL Logical AND for byte variables MOVC Move Code Memory
ANL bit Logical AND for bit variables MOVX Move External Memory
CJNE Compare and Jump if Not Equal MUL Multiply Accumulator by B
15

CLR A Clear Accumulator NOP No Operation
CLR bit Clear bit ORL Logical OR for byte variables
CPL A Complement Accumulator ORL bit Logical OR for bit variables
CPL bit Complement bit POP Pop From Stack
DA Decimal Adjust of Accumulator PUSH Push Onto Stack
DEC Decrement Register RET Return From Subroutine
DIV Divide Accumulator by B RETI Return From Interrupt
DJNZ Decrement Register and Jump if
Not Zero
RL Rotate Accumulator Left
INC Increment Register
RLC Rotate Accumulator Left Through
Carry
JB Jump if Bit Set RR Rotate Accumulator Right
JBC Jump if Bit Set and Clear Bit
RRC Rotate Accumulator Right Through
Carry
JC Jump if Carry Set SETB Set Bit
JMP @ Jump indirect to Address SJMP Short Jump
JNB Jump if Bit Not Set
SUBB Subtract From Accumulator With
Borrow
JNC Jump if Carry Not Set SWAP Swap Accumulator Nibbles
JNZ Jump if Accumulator Not Zero XCH Exchange Bytes
XCHD Exchange Digits
XRL Exclusive OR
?? Undefined Instruction

DIRECTIVAS.

Las directivas son pseudo-operaciones que solo son reconocidas por el
ensamblador. No se deben confundir con las instrucciones, a pesar de que en
algunos casos pueden aadir cdigo a nuestro programa. Su funcin principal es
declarar ciertos elementos de nuestro programa para que puedan ser identificados
ms fcilmente por el programador y tambin para facilitar la tarea de ensamblaje.
Las directivas son usadas para especificar la organizacin de memoria, realizar
ensamblado condicional, definir macros, entrada, salida, control de archivos,
listados, cross-reference, direcciones e informacin acerca de la estructura de un
programa y las declaraciones de datos.
* Conjunto de instrucciones.- Dentro de las directivas ms importantes, tenemos
las que establecen el conjunto de instrucciones a soportar para un
microprocesador en especial:
16

.8086(default).- Activa las instrucciones para el 8086 y 8088 e inhibe las del 80186
y 80286.
.8087(default).- Activa instrucciones para el 8087 y desactiva las del 80287.
.186.- Activa las instrucciones del 80186.
* Declaracin de segmentos.- En lo que respecta a la estructura del programa
tenemos las directivas SEGMENT y ENDS que marcan el inicio y final de un
segmento del programa. Un segmento de programa es una coleccin de
instrucciones y/o datos cuyas direcciones son todas relativas para el mismo
registro de segmento. Su sintaxis es:
nombre SEGMENT [alineacin] [combinacin] [clase]
nombre ENDS
El nombre del segmento es dado por nombre, y debe ser nico. Segmentos con el
mismo nombre se tratan como un mismo segmento. Las opciones alineacin,
combinacin, y clase proporcionan informacin al LINK sobre cmo ajustar los
segmentos. Para alineacin tenemos los siguientes valores: byte (usa cualquier
byte de direccin), word (usa cualquier palabra de direccin, 2 bytes/word), para
(usa direcciones de parrfos, 16 bytes/parrfo, deafult), y page (usa direcciones
de pgina, 256 bytes/page). Combinacin define cmo se combinarn los
segmentos con el mismo nombre. Puede asumir valores de: public (concatena
todos los segmentos en uno solo), stack (igual al anterior, pero con direcciones
relativas al registro SS, common (crea segmentos sobrepuestos colocando el
inicio de todos en una misma direccin), memory (indica al LINK tratar los
segmentos igual que MASM con public, at address (direccionamiento relativo a
address). clase indica el tipo de segmento, sealados con cualquier nombre. Cabe
sealar que en la definicin est permitido el anidar segmentos, pero no se
permite de ninguna manera el sobreponerlos.
* Fin de cdigo fuente.- Otra directiva importante es la que indica el final de un
mdulo. Al alcanzarla el ensamblador ignorar cualquier otra declaracin que siga
a sta. Su sintaxis es:
END [expresin]
La opcin expresin permite definir la direccin en la cual el programa iniciar.
* Asignacin de segmentos.- La directiva ASSUME permite indicar cules sern
los valores por default que asumirn los registros de segmento. Existen dos
formas de hacer esto:
ASSUME registrosegmento:nombre,,,
ASSUME NOTHING
17

NOTHING cancela valores previos.
* Etiquetas.- Las etiquetas son declaradas
nombre:
donde nombre constituye una cadena de caracteres.
* Declaracin de datos.- Estos se declaran segn el tipo, mediante la regla
[nombre] directiva valor,,,
Donde directiva puede ser DB (bytes), DW (palabras), DD (palabra doble), DQ
(palabra cudruple), DT (diez bytes). Tambin pueden usarse las directivas
LABEL (crea etiquetas de instrucciones o datos), EQU (crea smbolos de
igualdad) , y el smbolo = ( asigna absolutos) para declarar smbolos. Estos tienen
la siguiente sintaxis:
nombre = expresin
nombre EQU expresin
nombre LABEL tipo
Donde el tipo puede ser BYTE, WORD, DWORD, QWORD, TBYTE, NEAR, FAR.
* Declaracin de estructuras.- Para la declaracin de estructuras de datos se
emplea la directiva STRUC. Su sintaxis es:
nombre STRUC
campos
nombre ENDS
Modos de Direccionamiento.
Cuando un operando se encuentra en la memoria, es necesario considerar qu
modo de direccionamiento utilizamos para expresar un operando en una ins-
truccin para definir la manera de acceder a un dato concreto. A continuacin,
veremos los modos de direccionamiento que podemos utilizar en un programa
ensamblador:
1. Inmediato.
En este caso, el operando hace referencia a un dato que se encuentra en la
instruccin misma. No hay que hacer ningn acceso extra a memoria para
obtenerlo. Solo podemos utilizar un direccionamiento inmediato como operando
18

fuente. El nmero especificado ha de ser un valor que se pueda expresar con 32
bits como mximo, que ser el resultado de evaluar una expresin aritmtica
formada por valores numricos y operadores aritmticos y tambin sumar una
direccin de memoria representada mediante una etiqueta (nombre de una
variable), con la excepcin de la instruccin mov cuando el primer operando es un
registro de 64 bits, para el que podremos especificar un valor que se podr
expresar con 64 bits.
En este modo es el operando el que figura en la instruccin no su direccin. En
otras palabras el campo de operando contiene l mismo, sin transformacin
alguna, la informacin sobre la que hay que operar. Este modo es til para
inicializar registros o palabras de memoria con un valor constante.
Ejemplo:

Para especificar un valor inmediato en una instruccin se utiliza la misma notacin
que la especificada en la definicin de variables inicializadas.
2. Directo a registro.
En este caso, el operando hace referencia a un dato que se encuentra
almacenado en un registro. En este modo de direccionamiento podemos
especificar cualquier registro de propsito general (registros de datos, registros
ndices y registros apuntadores).
Ejemplo:

3. Directo a memoria.
En este caso, el operando hace referencia a un dato que se encuentra
almacenado en una posicin de memoria. El operando habr de especificar el
nombre de una variable de memoria entre corchetes [ ]; cabe recordar que en
sintaxis NASM se interpreta el nombre de una variable sin corchetes como la
direccin de la variable y no como el contenido de la variable.
Ejemplo:
19


4. Indirecto a registro.
En este caso, el operando hace referencia a un dato que se encuentra
almacenado en una posicin de memoria. El operando habr de especificar un
registro entre corchetes [ ]; el registro contendr la direccin de memoria a la cual
queremos acceder.
Ejemplo:

5. Indexado.
En este caso, el operando hace referencia a un dato que se encuentra
almacenado en una posicin de memoria. Digamos que un operando utiliza
direccionamiento indexado si especifica una direccin de memoria como direccin
base que puede ser expresada mediante un nmero o el nombre de una variable
que tengamos definida, sumada a un registro que acta como ndice respecto a
esta direccin de memoria entre corchetes [ ].

6. Relativo.
En este caso, el operando hace referencia a un dato que se encuentra
almacenado en una posicin de memoria. Digamos que un operando utiliza
direccionamiento relativo cuando especifica un registro sumado a un nmero entre
corchetes [ ]. El registro contendr una direccin de memoria que actuar como
direccin base y el nmero como un desplazamiento respecto a esta direccin.

20

7. Relativo a PC.
En el modo de 64 bits se permite utilizar direccionamiento relativo a PC en
cualquier instruccin; en otros modos de operacin, el direccionamiento relativo a
PC se reserva exclusivamente para las instrucciones de salto condicional.
Este modo de direccionamiento es equivalente a un direccionamiento relativo a
registro base en el que el registro base es el registro contador de programa (PC).
En la arquitectura x86 este registro se denomina rip, y el desplazamiento es el
valor que sumaremos al contador de programa para determinar la direccin de
memoria a la que queremos acceder.
Utilizaremos este modo de direccionamiento habitualmente en las instrucciones de
salto condicional. En estas instrucciones especificaremos una etiqueta que
representar el punto del cdigo al que queremos saltar. La utilizacin del registro
contador de programa es implcita, pero para emplear este modo de
direccionamiento, se ha de codificar el desplazamiento respecto al contador de
programa; el clculo para obtener este desplazamiento a partir de la direccin
representada por la etiqueta se resuelve durante el ensamblaje y es transparente
para el programador.
Ejemplo:

8. Direccionamiento a pila.
Es un direccionamiento implcito; se trabaja implcitamente con la cima de la pila,
mediante el registro apuntador a pila (stack pointer); en la arquitectura x86 este
registro se llama rsp. En la pila solo podremos almacenar valores de 16 bits y de
32 bits.
Solo existen dos instrucciones especficas diseadas para trabajar con la pila:

Para expresar el operando fuente o destino podemos utilizar cualquier tipo de
direccionamiento descrito anteriormente, pero lo ms habitual es utilizar el
direccionamiento a registro.
Ejemplo:

21

Cibergrafa.

http://www.monografias.com/trabajos76/estructura-programa-
ensamblador/estructura-programa-ensamblador2.shtml
http://www.monografias.com/trabajos14/leng-ensamblador/leng-
ensamblador.shtml#MODOS
http://html.rincondelvago.com/ensamblador_5.html
http://www.gayatlacomulco.com/tutorials/ensamblador/t14.htm
http://profehussein.blogspot.mx/2008/06/estructura-de-un-programa-en-
lenguaje.html
http://www.alciro.org/alciro/microcontroladores-8051_24/estructura-programa-
ensamblador_289.htm
http://es.wikipedia.org/wiki/Lenguaje_ensamblador

http://es.wikipedia.org/wiki/Modos_de_direccionamiento

You might also like