Sunteți pe pagina 1din 40

Ensamblador y

lenguaje ensamblador
Equipo 5

Lenguaje mquina
El ordenador slo entiende un lenguaje muy
restringido y de bajo nivel llamado lenguaje
mquina
El lenguaje mquina depende del procesador
Existe una incompatibilidad innata entre los
distintos procesadores
Constituye una de las caractersticas ms
importantes de su arquitectura
El lenguaje mquina establece las
capacidades bsicas del computador
El lenguaje mquina est formado por un
conjunto de instrucciones mquina
Cada instruccin tiene una representacin
determinada en forma de bits, almacenados en
memoria
Los distintos tipos de representacin se denominan
formato de instruccin

Lenguaje mquina
Propiedades de las instrucciones mquina
Realizan una nica y sencilla funcin su
decodificacin es sencilla
Utilizan un nmero fijo de operandos
Su codificacin en bits es bastante sistemtica
decodificacin ms fcil
Son autocontenidas
Contienen toda la informacin necesaria
para su ejecucin
Su interpretacin no depende de su
posicin en el programa o en la memoria
Son independientes
No requieren de la informacin de otras
instrucciones para ejecutarse
De transferencia de informacin
Transferencia de control
Aritmticas
Lgicas
Comparacin
Desplazamiento
Acceso a bits individuales
De entrada/salida
Miscelneas

Lenguaje mquina
Formatos de instruccin mquina
Cada instruccin debe contener la siguiente
informacin
Operacin a realizar
Direccin de los operandos
Direccin del resultado
Direccin de la siguiente instruccin
Modo de representacin de los operandos
Un formato es un conjunto de bits que
contiene dicha informacin

La longitud del formato es el nmero de bits


que lo componen
Su estructura es el el significado de cada bit
dentro de la instruccin

Lenguaje mquina
Los formatos se dividen en campos
Cadenas de bits contiguos
Tipos bsicos de campos
Cdigo de operacin
Indica la operacin a realizar
Direccin (uno o varios)
Indica la direccin de un dato, un resultado
o una instruccin

Ensamblador

Al desarrollarse las primeras computadoras electrnicas, se vio la


necesidad de programarlas, es decir, de almacenar en memoria la
informacin sobre la tarea que iban a ejecutar. Las primeras se usaban
como calculadoras simples; se les indicaban los pasos de clculo, uno por
uno.

John Von Neumann desarroll el modelo que lleva su nombre, para


describir este concepto de "programa almacenado". En este modelo, se
tiene una abstraccin de la memoria como un conjunto de celdas, que
almacenan simplemente nmeros. Estos nmeros pueden representar dos
cosas: los datos, sobre los que va a trabajar el programa; o bien, el
programa en s.

Cmo es que describimos un programa como nmeros? Se tena el


problema de representar las acciones que iba a realizar la computadora, y
que la memoria, al estar compuesta por switches correspondientes al
concepto de bit, solamente nos permita almacenar nmeros binarios.

La solucin que se tom fue la siguiente: a cada accin que sea capaz de
realizar nuestra computadora, asociarle un nmero, que ser su cdigo de
operacin (opcode) . Por ejemplo, una calculadora programable simple
podra asignar los opcodes :
1 = SUMA, 2 = RESTA, 3 = MULTIPLICA, 4 = DIVIDE

Ensamblador

La descripcin y uso de los opcodes es lo que llamamos lenguaje de


mquina . Es decir, la lista de cdigos que la mquina va a interpretar
como instrucciones, describe las capacidades de programacin que
tenemos de ella; es el lenguaje ms primitivo, depende directamente del
hardware, y requiere del programador que conozca el funcionamiento de la
mquina al ms bajo nivel.

Cuando abstraemos los opcodes y los sustituimos por una palabra que sea
una clave de su significado, a la cual comnmente se le conoce como
mnemnico , tenemos el concepto de Lenguaje Ensamblador . As,
podemos definir simplemente al Lenguaje Ensamblador de la siguiente
forma:

Lenguaje Ensamblador es la primera abstraccin del Lenguaje de


Mquina , consistente en asociar a los opcodes palabras clave que faciliten
su uso por parte del programador

Ensamblador

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. Originalmente, este proceso
se haca a mano, usando para ello hojas donde se escriban tablas de
programa similares al ejemplo de la calculadora que vimos arriba . 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).

Una caracterstica que hay que resaltar, es que al depender estos


lenguajes del hardware, hay un distinto Lenguaje de Mquina (y, por
consiguiente, un distinto Lenguaje Ensamblador) para cada CPU.

Ensamblador

Ventajas y desventajas del Lenguaje Ensamblador

Una vez que hemos visto la evolucin de los lenguajes, cabe preguntarse: En
estos tiempos "modernos", para qu quiero el Lenguaje Ensamblador?

El proceso de evolucin trajo consigo algunas desventajas, que ahora veremos


como las ventajas de usar el Lenguaje Ensamblador, respecto a un lenguaje de
alto nivel:

Velocidad
Eficiencia de tamao
Flexibilidad

Por otro lado, al ser un lenguaje ms primitivo, el Ensamblador tiene ciertas


desventajas respecto a los lenguajes de alto nivel:

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

Proceso de ensamblado

Proceso de ensamblado
TASM: Ensamblador
Se le llama ensamblador no slo al lenguaje; sino tambin al
programa que traduce el cdigo fuente escrito en ensamblador, a
cdigo objeto, equivalente a los opcodes en lenguaje de mquina.
En el caso de 8086 y familia, el ensamblador, sea TASM (Borland) o
MASM (Microsoft), se encarga de generar los archivos .OBJ que
representan el cdigo de mquina asociado al programa fuente en
ensamblador.
La sintaxis bsica para su uso es:
TASM <nombre del programa> {opciones}
En el nombre del programa, podemos omitir la extensin .ASM, que
es la que tenemos por defecto.

Proceso de ensamblado
Por ejemplo, para ensamblar el programa HOLA.ASM, basta la
siguiente lnea de comandos:
C> TASM HOLA
En las opciones se puede controlar el proceso de ensamblado, para
que genere informacin adicional o cambie su forma de operacin.
Las dos ms tiles para este curso sern:
/la
Genera un archivo, adicional al .OBJ, con extensin .LST, que muestra
un listado detallado del proceso de ensamblado. Entre otras cosas,
muestra la asociacin existente entre el cdigo fuente y los opcodes
generados.

Proceso de ensamblado
/zi
Almacena informacin de smbolos junto con el programa objeto, til
para que el depurador permita ejecutar el cdigo objeto en sincrona
con el cdigo fuente.
As, se recomienda que durante el desarrollo de un programa se
ejecute TASM con una lnea de comandos similar a la siguiente:
C> TASM HOLA /zi /la

En algunas versiones las opciones deben ponerse previamente, por


ejemplo:
C> TASM /zi /la HOLA

Proceso de ensamblado
TLINK: Linker
Un archivo .OBJ, si bien contiene ya todo el cdigo de mquina, no
puede ser ejecutado todava por el sistema operativo, pues no
contiene informacin necesaria para el mismo, tal como la memoria
requerida. Esto se coloca en un encabezado, que es ledo por el
sistema para determinar cmo ejecutar el programa.
Por otro lado, cuando hacemos un programa en varios mdulos, no
solamente existe un cdigo objeto sino varios, que debemos combinar
o relacionar entre s.
Estos procesos son llevados a cabo por el TLINK; el cual toma como
entrada uno o varios archivos .OBJ y genera los archivos ya
ejecutables por el sistema, con extensin .COM o .EXE. Desde el
sistema operativo 4.0 se est buscando eliminar a los archivos .COM,
por sus limitaciones; por lo cual, en general no se trabaja con ellos en
este curso.

Proceso de ensamblado
Se ejecuta en forma similar al TASM, desde la lnea de comandos
("prompt"):
La sintaxis bsica para su uso es:
TLINK <nombre del programa o programas> {opciones}

En el nombre del programa, podemos omitir la extensin .OBJ, que es


la que tenemos por defecto.
Por ejemplo, para ligar el cdigo objeto generado anteriormente
HOLA.OBJ, basta la siguiente lnea de comandos:
C> TLINK HOLA

En las opciones se puede controlar el proceso de ligado. La opcin


que generalmente se utiliza ms es:

Proceso de ensamblado
/v
Almacena informacin de smbolos junto con el programa ejecutable,
til para que el depurador permita ejecutar el cdigo objeto en
sincrona con el cdigo fuente. Cuidado: Esta opcin debe ponerse
en minsculas, estrictamente.
As, se recomienda que durante el desarrollo de un programa se
ejecute TLINK con una lnea de comandos similar a la siguiente:

C> TLINK HOLA /v


Tambin aqu a veces se requiere de poner las opciones antes, como
por ejemplo:
C> TLINK /v HOLA

Proceso de ensamblado
Otros puntos que intervienen en el proceso de ensamblado:

- MAKE: Reglas de construccin


- TD: Depuracin
- TPROF: Pruebas de eficiencia

Lenguaje ensamblador. 1era parte


EL FORMATO DEL ENSAMBLADOR.
De acuerdo a las convenciones y notacin seguidas en el manual del
Microsoft Macro Assembler, y que usaremos nosotros tambin, tenemos:
Notacin
Negritas
Itlicas
[]
,,,

letra chica

Significado
Comandos, smbolos y parmetros a ser
usados como se muestra.
Todo aquello que debe ser
reemplazado por el usuario
Indican un parmetro opcional
Denota un parmetros que puede repetirse
varias veces
Separa dos valores mutuamente
excluyentes
Usada para ejemplos. Cdigo y lo que
aparece en pantalla.

Lenguaje ensamblador. 1era parte


Cada programa en lenguaje ensamblador es creado a partir de un archivo
fuente de cdigo ensamblador. Estos son archivos de texto que contienen
todas las declaraciones de datos e instrucciones que componen al
programa y que se agrupan en reas o secciones, cada una con un
propsito especial. Las sentencias en ensamblador tienen la siguiente
sintaxis:
[nombre] mnemnico [operandos] [;comentarios]
En cuanto a la estructura, todos los archivos fuente tienen la misma forma:
cero o ms segmentos de programa seguidos por una directiva END. No
hay una regla sobre la estructura u orden que deben seguir las diversas
secciones o reas en la creacin del cdigo fuente de un programa en
ensamblador.

Lenguaje ensamblador. 1era parte


Sin embargo la mayora de los programas tiene un segmento de datos,
un segmento de cdigo y un segmento de stack, los cuales pueden
ser puestos en cualquier lugar.
Para la definicin de datos y declaracin de instrucciones y operandos el
MASM reconoce el conjunto de caracteres formado por letras maysculas,
letras minsculas (excluyendo caracteres acentuados, , ), nmeros,
y los smbolos: ? @ _ $ : . [ ] ( ) { } + - / * & % ! ~ \ = # ;
,"

La declaracin de nmeros requiere tener presente ciertas consideraciones.


En el MASM un entero se refiere a un nmero entero: combinacin de
dgitos hexadecimales, octales, decimales o binarios, ms una raz
opcional. La raz se especifica con B, Q u O, D, o H. El ensamblador usar
siempre la raz decimal por defecto, si se omite la especificacin de la raz
(la cual se puede cambiar con la directiva .RADIX). As nosotros podemos
especificar un entero de la siguiente manera: dgitos, dgitosB, dgitosQ
o dgitosO, dgitosD, dgitosH. Si una D o B aparecen al final de un
nmero, stas siempre se considerarn un indicador de raz, e.g. 11B ser
tratado como 112 (210), mientras que si se trata del nmero 11B16 debe
introducirse como 11Bh.

Lenguaje ensamblador. 1era parte


Para los nmeros reales tenemos al designador R, que slo puede ser
usado con nmeros hexadecimales de 8, 16, 20 dgitos de la forma
dgitosR. Tambin puede usarse una de las directivas DD, DQ, y DT con
el formato [+-]dgitos.dgitos[E[+-]igitos].
Las cadenas de carcter y constantes alfanumricas son formadas como
caracteres o "caracteres" . Para referencias simblicas se utilizan
cadenas especiales denominadas nombres. Los nombres son cadenas de
caracteres que no se entrecomillan y que deben comenzar con una A..Z
a..z _ $ @ los caracteres restantes pueden ser cualquiera de los
permitidos, y solamente los 31 primeros caracteres son reconocidos.

Lenguaje ensamblador. 1era parte


DIRECTIVAS.
El MASM posee un conjunto de instrucciones que no pertenecen al
lenguaje ensamblador propiamente sino que son instrucciones que
nicamente son reconocidas por el ensamblador y que han sido agregadas
para facilitar la tarea de ensamblado, tanto para el programador como para
el programa que lo lleva a cabo. Dichas instrucciones son denominadas
directivas. En general, 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. El apndice D proporciona una lista completa de estas directivas.
Conjunto de instrucciones.- Dentro de las directivas ms importantes,
tenemos las que establecen el conjunto de instrucciones a soportar para un
microprocesador en especial:

Lenguaje ensamblador. 1era parte

.8086(defecto).- Activa las instrucciones para el 8086 y 8088 e inhibe las


del 80186 y 80286.
.8087(defecto).- Activa instrucciones para el 8087 y desactiva las del
80287.
.186.- Activa las instrucciones del 80186.
.286c.- Activa instrucciones del 80286 en modo no protegido.
.286p.- Activa instrucciones del 80286 en modo protegido y no protegido.
.287.- Activa las instrucciones para el 80287.

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

Lenguaje ensamblador. 1era parte


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 cuales
sern los valores por defecto que asumirn los registros de segmento.
Existen dos formas de hacer esto:
ASSUME registrosegmento:nombre,,,
ASSUME NOTHING

NOTHING cancela valores previos.

Lenguaje ensamblador. 1era parte


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

Lenguaje ensamblador. 1era parte


donde 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

Lenguaje ensamblador. 2nda parte


CONJUNTO DE INSTRUCCIONES.
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
mov bx,65535/3

Lenguaje ensamblador. 2nda parte

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

Lenguaje ensamblador. 2nda parte

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

Lenguaje ensamblador. 2nda parte

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]
[BP+desplazamiento]
[BP].desplazamiento
[BP]+desplazamiento
en cada caso la direccin efectiva es la suma del desplazamiento y el
contenido del registro.
mov
mov
mov
mov

ax,[BP]
al,[bx]
bx,12[bx]
bx,fred[bp]

Lenguaje ensamblador. 2nda parte

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]
[desplazamiento][DI]
[DI+desplazamiento]
[DI].desplazamiento
[DI]+desplazamiento
en cada caso la direccin efectiva es la suma del desplazamiento y el
contenido del registro.
mov
mov
mov
mov

ax,[si]
al,[di]
bx,12[di]
bx,fred[si]

Lenguaje ensamblador. 2nda parte

Base-indexados.- Un operador base-indexado representa una direccin


de memoria relativa a la combinacin de los registros de base e ndice. Su
sintaxis es:

desplazamiento[BP][SI]
desplazamiento[BX][DI]
desplazamiento[BX][SI]
desplazamiento[BP][DI]
[desplazamiento][BP][DI]
[BP+DI+desplazamiento]
[BP+DI].desplazamiento
[DI]+desplazamiento+[BP]
en cada caso la direccin efectiva es la suma del desplazamiento y el
contenido del registro.
mov
mov
mov
mov

ax,[BP][si]
al,[bx+di]
bx,12[bp+di]
bx,fred[bx][si]

Lenguaje ensamblador. 2nda parte

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
mes DW ?
dia
DW ?
aa
DW ?
date ENDS
actual

date ja,01,84

mov
mov

ax,actual.dia
actual.aa, 85

Lenguaje ensamblador. 2nda parte

Operadores y expresiones.- Se cuenta con los siguientes operadores:

-aritmticos
expresin1 * expresin2
expresin1 / expresin2
expresin1 MOD expresin2
expresin1 + expresin2
expresin1 - expresin2
+ expresin
- expresin
-de corrimiento
expresin1 SHR contador
expresin1 SHL contador

Lenguaje ensamblador. 2nda parte


-relacionales
expresin1
expresin1
expresin1
expresin1
expresin1
expresin1

EQ expresin2
NE expresin2
LT expresin2
LE expresin2
GT expresin2
GE expresin2

- de bit
NOT expresin
expresin1 AND expresin2
expresin1 OR expresin2
expresin1 XOR expresin2
-de ndice
[expresin1] [expresin2]

Lenguaje ensamblador. 2nda parte


ejemplos:

cx,dgroup:1

mov
mov
mov

al, string[3]
string[last],al
cx,dgroup:[1]

; igual a mov

-de apuntador
tipo PTR expresin
tipo puede ser BYTE 1, WORD 2, DWORD 4, QWORD 8, TBYTE
10, NEAR 0FFFFh, FAR 0FFFEh. Ejemplos:
call FAR PTR subrout3
mov BYTE ptr [array], 1
add al, BYTE ptr [full_word]
-de nombre de campo
estructura.campo
ejemplos:

inc month.day
mov time.min,0
mov [bx].dest

Lenguaje ensamblador. 2nda parte


-de propsito especial.
OFFSET expresin.- Regresa el desplazamiento del operando
mov bx, OFFSET dgroup:array
mov bx, offset subrout3
SHORT etiqueta.- Para un salto de menos de 128 bytes
jmp
SHORT loop
LENGTH variable.- Regresa el nmero de elementos de variable segn su tipo
mov cx,length array
SIZE variable.- Regresa el tamao en bytes alojados para variable
mov cx,size array
SEG expresin.- Regresa el valor del segmento para expresin
mov ax, SEG saludo

Ejemplo Hola mundo!!


Cdigo
; HOLA.ASM
; Programa clsico de ejemplo. Despliega una leyenda en pantalla.
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 Cdigo
ASSUME CS:CODE, DS:DATA, SS:STACK
INICIO:
MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET SALUDO
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODE
ENDS
END INICIO

; Punto de entrada al programa


; Pone direccin en AX
; Pone la direccin en los registros
; Obtiene direccin del mensaje
; Funcin: Visualizar cadena
; Servicio: Funciones alto nivel DOS
; Funcin: Terminar

; Marca fin y define INICIO

Ejemplo Hola mundo!!

LA DESCRIPCIN DEL PROGRAMA ES COMO SIGUE:

1.- Las declaraciones SEGMENT y ENDS definen los segmentos a usar.

2.- 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 MSDOS. La cadena incluye los cdigos para carriage-return y line-feed.
3.- La etiqueta START en el segmento de cdigo marca el inicio de las
instrucciones del programa.

4.- La declaracin DW en el segmento de pila define el espacio para ser usado


por el stack del programa.

Ejemplo Hola mundo!!

5.- La declaracin ASSUME indica que registros de segmento se asociarn con


las etiquetas declaradas en las definiciones de segmentos.

6.- Las primeras dos instrucciones cargan la direccin del segmento de datos
en el registro DS. Estas instrucciones no son necesarias para los
segmentos de cdigo y stack puesto que la direccin del segmento de
cdigo siempre es cargado en el registro CS y la direccin de la declaracin
del stack segment es automticamente cargada en el registro SS.
7.- 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.

8.- La directiva END indica el final del cdigo fuente y especifica a START como
punto de arranque.