Actualizado el 21 de Marzo del 2018 (Publicado el 9 de Enero del 2018)
7.582 visualizaciones desde el 9 de Enero del 2018
10,3 MB
774 paginas
Creado hace 15a (08/10/2009)
Ensamblador
Edición 2009
Francisco Cnarte Ojeda
Todos los nombres propios de programas, sistemas operativos,
equipos hardware, etc. que aparecen en este libro son marcas
registradas de sus respectivas compañías u organizaciones.
Reservados todos los derechos. El contenido de
esta obra está protegido por la Ley, que establece
penas de prisión y /o multas, además de las
correspondientes indemnizaciones por daños y
perjuicios, para quienes reprodujeren, plagiaren,
distribuyeren o comunicaren públicamente, en
todo o en parte, una obra literaria, artística o
científica, o su
interpretación
o ejecución artística fijada en cualquier tipo
de soporte o comunicada a través de cualquier
medio, sin la preceptiva autorización.
transformación,
© EDICIONES ANAYA MULTIMEDIA (GRUPO ANAYA, S.A.), 2009
Juan Ignacio Luca de Tena, 15. 28027 Madrid
Depósito legal: M. 49.604-2008
ISBN: 978-84-415-2511-5
Printed in Spain
Impreso en: Closas-Orcoyen, S. L.
Agradecimientos
Agradecimientos
La terminación de un nuevo libro, que sigue su camino hacia el lector, es siempre
una experiencia gratificante. En este caso esa sensación es, si cabe, aún mayor, dado que
el libro que ahora tiene en sus manos ha recorrido un largo camino y tiene una historia
de muchos años detrás.
Comencé a programar en ensamblador a mediados de la década de los 80 utilizando
un microordenador MSX, con un Z80 en su interior, y un ensamblador/desensambla(cid:173)
dor en formato de cartucho. Dos años después inicié la redacción de un libro sobre pro(cid:173)
gramación en ensamblador Z80 que, no mucho después, quedó detenido en favor de la
redacción de otros títulos.
Mi primer agradecimiento va dirigido a mis antiguos alumnos de los cursos de en(cid:173)
samblador 8086 en Centro de Estudios Informáticos (también a ti, querido Andrés) de Jaén,
en los años 89 y 90. Su entusiasmo por aprender, y la ilusión que ponían en el desarro(cid:173)
llo de cada proyecto, me llevó a reciclar aquel antiguo libro y convertirlo en un libro de
programación en ensamblador 8086 para DOS. Unas doscientas páginas, recogiendo la
formación de aquellos cursos, volvieron a quedar en el olvido cuando un año después
cambié de trabajo.
Dada la imposibilidad de finalizar y publicar aquel libro, sacié mis ganas de escri(cid:173)
bir sobre ensamblador publicando diversos artículos en la desaparecida revista RPP, a
cuyo director, Daniel Alonso, agradezco su apoyo siempre incondicional a mis ideas.
Me alegra que te vaya bien en tu nueva singladura y espero que nuestros caminos vuel(cid:173)
van a cruzarse algún día.
Terminando el siglo pasado mis editores de Anaya Multimedia me propusieron la ela(cid:173)
boración de un libro sobre programación en ensamblador. Obviamente acepté de inme(cid:173)
diato, era algo que llevaba esperando años. Me puse manos a la obra y comencé mi nuevo
libro pero, una vez más, quedó estancado al dar prioridad a otros proyectos (sí Visual
Studio .NET, tu tienes la culpa 8-D). Finalmente, en los últimos meses de 2002 pude de(cid:173)
dicarme a este libro y no podría haberlo hecho sin la confianza que siempre depositan
en mí personas como José María Mourelle o Víctor Manuel Ruiz. Gracias a ambos.
Cinco años después, en 2008, la aceptación que tuvo esa primera edición de Programación
en ensamblador para DOS, Linux y Windows llevó a mis editores a pedirme una actualiza(cid:173)
ción del título. Éste es el libro que tiene en sus manos, con ocho nuevos capítulos y la re(cid:173)
visión y corrección de los procedentes de la edición previa. Mi agradecimiento a todos
los lectores que han confiado en este trabajo y que, con su beneplácito, han propiciado
la aparición de esta segunda edición.
Aunque para redactar la primera edición de este libro rescaté parte del trabajo que
tenía esperando desde hacía una década, mi objetivo era actualizarlo para dar cabida a te(cid:173)
mas de actualidad que, por entonces, no había planteado tratar. Busqué las herramien(cid:173)
tas adecuadas para ello, parte de las cuales están incluidas en el CD-ROM que incluye el
libro. Mi agradecimiento a todas las personas que en su momento, en la primera edición
de este libro, me autorizaron a incluir su trabajo y, especialmente, a Javier Izquierdo, en(cid:173)
tonces en Microsoft Ibérica, por autorizar la inclusión de MASM y a Rob Anderton, autor
de NASM-IDE quien, a cambio del permiso para incluirlo con el libro, sólo me pidió un
Ensamblador. Edición 2009
ejemplar de éste. En cuanto lo recibió añadió un enlace en su sitio Web, indicando que
NASM-IDE había sido incluido en un libro que le pareció excelente. No deje de visitar
la Web deRob, e n h t t p: / / u k . g e o c i t i es . c o m / r o b _ a n d e r t o n /, para contar siem(cid:173)
pre con la última versión de NASM-IDE.
Como suele ocurrir en todos los proyectos, cuando se llega a la fecha límite, en este
caso la fecha de entrega del material, todo son prisas y hay que acabar cuanto antes.
Esto no sería posible sin el buen trabajo de Tomás Eisman (la persona que convierte mis
archivos de texto e imágenes en un libro), la ayuda de mi esposa, María Jesús Luque,
ocupándose de todas las tareas que habitualmente compartimos y, finalmente, la ale(cid:173)
gría que me aportan mis hijos, David y Alejandro. Gracias a todos, sin vosotros no es(cid:173)
taría escribiendo esto.
índice
de contenidos
Agradecimientos
Introducción
Microprocesadores
Sistemas hardware y sistemas operativos
Objetivos de este libro
1. Microprocesadores y sistemas basados en microprocesador
Del circuito integrado al microprocesador
Evolución de los microprocesadores
Fueron los primeros
Microprocesadores de 8 bits
Microprocesadores de 16 bits
CISC versus RISC
Microprocesadores modernos
Microprocesadores versus microcontroladores
Arquitectura común de una CPU
Arquitectura común de un sistema basado en microprocesador
Resumen
2. Representación de datos en ordenadores
Bases de numeración
Sistemas de numeración informáticos
6
22
24
25
25
28
30
31
31
32
33
34
35
36
37
41
43
44
46
46
flotante
Índice de contenidos
Cálculo del valor de una cifra
Conversión entre bases de numeración
Conversión a la base decimal desde cualquier base
Conversión a cualquier base desde la base decimal
Operar con números binarios
Bits, nibbles y bytes
Números con signo
Operar con números hexadecimales
De binario a hexadecimal y viceversa
Números negativos en hexadecimal
Números en base ocho
Identificación de la base de un número
Representación de números enteros
Big endian vs Little endian
Representación BCD
Representación de números en coma
Normalización de la mantisa
Codificación del exponente
Codificación del signo
Representación de caracteres y cadenas
Resumen
3. Arquitectura de la familia de microprocesadores x86
Estructura de bloques
Banco de registros
El registro de estado
Generaciónde direcciones
Patillaje del 8086
Buses de direcciones y datos
Modos de funcionamiento
Gestión de interrupciones
Los sucesores del 8086
Resumen
4. Sistemas basados en microprocesadores x86
Estructura de bloques
Generador de reloj - 8284
Controlador de bus - 8288
Reloj programable - 8253
Interfaz programable de periféricos - 8255
Controlador programable de interrupciones - 8259
Controlador de acceso directo a memoria - 8237
Resumen
48
49
49
50
50
51
52
54
54
56
56
56
57
58
60
60
61
63
63
64
65
66
67
69
71
73
74
74
76
77
77
79
80
81
83
84
85
89
92
94
96
5. Modos de direccionamiento
Direccionamiento por registro
Direccionamiento inmediato
Direccionamiento directo
Direccionamiento indirecto
Direccionamiento indexado
Registros de segmento por defecto
Modos de direccionamiento del 80386
Resumen
6. Conjunto de instrucciones
Instrucciones aritméticas
Instrucciones lógicas y de rotación/traslación
Instrucciones de conversión
Instrucciones de cadena
Instrucciones de transferencia de datos
Instrucciones de control de
Instrucciones de entrada/salida
Instrucciones de control
Otras instrucciones
Resumen
7. Herramientas necesarias
Editores
DOS
Windows
Linux
Ensambladores
MASM
NASM
Otros ensambladores
RAD y ensamblador
Enlazadores
Depuradores
Otras herramientas
Resumen
8. Nuestro primer programa
Esqueleto de un programa mínimo
Programas COM en DOS
El código
Ensamblado y enlace
índice de contenidos
flujo
98
99
100
102
103
104
105
106
106
108
110
111
111
112
112
113
115
116
116
117
118
119
121
123
124
125
126
128
130
130
130
132
133
133
136
137
138
138
140
Índice de contenidos
Programas EXE en DOS
Versión MASM
Versión NASM
Ensamblado y enlace
Programas Linux
El código
Ensamblado y enlace
Programas Windows
El código
Ensamblado y enlace
Resumen
9. Ejecución de un programa
,
Formatos de archivo ejecutable
Ejecutables en DOS
Ejecutables en Linux
Ejecutables en Windows
Detalles sobre formatos de archivo
Preparación del programa por parte del sistema
Recuperación de la cabecera del ejecutable
Asignación de bloques de memoria
Creación de un proceso
Configuración de registros
Segmentos de código, datos y pila
El puntero de instrucción
Base y puntero de la pila
Acceso a los datos
Resumen
10. Registros y memoria
Unidades de información
Palabras y dobles palabras
Múltiplos del byte
Capacidad de direccionamiento
Registros de segmento
Párrafos y seg
Comentarios de: Lenguaje ensamblador 2009 (0)
No hay comentarios