Você está na página 1de 40

Ensamblador y

lenguaje ensamblador
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 Significado
Negritas Comandos, smbolos y parmetros a ser
usados como se muestra.
Itlicas 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
letra chica 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 ax,[BP]
mov al,[bx]
mov bx,12[bx]
mov 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 ax,[si]
mov al,[di]
mov bx,12[di]
mov 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 ax,[BP][si]
mov al,[bx+di]
mov bx,12[bp+di]
mov 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 ax,actual.dia
mov 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 EQ expresin2
expresin1 NE expresin2
expresin1 LT expresin2
expresin1 LE expresin2
expresin1 GT expresin2
expresin1 GE expresin2

- de bit
NOT expresin
expresin1 AND expresin2
expresin1 OR expresin2
expresin1 XOR expresin2

-de ndice
[expresin1] [expresin2]
Lenguaje ensamblador. 2nda parte
ejemplos:
mov al, string[3]
mov string[last],al
mov cx,dgroup:[1] ; igual a mov cx,dgroup:1

-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: ; 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
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 MS-
DOS. 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.

Você também pode gostar