LECI - Ensamblador PDF
LECI - Ensamblador PDF
LECI - Ensamblador PDF
ai 7/16/07 12:48:46 PM
LENGUAJE ENSAMBLADOR
PARA COMPUTADORAS BASADAS EN INTEL®
LENGUAJE ENSAMBLADOR
Q U I N T A E d i C i Ón PARA COMPUTADORAS BASADAS EN INTEL®
QUINTA EDICIÓN
K ip R. I r v i n e I r v i ne
Claro, completo y fácil de entender; este libro simplifica y desmitifica la arquitectura y programación en lenguaje ensamblador
de los modernos procesadores Intel IA-32. Combina la teoría con muchos ejercicios de práctica, lo que proporciona a los lectores
LENGUAJE ENSAMBLADOR
los conocimientos y la experiencia necesarios para alcanzar el éxito en cualquier entorno orientado a OS o a máquinas.
El sitio Web de este libro, www.pearsoneducacion.net/irvine, proporciona un vínculo para descargar MASM 8.0, junto con más de
100 programas de ejemplo, extensas bibliotecas de vínculos de 16 y 32 bits, y tutoriales de programación adicionales.
QUINTA
EDICIÓN
Visítenos en:
www.pearsoneducacion.net K ip R. I r v i n e
CARACTERES ASCII DE CONTROL
La siguiente lista muestra los códigos ASCII que se generan al oprimir una combinación de teclas de control.
Los nemónicos y las descripciones se refieren a las funciones ASCII que se utilizan para el formato de la
pantalla y la impresora, y para las comunicaciones de datos.
Código Código
ASCII* Ctrl- Nemónico Descripción ASCII* Ctrl- Nemónico Descripción
00 NUL Carácter nulo 10 Ctrl-P DLE Escape de vínculo de datos
01 Ctrl-A SOH Inicio de encabezado 11 Ctrl-Q DC1 Control de dispositivo 1
02 Ctrl-B STX Inicio de texto 12 Ctrl-R DC2 Control de dispositivo 2
03 Ctrl-C ETX Fin de texto 13 Ctrl-S DC3 Control de dispositivo 3
04 Ctrl-D EOT Fin de transmisión 14 Ctrl-T DC4 Control de dispositivo 4
05 Ctrl-E ENQ Investigación 15 Ctrl-U NAK Reconocimiento negativo
06 Ctrl-F ACK Reconocimiento 16 Ctrl-V SYN Inactividad síncrona
07 Ctrl-G BEL Campana 17 Ctrl-W ETB Fin del bloque de transmisión
08 Ctrl-H BS Retroceso 18 Ctrl-X CAN Cancelar
09 Ctrl-I HT Tabulación horizontal 19 Ctrl-Y EM Fin del medio
0A Ctrl-J LF Avance de línea 1A Ctrl-Z SUB Sustituto
0B Ctrl-K VT Tabulación vertical 1B Crl-I ESC Escape
0C Ctrl-L FF Avance de página 1C Ctrl- FS Separador de archivo
0D Ctrl-M CR Retorno de carro 1D Ctrl-I GS Separador de grupo
0E Ctrl-N SO Desplazamiento 24 Ctrl-^ RS Separador de registro
hacia fuera
0F Ctrl-O SI Desplazamiento 25 Ctrl-† US Separador de unidad
hacia dentro
* Los códigos ASCII están en hexadecimal.
† El código ASCII 1Fh es Ctrl-Guión corto (-).
COMBINACIONES ALT+TECLA
Los siguientes códigos de exploración hexadecimales se producen al oprimir la tecla ALT y
cada carácter:
KIP R. IRVINE
Florida International University
School of Computing and Information Sciences
TRADUCCIÓN
Alfonso Vidal Romero Elizondo
Ingeniero en Sistemas Electrónicos
Instituto Tecnológico y de Estudios Superiores
de Monterrey - Campus Monterrey
REVISIÓN TÉCNICA
María Concepción Villar Cuesta José Miguel Morán Loza
Armandina J. Leal Flores Presidente de la Academia de Sistemas Digitales Avanzados
Departamento de Ciencias Computacionales Centro Universitario de Ciencias Exactas e Ingenierías
Instituto Tecnológico y de Estudios Superiores Universidad de Guadalajara
de Monterrey - Campus Monterrey
Irvine, Kip R.
Authorized translation from the English language edition, entitled Assembly language for intel-based computers, 5e by Kip R.
Irvine, published by Pearson Education, Inc., publishing as Prentice Hall, Copyright ©2007. All rights reserved.
ISBN 0132383101
Traducción autorizada de la edición en idioma inglés. Assembly language for intel-based computers, 5e por Kip R. Irvine, publi-
cada por Pearson Education, Inc., publicada como Prentice Hall, Copyright ©2007. Todos los derechos reservados.
Edición en español
Editor: Luis Miguel Cruz Castillo
e-mail: luis.cruz@pearsoned.com
Editor de desarrollo: Bernardino Gutiérrez Hernández
Supervisor de producción: Enrique Trejo Hernández
Edición en inglés
Vice President and Editorial Director, ECS: Marcia J. Horton
Executive Editor: Tracy Dunkelberger
Associate Editor: Carole Snyder
Editorial Assistant: Christianna Lee
Executive Managing Editor: Vince O’Brien
Managing Editor: Camille Trentacoste
Production Editor: Karen Ettinger
Director of Creative Services: Paul Belfanti
Creative Director: Juan Lopez
Managing Editor, AV Management and Production: Patricia Burns
Art Editor: Gregory Dulles
Manufacturing Manager, ESM: Alexis Heydt-Long
Manufacturing Buyer: Lisa McDowell
Executive Marketing Manager: Robin O’Brien
Marketing Assistant: Mack Patterson
QUINTA EDICIÓN, 2008
D.R. © 2008 por Pearson Educación de México, S.A. de C.V.
Atlacomulco 500-5o piso
Col. Industrial Atoto
C.P. 53519, Naucalpan de Juárez, Edo. de México
Cámara Nacional de la Industria Editorial Mexicana. Reg. Núm. 1031.
Prentice Hall es una marca registrada de Pearson Educación de México, S.A. de C.V.
Reservados todos los derechos. Ni la totalidad ni parte de esta publicación pueden reproducirse, registrarse o transmitirse, por
un sistema de recuperación de información, en ninguna forma ni por ningún medio, sea electrónico, mecánico, fotoquímico,
magnético o electroóptico, por fotocopia, grabación o cualquier otro, sin permiso previo por escrito del editor.
El préstamo, alquiler o cualquier otra forma de cesión de uso de este ejemplar requerirá
también la autorización del editor o de sus representantes.
ISBN 10: 970-26-1081-8
ISBN 13: 978-970-26-1081-6
Impreso en México. Printed in Mexico.
1 2 3 4 5 6 7 8 9 0 - 10 09 08
Para Jack y Candy Irvine
Contenido
Prefacio xxi
1 Conceptos básicos 1
1.1 Bienvenido al lenguaje ensamblador 1
1.1.1 Preguntas importantes por hacer 2
1.1.2 Aplicaciones del lenguaje ensamblador 5
1.1.3 Repaso de sección 6
1.2 Concepto de máquina virtual 7
1.2.1 Historia de los ensambladores de la PC 9
1.2.2 Repaso de sección 9
1.3 Representación de datos 9
1.3.1 Números binarios 10
1.3.2 Suma binaria 11
1.3.3 Tamaños de almacenamiento de enteros 12
1.3.4 Enteros hexadecimales 13
1.3.5 Enteros con signo 14
1.3.6 Almacenamiento de caracteres 16
1.3.7 Repaso de sección 18
1.4 Operaciones booleanas 20
1.4.1 Tablas de verdad para las funciones booleanas 22
1.4.2 Repaso de sección 23
1.5 Resumen del capítulo 23
vii
viii Contenido
5 Procedimientos 111
5.1 Introducción 111
5.2 Enlace con una biblioteca externa 111
5.2.1 Antecedentes 112
5.2.2 Repaso de sección 113
5.3 La biblioteca de enlace del libro 113
5.3.1 Generalidades 113
5.3.2 Descripciones de los procedimientos individuales 115
5.3.3 Programas de prueba de la biblioteca 125
5.3.4 Repaso de sección 129
5.4 Operaciones de la pila 129
5.4.1 La pila en tiempo de ejecución 129
5.4.2 Instrucciones PUSH y POP 131
5.4.3 Repaso de sección 134
5.5 Definición y uso de los procedimientos 134
5.5.1 Directiva PROC 134
5.5.2 Instrucciones CALL y RET 136
Contenido xi
8.6.3 Uso de variables y símbolos a través de los límites de los módulos 259
8.6.4 Ejemplo: programa SumaArreglo 260
8.6.5 Creación de módulos mediante el uso de Extern 261
8.6.6 Creación de módulos mediante el uso de INVOKE y PROTO 264
8.6.7 Repaso de sección 266
8.7 Resumen del capítulo 267
8.8 Ejercicios de programación 268
xxi
xxii Prefacio
Mejoras en la quinta edición En esta edición hemos agregado una variedad de mejoras y nueva informa-
ción, que mencionamos en la siguiente tabla, por número de capítulo:
Capítulo Mejoras
2 Una explicación mejorada del ciclo de ejecución de instrucciones.
5 Una biblioteca de vínculos expandida, con subrutinas adicionales para escribir interfaces de usuario robustas,
calcular la sincronización de los programas, generar enteros seudoaleatorios y analizar cadenas de enteros. La
documentación de la biblioteca tiene mejoras considerables.
6 Una explicación mejorada de la codificación de saltos condicionales y los rangos de saltos relativos.
7 Se agregaron las instrucciones IMUL de dos y tres operandos. Se muestran comparaciones de rendimiento
para distintos enfoques, en relación con la multiplicación de enteros.
8 Se rediseñó por completo, de manera que se expliquen primero los detalles de bajo nivel de los marcos de pila
(registros de activación), antes de presentar las directivas de alto nivel INVOKE y PROC de MASM.
11 Nuevo tema: Asignación de memoria dinámica en aplicaciones MS-Windows. Se mejoró la cobertura sobre el
manejo de archivos y reporte de errores en aplicaciones MS-Windows.
12 Una cobertura mejorada acerca de las llamadas a funciones de C y C++ desde lenguaje ensamblador.
17 Introducción al conjunto de instrucciones de punto flotante de la arquitectura IA-32. Tipos de datos de punto
flotante. Codificación y decodificación de instrucciones IA-32.
Aún sigue siendo un libro de programación Este libro continúa con su misión original: enseñar a los
estudiantes cómo escribir y depurar programas a nivel de máquina. Nunca sustituirá a un libro completo so-
bre arquitectura computacional, pero ofrece a los estudiantes la experiencia práctica de escribir software en
un entorno que les enseñe cómo funciona una computadora. Nuestra premisa es que los estudiantes retienen
mejor el conocimiento cuando se combina la teoría con la experiencia. En un curso de ingeniería, los estu-
diantes construyen prototipos; en un curso de arquitectura computacional, los estudiantes deberían escribir
programas a nivel de máquina. En ambos casos, obtendrán una experiencia memorable que les brindará la
confianza de trabajar en cualquier entorno orientado a SO/máquina.
Modo real y modo protegido Esta edición hace énfasis en el modo protegido de 32 bits, pero cuenta con
tres capítulos dedicados a la programación en modo real. Por ejemplo, hay un capítulo completo acerca de la
programación del BIOS para el teclado, la pantalla de video (incluyendo gráficos) y el ratón. Otro capítulo
trata acerca de la programación en MS-DOS mediante el uso de interrupciones (llamadas al sistema). Los
estudiantes pueden sacar provecho de la programación directa del hardware y del BIOS.
Casi todos los ejemplos en la primera mitad del libro se presentan como aplicaciones orientadas a texto de
32 bits, que se ejecutan en modo protegido usando el modelo de memoria plana. Este enfoque es maravilloso,
tan sólo porque evita las complicaciones relacionadas con el direccionamiento tipo segmento-desplazamien-
to. Los párrafos marcados en forma especial y los cuadros contextuales destacan las diferencias ocasionales
entre la programación en modo protegido y en modo real. La mayoría de las diferencias se abstraen mediante
las bibliotecas de vínculos paralelas del libro, para la programación en modo real y modo protegido.
Bibliotecas de vínculos Suministramos dos versiones de la biblioteca de vínculos que utilizan los estu-
diantes para las operaciones básicas de entrada-salida, simulaciones, sincronización y demás cosas útiles. La
versión de 32 bits (Irvine32.lib) se ejecuta en modo protegido y envía su salida a la consola Win32. La ver-
sión de 16 bits (Irvine16.lib) se ejecuta en modo de direccionamiento real. En el sitio Web del libro se ofrece
el código fuente completo para las bibliotecas. Estas bibliotecas de vínculos están disponibles sólo como
apoyo, no para evitar que los estudiantes aprendan a programar la entrada-salida por su cuenta. Alentamos a
los estudiantes para que creen sus propias bibliotecas.
Prefacio xxiii
Software y ejemplos incluidos Todos los programas de ejemplo se probaron con Microsoft Macro
Assembler versión 8.0. Las aplicaciones en C++ de 32 bits del capítulo 12 se probaron con Microsoft Visual
C++ .NET. Los programas en modo de direccionamiento real del capítulo 12 (enlazados a C++) se ensam-
blaron con Borland Turbo Assembler (TASM).
Información del sitio Web En el sitio Web www.pearsoneducacion.net/irvine, encontrará las actua-
lizaciones y correcciones a este libro (en inglés) incluyendo proyectos de programación adicionales, para
que los instructores los asignen al final de cada capítulo así como código en español. Si por alguna razón
no puede acceder a este sitio, visite http://www.asmirvine.com donde encontrará información acerca del
libro y un vínculo hacia su sitio Web actual.
Objetivos generales
Los siguientes objetivos de este libro están diseñados para ampliar el interés y conocimiento del estudiante
sobre los temas relacionados con el lenguaje ensamblador:
• Arquitectura y programación de los procesadores IA-32 de Intel.
• Programación en modo de direccionamiento real y en modo protegido.
• Directivas, macros, operadores y estructura de programas en lenguaje ensamblador.
• Metodología de programación, para mostrar cómo usar el lenguaje ensamblador para crear herramientas
de software a nivel de sistema y programas de aplicación.
• Manipulación del hardware de computadora.
• Interacción entre los programas en lenguaje ensamblador, el sistema operativo y otros programas de apli-
cación.
Uno de nuestros objetivos es ayudar a los estudiantes a lidiar con los problemas de la programación
mediante un enfoque mental a nivel de máquina. Es importante pensar en la CPU como una herramienta
interactiva, y aprender a supervisar su operación de la forma más directa posible. Un depurador es el mejor
amigo del programador, no sólo para atrapar errores, sino también como una herramienta educativa que nos
enseña acerca de la CPU y el sistema operativo. Motivamos a los estudiantes para que busquen más allá de la
superficie de los lenguajes de alto nivel, para que descubran que la mayoría de los lenguajes de programación
están diseñados para ser portables y, por lo tanto, independientes de sus equipos anfitriones.
Además de los ejemplos cortos, este libro contiene cientos de programas listos para ejecutarse, los cuales
demuestran el uso de instrucciones o ideas, a medida que se presentan en el libro. Los materiales de referen-
cia, como las guías a las interrupciones de MS-DOS y los nemónicos de las instrucciones, están disponibles
al final del libro.
Requisitos previos El lector deberá ser capaz de programar hábilmente cuando menos en algún otro
lenguaje de programación, de preferencia en Java, C o C++. Uno de los capítulos trata acerca de la interco-
nexión con C++, por lo que sería muy útil tener un compilador a la mano. He utilizado este libro en el salón
de clases con estudiantes con maestrías en ciencias computacionales y sistemas de información administra-
tiva; también se ha usado en diversos cursos de ingeniería.
Características
Listados completos de programas En la página Web encontrará el código fuente de los ejemplos de este
libro, y en el sitio en inglés hay listados adicionales. Se suministra una biblioteca completa de vínculos, la cual
contiene más de 30 procedimientos que simplifican la entrada y salida del usuario, el procesamiento numérico,
el manejo de discos y archivos, y el de cadenas. En las etapas iniciales del curso, los estudiantes pueden
utilizar esta biblioteca para mejorar sus programas para posteriormente crear sus propios procedimientos y
agregarlos a la biblioteca.
Lógica de programación Dos de los capítulos enfatizan la lógica booleana y la manipulación a nivel de
bits. Hicimos nuestro mejor esfuerzo por tratar de relacionar la lógica de la programación de alto nivel con
los detalles de bajo nivel de la máquina. Este enfoque ayuda a los estudiantes a crear implementaciones más
eficientes y a comprender mejor la forma en que los compiladores generan código objeto.
xxiv Prefacio
Conceptos de hardware y sistemas operativos Los primeros dos capítulos introducen los conceptos
básicos de hardware y representación de datos, incluyendo números binarios, arquitectura de la CPU, banderas de
estado y asignación de memoria. Una investigación acerca del hardware de computadora y una perspectiva histó-
rica de la familia de procesadores Intel ayudan a los estudiantes a comprender mejor el sistema computacional en
el que van a programar.
Enfoque hacia la programación estructurada En el capítulo 5 se inicia un énfasis en los procedimientos
y la descomposición funcional. Se proporcionan ejercicios de programación más complejos a los estudiantes,
con lo que se ven obligados a enfocarse en el diseño, antes de empezar a escribir código.
Conceptos de almacenamiento en disco Los estudiantes aprenden los principios fundamentales detrás
del sistema de almacenamiento en disco en los sistemas basados en MS-Windows, desde los puntos de vista de
hardware y de software.
Creación de bibliotecas de vínculos Los estudiantes pueden agregar sus propios procedimientos a la
biblioteca de vínculos del libro, así como crear algunas nuevas. En este libro aprenderán a usar un enfoque
de “caja de herramientas” hacia la programación, y a escribir código que sea útil en más de un programa.
Macros y estructuras Existe un capítulo dedicado a la creación de estructuras, uniones y macros, que
son esenciales en el lenguaje ensamblador y la programación de sistemas. Las macros condicionales con
operadores avanzados sirven para hacer las macros más profesionales.
Interfaz con lenguajes de alto nivel Hay un capítulo dedicado exclusivamente a la interconexión de
lenguaje ensamblador con C y C++. Ésta es una importante habilidad de trabajo para los estudiantes que
tengan una alta probabilidad de encontrar trabajos relacionados con la programación en lenguajes de alto
nivel. Pueden aprender a optimizar su código y ver ejemplos de cómo los compiladores de C++ optimizan
el código.
Ayudas para los instructores Todos los listados de los programas están disponibles en la Web. Hay un
banco de exámenes disponible para los instructores, así como preguntas de repaso, soluciones a los ejercicios de
programación y una presentación en diapositivas de Microsoft Power Point para cada capítulo (todo en inglés).
15 17
1 al 8 9 10 11
(estructuras)
10
(macros) 13 14 12
16
1. Conceptos básicos: aplicaciones del lenguaje ensamblador, conceptos básicos, lenguaje máquina y re-
presentación de datos.
2. Arquitectura del procesador IA-32: diseño básico de una microcomputadora, ciclo de ejecución de
instrucciones, arquitectura del procesador IA-32, administración de memoria en los procesadores IA-32,
componentes de una microcomputadora y el sistema de entrada-salida.
Prefacio xxv
Materiales de referencia
Sitio Web El autor mantiene un sitio Web activo en www.asmirvine.com.
Archivo de ayuda Archivo de ayuda (en formato de Ayuda de Windows) creado por Gerald Cahill del
Antelope Valley College. Documenta las bibliotecas de vínculos del libro, así como las estructuras de datos
Win32.
Libro de trabajo de lenguaje ensamblador En el sitio Web del libro encontrará un libro de trabajo interactivo
que trata temas importantes, como conversiones numéricas, modos de direccionamiento, uso de registros,
programación con el depurador y números binarios de punto flotante. Las páginas de contenido son docu-
mentos HTML, de manera que los estudiantes e instructores pueden agregar fácilmente su propio contenido
personalizado.
xxvi Prefacio
Herramientas de depuración Tutoriales acerca del uso de Microsoft CodeView, Microsoft Visual Studio y
Microsoft Windows Debugger (WinDbg).
Interrupciones de BIOS y MS-DOS El apéndice C contiene un breve listado de las funciones INT 10h (vi-
deo), INT 16h (teclado), e INT 21h (MS-DOS) más utilizadas.
Conjunto de instrucciones El apéndice B presenta la mayoría de las instrucciones no privilegiadas para la
familia de procesadores IA-32.
Para cada instrucción describimos su efecto, mostramos su sintaxis y cuáles banderas se ven afectadas.
Presentaciones en PowerPoint Un conjunto completo de presentaciones en Microsoft PowerPoint, escritas
por el autor.
Agradecimientos
Queremos agradecer de manera especial a Tracy Dunkleberger, Editora en Jefe de Ciencias computacionales
en Prentice Hall, que proporcionó una guía útil y amigable durante la escritura de esta quinta edición. Karen
Ettinger hizo un magnífico trabajo como editora de producción, con un seguimiento constante a los numerosos
pequeños detalles . Camille Trentacoste participó como gerente editorial del libro.
Quinta edición
Ofrezco mi agradecimiento especial a los siguientes profesores que impulsaron mi moral, me dieron es-
tupendos consejos pedagógicos y examinaron minuciosamente todo el libro. Ellos han sido una enorme
influencia para el desarrollo de este libro, en algunos casos en varias ediciones:
• Gerald Cahill, Antelope Valley College.
• James Brink. Pacific Lutheran University.
• William Barrett, San Jose State University.
Quiero agradecer también a Scott Blackledge y John Taylor, ambos programadores profesionales, que revi-
saron la mayor parte del manuscrito e identificaron numerosos errores. Varias personas revisaron capítulos
individuales:
• Jerry Joyce, Keene State College.
• Tianzheng Wu, Mount Mercy College.
• Ron Davis, Kennedy-King College.
• David Topham, Ohlone College.
• Harvey Nice, DePaul University.
Cuarta edición
Las siguientes personas fueron de invaluable ayuda para crear la cuarta edición:
• Gerald Cahill, Antelope Valley College.
• James Brink, Pacific Lutheran University.
• Maria Kolatis, County College of Morris.
• Tom Joyce, Ingeniero en jefe de Premier Heart, LLC.
• Jeff Wothke, Purdue Calumet University.
• Tim Downey, Florida International University.
Los siguientes individuos fueron de invaluable ayuda en la corrección de la cuarta edición:
• Andres Altamirano, Miami.
• Courtney Amor, Los Angeles.
• Scott Blackledge, Platform Solutions, Inc.
• Ronald Davis, Kennedy-King College.
• Ata Elahi, Southern Connecticut State University.
• Jose Gonzalez, Miami.
• Leroy Highsmith, Southern Connecticut State University.
Prefacio xxvii
TECLAS DE FUNCIÓN
Con Con Con
O
Tecla
F1
Normal
3B
mayúsculas
54
Ctrl
5E
Alt
68
V
F2
F3
3C
3D
55
56
5F
60
69
6A
P
F4
F5
3E
3F
57
58
61
62
6B
6C
E
F6
F7
40
41
59
5A
63
64
6D
6E
F
F8
F9
42
43
5B
5C
65
66
6F
70
L
F10
F11
44
85
5D
87
67
89
71
8B
A
F12 86 88 8A 8C P
1
2 Capítulo 1 • Conceptos básicos
Valor educativo ¿Por qué leer este libro? Tal vez esté tomando un curso universitario con un nombre
similar a alguno de los siguientes:
• Lenguaje ensamblador para microcomputadoras.
• Programación en lenguaje ensamblador.
• Introducción a la arquitectura computacional.
• Fundamentos de los sistemas computacionales.
• Programación de los sistemas embebidos (incrustados).
Éstos son nombres de los cursos en colegios y universidades que utilizan ediciones anteriores de este libro,
el cual cubre los principios básicos acerca de la arquitectura computacional, el lenguaje máquina y la progra-
mación de bajo nivel. Aprenderá suficiente lenguaje ensamblador como para probar su conocimiento en la
familia de los microprocesadores más utilizada en la actualidad. No aprenderá a programar una computadora
“de juguete”, usando un ensamblador simulado; MASM es un ensamblador de nivel industrial, usado por
profesionales con experiencia práctica. Conocerá la arquitectura de la familia de procesadores IA-32 de Intel
desde el punto de vista del programador.
Si duda acerca del valor de la programación de bajo nivel y del estudio de los detalles acerca del software
y hardware de computadora, preste atención a la siguiente cita de un científico computacional líder en la in-
dustria, Donald Knuth, al hablar sobre su famosa serie de libros: El arte de programar computadoras (The
Art of Computer Programming):
Algunas personas [dicen] que tener el lenguaje máquina en sí, fue el más grande error que cometí. En
realidad no creo que se pueda escribir un libro para verdaderos programadores de computadoras, a menos
que se pueda hablar sobre los detalles de bajo nivel.1
Le recomiendo visitar el sitio Web de este libro, en donde encontrará una gran cantidad de información
complementaria, tutoriales y ejercicios: www.asmirvine.com.
¿Qué tipos de programas podré crear? Este libro muestra cómo crear dos clases generales de programas:
• Modo de direccionamiento real de 16 bits: los programas en modo de direccionamiento real de 16
bits se ejecutan en MS-DOS y en la ventana de consola en MS-Windows. También se les conoce como
programas en modo real, ya que utilizan un modelo segmentado de memoria, requerido en programas
escritos para los procesadores Intel 8086 y 8088. Hay notas a lo largo del libro con tips acerca de cómo
programar en modo de direccionamiento real, y se dedican dos capítulos exclusivamente a la programa-
ción de colores y gráficos en modo real.
• Modo protegido de 32 bits: los programas en modo protegido de 32 bits se ejecutan en todas las versio-
nes de 32 bits de Microsoft Windows. Por lo general son más fáciles de escribir y de comprender que los
programas en modo real.
¿Qué obtengo con este libro? Además de una buena cantidad de papel impreso podrá descargar Micro-
soft Assembler del sitio Web de Microsoft. En el sitio Web www.asmirvine.com podrá consultar los detalles
acerca de cómo obtener el ensamblador.
En el sitio Web del libro encontrará lo siguiente:
• Archivo de ayuda en línea, en donde se detallan los procedimientos de la biblioteca del libro y las estruc-
turas esenciales de la API de Windows, por Gerald Cahill.
• Libro de trabajo de lenguaje ensamblador, una colección de tutoriales escritos por el autor.
• Bibliotecas de vínculos Irvine32 e Irvine16, para la programación en modo de direccionamiento real y
modo protegido, con código fuente completo.
• Programas de ejemplo, con todo el código fuente del libro.
• Correcciones al libro y a los programas de ejemplo. ¡Esperamos que no sean demasiadas!
• Tutoriales acerca de cómo instalar el ensamblador.
• Artículos sobre temas avanzados que no se incluyeron en el libro impreso por falta de espacio.
• Grupo de discusión, que cuenta con más de 500 miembros.
¿Qué voy a aprender? Este libro le ofrece mucha información sobre la arquitectura computacional, la
programación y las ciencias computacionales. He aquí lo que verá:
• Los principios básicos de la arquitectura computacional, aplicados en la familia de procesadores IA-32
de Intel.
• La lógica booleana básica y su aplicación en relación con la programación y el hardware de computadora.
• La manera en que los procesadores IA-32 administran la memoria, usando modo real, modo protegido y
modo virtual.
• La manera en que los compiladores de lenguajes de alto nivel (tales como C++) traducen las instrucciones
de su lenguaje a lenguaje ensamblador y código de máquina nativo.
• La manera en que los lenguajes de alto nivel implementan expresiones aritméticas, ciclos y estructuras
lógicas a nivel de máquina.
• La representación de los datos, incluyendo enteros con y sin signo, números reales y datos tipo carácter.
• A depurar programas a nivel de máquina. La necesidad de esta habilidad es imprescindible cuando se trabaja
en lenguajes tales como C y C++, los cuales proporcionan acceso a los datos y el hardware de bajo nivel.
• La manera en que los programas de aplicación se comunican con el sistema operativo de la computadora,
a través de manejadores de interrupciones, llamadas al sistema y áreas comunes de memoria.
• A interconectar el código en lenguaje ensamblador con programas en C++.
• A crear programas de aplicación en lenguaje ensamblador.
tiene una relación de uno a uno con el lenguaje máquina: cada una de las instrucciones en lenguaje ensam-
blador corresponden a una sola instrucción en lenguaje máquina.
¿Cómo se relacionan C++ y Java con el lenguaje ensamblador? Los lenguajes de alto nivel, tales
como C++ y Java, tienen una relación de uno a varios con el lenguaje ensamblador y el lenguaje máquina.
Una sola instrucción en C++ se expande en varias instrucciones en lenguaje ensamblador o lenguaje má-
quina. Podemos mostrar cómo las instrucciones en C++ se expanden en código máquina. La mayoría de las
personas no puede leer código de máquina puro, por lo que utilizaremos su pariente más cercano, el lenguaje
ensamblador. La siguiente instrucción en C++ lleva a cabo dos operaciones aritméticas y asigna el resultado
a una variable. Suponga que X y Y son enteros:
int Y;
int X = (Y + 4) * 3;
A continuación se muestra la traducción de esta instrucción a lenguaje ensamblador. La traducción requiere
varias instrucciones, ya que el lenguaje ensamblador funciona a un nivel detallado:
mov eax,Y ; mueve Y al registro EAX
add eax,4 ; suma 4 al registro EAX
mov ebx,3 ; mueve el 3 al registro EBX
imul ebx ; multiplica EAX por EBX
mov X,eax ; mueve EAX a X
(Los registros son ubicaciones de almacenamiento con nombre en la CPU, que almacenan los resultados
intermedios de las operaciones).
El punto en este ejemplo no es afirmar que C++ es superior al lenguaje ensamblador o viceversa, sino
mostrar su relación.
¿Nosotros? ¿Quiénes somos? A lo largo de este libro verá referencias constantes a nosotros. A menudo, los au-
tores de libros de texto y artículos académicos utilizan nosotros como una referencia formal a ellos mismos. Esto
se debe a que parece tan informal decir, “Ahora le mostraré cómo” hacer tal y tal cosa. Si le es de ayuda, piense en
nosotros como una referencia al autor, sus revisores (quienes en realidad lo ayudaron de manera considerable),
su editor (Prentice Hall), y sus estudiantes (miles de ellos).
¿Es portable el lenguaje ensamblador? Una importante distinción entre los lenguajes de alto nivel
y el lenguaje ensamblador está relacionada con la portabilidad. Se dice que un lenguaje cuyos programas
de código fuente pueden compilarse y ejecutarse en una amplia variedad de sistemas computacionales es
portable. Por ejemplo, un programa en C++ puede compilarse y ejecutarse en casi cualquier computadora,
a menos que haga referencias específicas a funciones de biblioteca que existan en un solo sistema operativo.
Una importante característica del lenguaje Java es que los programas compilados se ejecutan en casi cualquier
sistema computacional.
El lenguaje ensamblador no es portable, ya que está diseñado para una familia de procesadores específica.
Hay una gran variedad de lenguajes ensambladores en uso actualmente, cada uno de los cuales está basado
en una familia de procesadores. Algunas familias de procesadores reconocidas son: Motorola 68x00, Intel
IA-32, SUN Sparc, Vax e IBM-370. Las instrucciones en lenguaje ensamblador pueden coincidir directa-
mente con la arquitectura de la computadora, o pueden traducirse durante la ejecución mediante un programa
dentro del procesador, al cual se le conoce como intérprete de microcódigo.
¿Por qué aprender lenguaje ensamblador? ¿Por qué no sólo leer un buen libro acerca del hardware y
la arquitectura de las computadoras, y evitar aprender a programar en lenguaje ensamblador?
• Si estudia ingeniería computacional, es muy probable que le pidan que escriba programas embebidos. Éstos
son programas cortos que se almacenan en una pequeña cantidad de memoria, en dispositivos de un solo
propósito tales como los teléfonos, los sistemas del combustible y la ignición del automóvil, los sistemas
de control de aire acondicionado, los sistemas de seguridad, los instrumentos para la adquisición de datos,
1.1 Bienvenido al lenguaje ensamblador 5
las tarjetas de video, las tarjetas de sonido, los discos duros, los módems y las impresoras. El lenguaje
ensamblador es ideal para escribir programas embebidos, debido a que utilizan muy poca memoria.
• Las aplicaciones en tiempo real, tales como las simulaciones y el monitoreo de hardware, requieren preci-
sión en la sincronización y en las respuestas. Los lenguajes de alto nivel no proporcionan a los programa-
dores un control exacto sobre el código máquina generado por los compiladores. El lenguaje ensamblador
nos permite especificar con precisión el código ejecutable de un programa.
• Las consolas de videojuegos requieren que su software esté altamente optimizado para que su tamaño de
código sea pequeño y se ejecute con la mayor rapidez posible. Los programadores de videojuegos son
expertos en la escritura de código que aproveche al máximo las características de hardware del sistema
destino. Utilizan el lenguaje ensamblador como su herramienta preferida, ya que les permite un acceso
directo al hardware de la computadora, y el código puede optimizarse en forma manual para obtener la
máxima velocidad.
• El lenguaje ensamblador nos ayuda a obtener una comprensión general en cuanto a la interacción entre
el hardware de computadora, los sistemas operativos y los programas de aplicación. Mediante el uso de
lenguaje ensamblador, usted puede aplicar y probar la información teórica que recibe en los cursos de arqui-
tectura computacional y sistemas operativos.
• En ocasiones, los programadores de aplicaciones encuentran que las limitaciones en los lenguajes de alto ni-
vel les impiden realizar tareas de bajo nivel con eficiencia, como la manipulación a nivel de bits y el cifrado
de datos. A menudo hacen llamadas a subrutinas escritas en lenguaje ensamblador para lograr su objetivo.
• Los fabricantes de hardware crean controladores de dispositivos para el equipo que venden. Los controla-
dores de dispositivos son programas que traducen los comandos generales del sistema operativo en refe-
rencias específicas a los detalles relacionados con el hardware. Por ejemplo, los fabricantes de impresoras
crean un controlador de dispositivo de MS-Windows distinto para cada modelo que venden. Lo mismo se
aplica para los sistemas operativos Mac OS, Linux y otros.
Tabla 1-1 Comparación entre el lenguaje ensamblador y los lenguajes de alto nivel.
Aplicación comercial escrita para Por lo general es portable. El código Debe volver a codificarse por separado
varias plataformas (distintos sistemas fuente puede recompilarse en cada para cada plataforma, usando un
operativos) sistema operativo de destino, con ensamblador con una sintaxis diferente.
mínimas modificaciones Es difícil de mantener
Sistemas embebidos y juegos de Produce demasiado código ejecutable, Ideal, ya que el código ejecutable es
computadora que requieren de un y tal vez no se ejecute con eficiencia pequeño y se ejecuta con rapidez
acceso directo a la memoria
C++ tiene la cualidad única de ofrecer un compromiso entre la estructura de alto nivel y los detalles de bajo
nivel. Es posible el acceso directo al hardware, pero no es nada portable. La mayoría de los compiladores de
C++ tienen la habilidad de generar código fuente en lenguaje ensamblador, que el programador puede perso-
nalizar y refinar antes de ensamblarlo en código ejecutable.
-ÈQUINA VIRTUAL 6-
-ÈQUINA VIRTUAL 6-
Cada máquina virtual puede construirse ya sea con hardware o software. Las personas pueden escribir
programas para la máquina virtual VM1 y, si es práctico implementar a VM1 como una computadora real,
los programas pueden ejecutarse directamente en el hardware. O los programas escritos en VM1 pueden
interpretarse/traducirse y ejecutarse en la máquina VM0.
La máquina VM1 no puede ser completamente distinta de VM0, ya que el proceso de traducción o inter-
pretación consumiría demasiado tiempo. ¿Qué pasaría si el lenguaje que soporta la máquina VM1 no es lo
suficiente amigable para el programador, como para poder usarlo en aplicaciones útiles? Entonces, podría di-
señarse otra máquina virtual, VM2, que pudiera comprenderse con mayor facilidad. Este proceso puede repe-
tirse hasta que pueda diseñarse una máquina virtual VMn que soporte un lenguaje poderoso y fácil de usar.
El lenguaje de programación Java se basa en el concepto de máquina virtual. Un programa escrito en el
lenguaje Java se traduce mediante un compilador de Java, que lo convierte en código byte de Java. Este código
es un lenguaje de bajo nivel que se ejecuta con rapidez en tiempo de ejecución mediante un programa conoci-
do como máquina virtual de Java (JVM). La JVM se ha implementado en muchos sistemas computacionales
distintos, por lo cual los programas en Java son relativamente independientes del sistema.
Máquinas específicas Vamos a relacionar estos conceptos con las computadoras y los lenguajes reales,
usando nombres como Nivel 1 para VM1 y Nivel 0 para VM0, como se muestra en la figura 1-1. El hardware
lógico digital de una computadora representa a la máquina Nivel 0, y el Nivel 1 se implementa a través de un in-
térprete conectado mediante cables al procesador, a lo que se le conoce como microarquitectura. Por encima de
este nivel está el Nivel 2, que se conoce como arquitectura del conjunto de instrucciones. Éste es el primer nivel
en el que los usuarios pueden, por lo general, escribir programas, aunque éstos consisten en números binarios.
8 Capítulo 1 • Conceptos básicos
Microarquitectura (Nivel 1) Por lo general, los fabricantes de chips de computadora no permiten que los
usuarios promedio escriban microinstrucciones. Con frecuencia, los comandos de microarquitectura espe-
cíficos son un secreto propietario. Podrían requerirse hasta tres o cuatro instrucciones en microcódigo para
llevar a cabo una instrucción primitiva, tal como obtener un número de memoria e incrementarlo en 1.
,ENGUAJE DE ALTO NIVEL .IVEL
,ENGUAJE ENSAMBLADOR .IVEL
3ISTEMA OPERATIVO
.IVEL
!RQUITECTURA DEL CONJUNTO
DE INSTRUCCIONES .IVEL
-ICROARQUITECTURA .IVEL
,ØGICA DIGITAL
.IVEL
Arquitectura del conjunto de instrucciones (Nivel 2) Los fabricantes de chips de computadora diseñan
en el procesador un conjunto de instrucciones para llevar a cabo las operaciones básicas, tales como mover,
sumar o multiplicar. Este conjunto de instrucciones se conoce también como lenguaje máquina convencio-
nal, o simplemente lenguaje máquina. Cada instrucción en lenguaje máquina se ejecuta mediante varias
microinstrucciones.
Sistema operativo (Nivel 3) Cuando las computadoras evolucionaron, se crearon máquinas virtuales
adicionales, para que los programadores fueran más productivos. Una máquina de Nivel 3 comprende co-
mandos interactivos que introducen los usuarios para cargar y ejecutar programas, mostrar directorios, etcé-
tera. A esto se le conoce como el sistema operativo de la computadora. El software de sistema operativo se
traduce en código máquina, el cual se ejecuta en una máquina de Nivel 2.3
Lenguaje ensamblador (Nivel 4) Por encima del sistema operativo, los lenguajes de programación pro-
porcionan las capas de traducción para hacer que el desarrollo de software a gran escala sea práctico. El
lenguaje ensamblador, que aparece en el Nivel 4, utiliza nemónicos cortos tales como ADD, SUB y MOV,
los cuales se traducen fácilmente al nivel de arquitectura del conjunto de instrucciones (Nivel 2). Hay otras
instrucciones en lenguaje ensamblador, como las llamadas a interrupciones, que el sistema operativo (Nivel 3)
ejecuta de manera directa. Los programas en lenguaje ensamblador se traducen (ensamblan) en su totalidad
a lenguaje máquina, antes de que empiecen a ejecutarse.
Lenguajes de alto nivel (Nivel 5) En el Nivel 5 están los lenguajes de programación de alto nivel tales
como C++, C#, Visual Basic y Java. Los programas en estos lenguajes contienen poderosas instrucciones que
se traducen en varias instrucciones del Nivel 4. En su interior, los compiladores traducen los programas de
Nivel 5 en programas de Nivel 4, que a su vez se traducen en código de Nivel 4. Este código se ensambla en
lenguaje máquina convencional.
1.3 Representación de datos 9
La arquitectura del procesador Intel IA-32 soporta varias máquinas virtuales. Su modo de operación virtual-86
emula la arquitectura del procesador Intel 8086/8088, utilizado en la Computadora Personal IBM original. El
Pentium puede ejecutar varias instancias de la máquina virtual-86 al mismo tiempo, por lo que los programas in-
dependientes que se ejecutan en cada máquina virtual parecen tener el completo control de su equipo anfitrión.
Los enteros binarios pueden ser con o sin signo. Un entero con signo es positivo o negativo. Un entero
sin signo es positivo, de manera predeterminada. El cero se considera positivo. Podemos representar a los
números reales en binario mediante el uso de esquemas de codificación especiales pero dejaremos ese tema
para un capítulo posterior. Por ahora, vamos a empezar con los enteros binarios sin signo.
D indica un dígito binario. Por ejemplo, el número binario 00001001 es igual a 9. Para calcular este valor,
eliminamos los términos iguales a cero:
(1 ⫻ 23) ⫹ (1 ⫻ 20) ⫽ 9
Al recolectar en orden inverso los dígitos binarios en la columna de los residuos se produce el número
binario 100101. Como el almacenamiento en las computadoras Intel siempre consiste en números binarios
cuyas longitudes sean múltiplos de 8, rellenamos las posiciones de los dos dígitos a la izquierda con ceros,
lo cual produce el número binario 00100101.
0⫹0⫽0 0⫹1⫽1
1⫹0⫽1 1 ⫹ 1 ⫽ 10
12 Capítulo 1 • Conceptos básicos
Al sumar 1 y 1, el resultado es un 10 binario (considérelo como el valor decimal 2). El dígito adicional
genera un acarreo hacia la posición del siguiente bit más alto. En la siguiente figura, sumamos los números
binarios 00000100 y 00000111:
!CARREO
0OSICIØN DEL BIT
Empezando con el menor bit en cada número (posición de bit 0), sumamos 0 ⫹ 1, lo cual produce un 1 en
la fila inferior. Lo mismo ocurre en el siguiente bit más alto (posición 1). En la posición de bit 2, sumamos
1 ⫹ 1, lo cual genera una suma de cero y un acarreo de 1. En la posición de bit 3, sumamos el bit de acarreo
a 0 ⫹ 0, lo cual produce un 1. El resto de los bits son ceros. Para verificar la suma, realice la suma de los
equivalentes decimales que se muestran en la parte derecha de la figura (4 ⫹ 7 ⫽ 11).
"YTE
0ALABRA
$OBLE PALABRA
0ALABRA CUÈDRUPLE
La tabla 1-4 muestra el rango de posibles valores para cada tipo de entero sin signo.
Mediciones grandes Al hacer referencia a la memoria y al espacio en disco, se utilizan varias medidas
grandes:4
• Un kilobyte es igual a 210, o 1024 bytes.
• Un megabyte (MB) es igual a 220, o 1,048,576 bytes.
• Un gigabyte (GB) es igual a 230, o 10243, o 1,073,741,824 bytes.
1.3 Representación de datos 13
0000 0 0 1000 8 8
0001 1 1 1001 9 9
0010 2 2 1010 10 A
0011 3 3 1011 11 B
0100 4 4 1100 12 C
0101 5 5 1101 13 D
0110 6 6 1110 14 E
0111 7 7 1111 15 F
1 6 A 7 9 4
0001 0110 1010 0111 1001 0100
Por ejemplo, el número hexadecimal 1234 es igual a (1 ⫻ 163) ⫹ (2 ⫻ 162) ⫹ (3 ⫻ 161) ⫹ (4 ⫻ 160),
que viene siendo el número decimal 4660. De manera similar, el número hexadecimal 3BA4 es igual a
(3 ⫻ 163) ⫹ (11 ⫻ 162) ⫹ (10 ⫻ 161) ⫹ (4 ⫻ 160), que viene siendo el número decimal 15,268. La siguien-
te figura muestra este último cálculo: