PDF de programación - Programación en ensamblador x86-16bits

Imágen de pdf Programación en ensamblador x86-16bits

Programación en ensamblador x86-16bitsgráfica de visualizaciones

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
  • Links de descarga
http://lwp-l.com/pdf8176

Comentarios de: Programación en ensamblador x86-16bits (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad