Actualizado el 21 de Marzo del 2018 (Publicado el 3 de Enero del 2018)
1.031 visualizaciones desde el 3 de Enero del 2018
357,3 KB
45 paginas
Creado hace 9a (15/10/2014)
Programación en ensamblador x86-16bits
Índice
1. Organización de memoria de un programa
2. Ciclo de desarrollo de un programa
3. Recursos de programación
1/90
Programación en ensamblador x86-16bits
1. Organización de memoria de un programa
1. Organización de memoria de un programa
Índice
1. Secciones de un programa
1. Cabecera y binario
2. Ejecutables .COM
2. Programa vs. proceso
3. Entorno de desarrollo MASM
1. Definición completa de secciones
2. Definición simplificada de secciones
3.
4. Declaración de datos
Inicialización de registros de segmento
2/90
1
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
Programación en ensamblador x86-16bits
1. Organización de memoria de un programa
(cid:127) Un programa NO es sólo un conjunto de instrucciones
(cid:127) Un programa organiza su mapa de memoria en
secciones en aras de la eficiencia
Código
Datos
Pila
…
(cid:127) El programa compilado se dispone en una imagen
guardada como un fichero ejecutable
3/90
Programación en ensamblador x86-16bits
1.1. Secciones de un programa
4/90
2
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
Programación en ensamblador x86-16bits
1.1. Secciones de un programa
(cid:127) Las secciones de un programa son:
Código o texto
Datos
Datos no inicializados (bss)
Heap
Pila
5/90
Programación en ensamblador x86-16bits
1.1. Secciones de un programa
(cid:127) Sección de código o texto
Contiene la secuencia de instrucciones a ejecutar
Suele ser de sólo lectura aunque algunos programas se
automodifican o reservan pequeños espacios para
datos en esta sección
Requiere de un puntero especial (puntero de instrucción
o contador de programa) que señala la posición de la
siguiente instrucción a ejecutar
Característica típica del modelo de Von Neumann
6/90
3
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
Programación en ensamblador x86-16bits
1.1. Secciones de un programa
(cid:127) Sección de datos
Contiene las variables globales (accesibles desde todo
el programa) y las estáticas (su tiempo de vida abarca
todo el tiempo de ejecución1) que contienen datos
inicializados por el programador
Es una sección de lectura y escritura
(cid:127) Sección bss (Block Started by Symbol)
Contiene variables estáticas no inicializadas, es decir,
cuyo valor inicial es 0
Normalmente esta sección no se almacena en el fichero
imagen del ejecutable sino que es el cargador del
sistema operativo (dispacher) quien realiza la reserva de
espacio en memoria principal y el relleno con 0
1 Una variable estática de un procedimiento, no se destruye al terminar el
7/90
procedimiento pero sólo es accesible desde el procedimiento
Programación en ensamblador x86-16bits
1.1. Secciones de un programa
(cid:127) Sección de heap
Se usa para hacer reservas dinámicas de memoria en
tiempo de ejecución
Las reservas de memoria pueden liberarse o
incrementarse en ejecución
No aparece en el fichero imagen del ejecutable
8/90
4
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
Programación en ensamblador x86-16bits
1.1. Secciones de un programa
(cid:127) Sección de pila
Implementa un área de memoria con un tipo de acceso
LIFO (Last Input First Output)
Se utiliza en el manejo de procedimientos (subrutinas)
para almacenar temporalmente los argumentos y
variables locales
También se usa para salvaguardar datos de los registros
Requiere de un puntero especial (puntero de pila) que
indica la posición de memoria de la cima de la pila
Se suele utilizar otro puntero especial (puntero de
marco de pila) que sirve para referenciar los
argumentos y variables locales propios del
procedimiento (subrutina) en curso
9/90
Programación en ensamblador x86-16bits
1.1. Secciones de un programa
(cid:127) CODE: código del programa
(cid:127) DATA: datos globales y estáticos
(cid:127) BSS: datos no inicializados
(cid:127) HEAP: variables ubicadas (‘alocadas’) dinámicamente
(cid:127) STACK: datos locales y argumentos de funciones
CODE
DATA
BSS
HEAP
STACK
int g = 1;
int i;
/* g se sitúa en DATA */
/* i se sitúa en BSS */
/* a se sitúa en STACK */
int main() {
int a;
...
int *b=malloc(...); /* b se sitúa en HEAP */
...
a = ...;
}
/* código en CODE */
10/90
5
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
Programación en ensamblador x86-16bits
1.1.1. Cabecera y binario
(cid:127) Cuando se compila el programa se crea un fichero
con 2 partes:
Binario
Imagen de las secciones del programa
No lleva ni la sección bss ni la sección heap
(cid:127) De ambas se encarga el sistema operativo
Cabecera (información para el sistema operativo)
Tamaño de la cabecera
Tamaño del fichero binario
Tabla de direcciones de memoria absolutas
Máxima y mínima cantidades de memoria requeridas
Valores iniciales de los punteros de instrucción y de pila
11/90
Programación en ensamblador x86-16bits
1.1.1. Cabecera y binario
(cid:127) Tabla de direcciones de memoria absolutas (I)
“Tabla de realocación” en x86-16bits
La imagen de un ejecutable es una mapa de memoria
reubicable
Ha de funcionar igual sea cual sea el rango de memoria
asignado
Las referencias absolutas son desconocidas
Por ejemplo, el comienzo de la sección de datos es
desconocido hasta que el sistema operativo no asigne un
mapa de memoria al proceso
12/90
6
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
Programación en ensamblador x86-16bits
1.1.1. Cabecera y binario
(cid:127) Tabla de direcciones de memoria absolutas (II)
Para que el mapa de memoria de la imagen ejecutable sea
reubicable, se confecciona una tabla con todas las
posiciones de memoria absolutas que han de corregirse
La tabla se guarda en la cabecera del ejecutable
En las posiciones absolutas de la imagen se escribe su
distancia hasta el comienzo de la imagen
Una vez que el sistema operativo conoce el rango del mapa
de memoria asignado al proceso, modifica todos los
valores de las direcciones absolutas sumando la posición
de memoria inicial del proceso con la distancia que aparece
en la imagen
13/90
Programación en ensamblador x86-16bits
1.1.1. Cabecera y binario
(cid:127) Tabla de direcciones de memoria absolutas (III)
tamaño del
fichero
IMAGEN
EJECUTABLE
CABECERA
tabla de
realocación
código
datos
pila
tamaño de la
de la cabecera
distancia a la
sección
de datos
distancia a la
sección
de pila
14/90
7
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
Programación en ensamblador x86-16bits
1.1.1. Cabecera y binario
(cid:127) Formatos de cabeceras
a.out (assembler output): originario de UNIX evolucionó
a COFF
COFF (Common Object File Format): reemplazado en
UNIX por ELF sirvió de base para formatos de Windows
ELF (Executable & Linkable Format): formato para
ejecutables, código objeto, librerías compartidas y
volcado de memoria en entorno UNIX; admite una gran
variedad de secciones en los ejecutables
MZ (Mark Zbikowski): utilizado en el entorno DOS
evolucionó dando lugar a varias extensiones
PE (Portable Executable): formato para ejecutables,
código objeto, librerías compartidas (DLL), archivos de
fuentes y otros usos en Windows; evolución de COFF
15/90
Programación en ensamblador x86-16bits
1.1.2. Ejecutables .COM
(cid:127)
¡Un caso especial!
Los ficheros ejecutables .COM no tienen cabecera
No requieren de tabla de realocación
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
Contienen solamente el binario de las secciones de
código y datos
Ocupan un máximo de 64KB – 256B, es decir, un
segmento de 64KB menos un bloque de 100hB
reservado para el sistema (estado del proceso)
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
El código comienza en el desplazamiento 100h (256B)
La pila siempre comienza al final del segmento de 64KB
Los datos suelen estar dentro de la sección de código
Son interesantes por su simplicidad y tamaño reducido
16/90
8
Programación en ensamblador x86-16bits
1.2. Programa vs. proceso
(cid:127) Un proceso es un programa en ejecución
Una secuencia de código con una serie de recursos
asociados y un estado
Recursos: contador de programa, datos de memoria,
pila y su puntero, registros y operadores de la ruta de
datos y E/S (puertos, descriptores de ficheros, etc.)
Estado: información del punto de ejecución, situación de
procesamiento, propietario, privilegios, comunicaciones,
mecanismo de devolución del control al sistema
operativo, etc.
(cid:127) Process descriptor
(cid:127) Process control block (PCB)
(cid:127) Program segment prefix (PSP)
17/90
Programación en ensamblador x86-16bits
1.2. Programa vs. proceso
(cid:127) Creación de un proceso
El sistema operativo…
toma la imagen ejecutable y la copia en memoria,
actualiza sus direcciones absolutas e inicializa los datos
que lo requieran,
asigna recursos, y
transfiere el control a la primera instrucción
La transferencia de control a la primera instrucción del
nuevo proceso se hace como si fuera un salto al código
de una interrupción o procedimiento
Por eso lo primero que se suele hacer es guardar la
dirección de retorno (al proceso llamador) en la pila
18/90
9
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
Programación en ensamblador x86-16bits
1.2. Programa vs. proceso
(cid:127) En el entorno DOS:
programa
en
sistema de ficheros
cabecera
.EXE
.COM
rango de memoria libre
disponible
cargador
dispacher
z
e
p
ó
L
o
c
R
i
PSP
programa
en
memoria
l
f
e
a
a
R
©
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
19/90
Programación en ensamblador x86-16bits
1.2. Programa vs. proceso
(cid:127) Estados de un proceso
Un proceso puede estar en…
Ejecución
Bloqueado (a la esp
Comentarios de: Programación en ensamblador x86-16bits (0)
No hay comentarios