LENGUAJE ENSAMBLADOR
Enviado por binghiman • 5 de Septiembre de 2011 • 7.179 Palabras (29 Páginas) • 1.087 Visitas
BREVE RESUMEN DE LENGUAJE ENSAMBLADOR
0.- MOTIVACION.
El lenguaje ensamblador continúa siendo imprescindible para imple-
mentar fragmentos de código donde la velocidad del ejecutable y/o
su tamaño sean críticos. Afortunadamente, muchos compiladores per-
miten la inclusión directa en el código fuente de sentencias en
ensamblador, de forma que ya no es necesario en la mayor parte de
los casos el uso de ensambladores. Como ventaja adicional, no es
necesario conocer las directivas de ensamblador, ya que pueden es-
tablecerse desde el entorno de desarrollo y van implícitas en las
directivas del compilador, por ejemplo, el compilador Pascal de
Borland o el compilador C/C++ de la misma compañía.
Aún así, a muchos programadores les resulta difícil renunciar al
control absoluto de la máquina que permite el lenguaje ensambla-
dor.
1.-REGISTROS DEL 8086
El 8086 dispone de ocho registros de propósito general, que pode-
mos considerar como memorias implementadas sobre la misma CPU de
acceso muy rápido. Estos registros reciben los nombres de AX, BX,
CX, DX, SI, DI, BP, SP. Existe tambien un registro IP (Instruction
Pointer)que apunta a la siguiente instrucción a ejecutar, formando
su dirección junto con el registro CS, que citaremos a
continuación. Aparte de los registros generales y de IP, existen
registros de segmento, llamados CS, DS, SS, ES y un registro de
flags, cuyos bits no son accesibles directamente y que reflejan
los resultados de distintas operaciones.
Cualquiera de los registros de propósito general puede usarse para
escribir a/desde memoria, realizar operaciones, como punteros o
contadores, pero cada uno tiene una personalidad especial, y es
una buena práctica de programación usarlos para lo que fueron
principalmente concebidos.
AX se usa siempre en multiplicaciones y divisiones y es el mas
eficiente para operaciones aritméticas y de movimiento de datos.
BX se usa como puntero, y junto con DS referencia posiciones de
memoria. Por ejemplo, para cargar en AL el contenido de la posi-
ción de memoria número 9:
MOV AX,0
MOV DS,AX
MOV BX,9
MOV AL,[BX]
CX se usa principalmente como contador en los bucles. Estos son
tan frecuentes que existe una instrucción especial, LOOP, que
comprueba su valor, volviendo al principio del bucle si es
distinto de cero:
MOV CX,10
BUCLE:
instrucciones
LOOP BUCLE
DX es el único registro que puede usarse para acceder a puertos.
Por ejemplo, para escribir 62H en la dirección de puerto 1000H:
MOV AL,62H
MOV DX,1000H
OUT DX,AL
SI se usa como puntero. Su nombre proviene de Source Index, y se
usa principalmente con instrucciones de cadena:
CLD
MOV AX,0
MOV DS,AX
MOV SI,20
LODSB
carga en AX el valor de la posición 20 de memoria. SI se incrementa
en una unidad. En combinación con LOOP permite leer posiciones su-
cesivas de memoria.
DI tambien se usa como puntero. Permite escribir en posiciones
sucesivas de memoria cuando se usa con instrucciones de cadena:
CLD
MOV DX,0
MOV ES,DX
MOV DI,2048
STOSB
escribe el contenido de AL en 0000:2048. Mientras que DI usa a ES
como segmento, SI usa a DS.
BX, DI y SI actuan como punteros relativos a DS, o a ES en el caso
de DI cuando se usa con funciones de cadena. BP actua tambien co-
mo puntero, pero relativo al segmento de pila SS.
SP es entre los registros de uso general el mas específico, ya que
no se recomienda su uso, pues apunta al extremo superior de la pi-
la, y por ello no debe modificarse salvo que se sepa exactamente
que se está haciendo.
2.-ESTRUCTURA DE UN PROGRAMA EN ENSAMBLADOR.
Expondremos brevemente la estructura de un programa fuente en en-
samblador. Este está compuesto por una serie de segmentos para la
pila, el código y los datos. Los segmentos no pueden estar anida-
dos.
Cada uno comienza con el nombre del segmento seguido de la pala-
bra SEGMENT y alguna o algunas cadenas exigidas por el enlazador.
Cada segmento termina con el nombre del segmento seguido de la
palabra ENDS.
El programa termina con la palabra END seguida del nombre del pun-
to de entrada al programa.
De esta forma, el armazón de un programa en ensamblador es el si-
guiente:
PILA SEGMENT STACK 'STACK'
.
.
PILA ENDS
DATOS SEGMENT 'DATA'
.
.
DATOS ENDS
CODIGO SEGMENT 'CODE'
.
.
CODIGO ENDS
END [ENTRADA]
donde [ENTRADA] es el nombre del punto donde se inicia la secuen-
cia de instrucciones.
Dentro del segmento de pila, se establece el tamaño de ésta. La
forma habitual de hacerlo es mediante la sentencia DW (define pa-
labra) seguida del número de palabras que vamos a reservar y la
sentencia DUP (?). Así:
PILA SEGMENT STACK 'STACK'
DW 100H DUP(?)
PILA ENDS
establece un segmento de pila con un tamaño de 100H palabras (512
bytes), sin especificar el contenido inicial.
Las directivas que se emplean habitualmente para establecer el
tamaño de la pila son:
DB Define Byte 1 Byte.
DW Define Word 2 Bytes.
DD Define doble palabra 4 Bytes.
DQ Define cuádruple palabra 8 Bytes.
La sintaxis de DUP es expresión1 DUP expresión2. expresión1 indi-
ca el número de veces a incluir consecutivamente expresión2 en el
segmento. Cuando expresión2 es (?) indicamos que no es importante
el contenido inicial. No
...