• No se han encontrado resultados

Lenguaje Ensamblador Irvine 5a Edición

N/A
N/A
Protected

Academic year: 2021

Share "Lenguaje Ensamblador Irvine 5a Edición"

Copied!
757
0
0

Texto completo

(1)

K i p R. I r v i n e

I r v i ne

Q U I N T A E D I C I Ó N

LENGUAJE ENSAMBLADOR

PARA COMPUTADORAS BASADAS EN INTEL®

Q U I N T A E d i C i Ón

K i p R. I r v i n e

LENGUAJE ENSAMBLADOR

Q U I N T A

E D I C I Ó N

Visítenos en: www.pearsoneducacion.net

La quinta edición completamente actualizada incluye:

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 los conocimientos y la experiencia necesarios para alcanzar el éxito en cualquier entorno orientado a OS o a máquinas.

El libro empieza con una base sólida de la programación en lenguaje ensamblador: arquitectura de la máquina y del procesador, transferencia de datos y procesamiento condicional, para después presentar las cadenas y los arreglos, y las llamadas a funciones de C/C++, entre otros temas clave.

El método de Irving destaca el modo protegido de 32 bits, ofrece un conocimiento esencial para crear aplicaciones Windows y ayuda a evitar problemas complejos de la segmentación de memoria. Para los estudiantes de ingeniería ofrece tres capítulos completos sobre la programación en modo real: desde el nivel del BIOS hasta las interrupciones de MS-DOS.

Nuevos capítulos acerca del diseño del conjunto de instrucciones y la programación con números de punto flotante; así como un nuevo entorno de desarrollo y ensamblador.

Una nueva versión de MASM con Microsoft Visual C++ y un depurador avanzado.

Explicaciones claras sobre los ciclos de ejecución de instrucciones, la codificación

de los saltos condicionales, las llamadas a funciones de C/C++, la codificación de instrucciones de los procesadores IA-32 y muchos otros temas.

Una cobertura renovada de los procedimientos avanzados, con un nuevo enfoque en el procesamiento de la pila de Intel.

Un análisis mejorado sobre IMUL que incluye las instrucciones con dos y tres operandos.

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.

LENGUAJE ENSAMBLADOR

PARA COMPUTADORAS BASADAS EN INTEL

®

PARA COMPUTADORAS BASADAS EN INTEL®

www.elsolucionario.net

(2)
(3)
(4)

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 refi eren a las funciones ASCII que se utilizan para el formato de la pantalla y la impresora, y para las comunicaciones de datos.

Código

ASCII* Ctrl- Nemónico Descripción

Código

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 hacia fuera 24 Ctrl-^ RS Separador de registro 0F Ctrl-O SI Desplazamiento hacia dentro 25 Ctrl-† US Separador de unidad * 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: Tecla Código de exploración Tecla Código de exploración Tecla Código de exploración 1 78 A 1E N 31 2 79 B 30 O 18 3 7A C 2E P 19 4 7B D 20 Q 10 5 7C E 12 R 13 6 7D F 21 S 1F 7 7E G 22 T 14 8 7F H 23 U 16 9 80 I 17 V 2F 0 81 J 24 W 11 ⫺ 82 K 25 X 2D ⫽ 83 L 26 Y 15 M 32 Z 2C

www.elsolucionario.net

(5)
(6)

Lenguaje ensamblador

para computadoras

basadas en Intel

®

Quinta edición

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

(7)

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., publipubli-cada como Prentice Hall, Copyright ©2007. Todos los derechos reservados.

Edición en español

Editor: Luis Miguel Cruz Castillo e-mail: [email protected] 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

Irvine, Kip R.

Lenguaje ensamblador para computadoras basadas en Intel®

PEARSON EDUCACIÓN, México, 2008 ISBN: 978-970-26-1081-6 Área: Ingeniería

Formato: 18.5 ⫻ 23.5 cms Páginas: 752

(8)

Para Jack y Candy Irvine

(9)
(10)

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

2

Arquitectura del procesador IA-32 25

2.1 Conceptos

generales 25

2.1.1 Diseño básico de una microcomputadora 26 2.1.2 Ciclo de ejecución de instrucciones 27 2.1.3 Lectura de la memoria 30

2.1.4 Cómo se ejecutan los programas 31 2.1.5 Repaso de sección 32

2.2

Arquitectura del procesador IA-32 33

2.2.1 Modos de operación 33 2.2.2 Entorno básico de ejecución 34

vii

(11)

2.2.3 Unidad de punto fl otante 36

2.2.4 Historia del microprocesador Intel 37 2.2.5 Repaso de sección 39

2.3

Administración de memoria del procesador IA-32 39

2.3.1 Modo de direccionamiento real 39 2.3.2 Modo protegido 41

2.3.3 Repaso de sección 43

2.4

Componentes de una microcomputadora IA-32 43

2.4.1 Tarjeta madre 43 2.4.2 Salida de video 44 2.4.3 Memoria 45

2.4.4 Puertos de entrada/salida e interfaces de dispositivos 45 2.4.5 Repaso de sección 46

2.5

Sistema de entrada/salida 46

2.5.1 Cómo funciona todo 46 2.5.2 Repaso de sección 49

2.6

Resumen del capítulo 49

3

Fundamentos del lenguaje ensamblador 51

3.1

Elementos básicos del lenguaje ensamblador 51

3.1.1 Constantes enteras 52 3.1.2 Expresiones enteras 52 3.1.3 Constantes numéricas reales 53 3.1.4 Constantes tipo carácter 54 3.1.5 Constantes tipo cadena 54 3.1.6 Palabras reservadas 54 3.1.7 Identifi cadores 54 3.1.8 Directivas 55 3.1.9 Instrucciones 55

3.1.10 La instrucción NOP (ninguna operación) 57 3.1.11 Repaso de sección 58

3.2

Ejemplo: suma y resta de enteros 58

3.2.1 Versión alternativa de SumaResta 60 3.2.2 Plantilla de programa 61

3.2.3 Repaso de sección 61

3.3

Ensamblado, enlazado y ejecución de programas 62

3.3.1 El ciclo de ensamblado-enlazado-ejecución 62 3.3.2 Repaso de sección 64

3.4 Defi nición de datos 64

3.4.1 Tipos de datos intrínsecos 64 3.4.2 Instrucción de defi nición de datos 64 3.4.3 Defi nición de datos BYTE y SBYTE 66

(12)

Contenido ix

3.4.4 Defi nición de datos WORD y SWORD 67 3.4.5 Defi nición de datos DWORD y SDWORD 68 3.4.6 Defi nición de datos QWORD 69

3.4.7 Defi nición de datos TBYTE 69

3.4.8 Defi nición de datos de números reales 69 3.4.9 Orden Little Endian 69

3.4.10 Agregar variables al programa SumaResta 70 3.4.11 Declaración de datos sin inicializar 71 3.4.12 Repaso de sección 71

3.5 Constantes

simbólicas 72

3.5.1 Directiva de signo de igual 72

3.5.2 Cálculo de los tamaños de los arreglos y cadenas 73 3.5.3 Directiva EQU 74

3.5.4 Directiva TEXTEQU 74 3.5.5 Repaso de sección 75

3.6

Programación en modo de direccionamiento real (opcional) 75

3.6.1 Cambios básicos 75

3.7

Resumen del capítulo 76

3.8

Ejercicios de programación 77

4

Transferencias de datos, direccionamiento

y aritmética 79

4.1

Instrucciones de transferencia de datos 79

4.1.1 Introducción 79 4.1.2 Tipos de operandos 80

4.1.3 Operandos directos de memoria 80 4.1.4 Instrucción MOV 81

4.1.5 Extensión con cero y con signo de enteros 82 4.1.6 Instrucciones LAHF y SAHF 84

4.1.7 Instrucción XCHG 84

4.1.8 Operandos de desplazamiento directo 84 4.1.9 Programa de ejemplo (movimientos) 85 4.1.10 Repaso de sección 86

4.2

Suma y resta 87

4.2.1 Instrucciones INC y DEC 87 4.2.2 Instrucción ADD 87 4.2.3 Instrucción SUB 88 4.2.4 Instrucción NEG 88

4.2.5 Implementación de expresiones aritméticas 89 4.2.6 Banderas afectadas por la suma y la resta 89 4.2.7 Programa de ejemplo (SumaResta3) 92 4.2.8 Repaso de sección 93

(13)

4.3

Operadores y directivas relacionadas con los datos 94

4.3.1 Operador OFFSET 94 4.3.2 Directiva ALIGN 95 4.3.3 Operador PTR 95 4.3.4 Operador TYPE 96 4.3.5 Operador LENGTHOF 97 4.3.6 Operador SIZEOF 97 4.3.7 Directiva LABEL 97 4.3.8 Repaso de sección 98

4.4 Direccionamiento

indirecto 99

4.4.1 Operandos indirectos 99 4.4.2 Arreglos 100 4.4.3 Operandos indexados 101 4.4.4 Apuntadores 102 4.4.5 Repaso de sección 103

4.5

Instrucciones JMP y LOOP 104

4.5.1 Instrucción JMP 104 4.5.2 Instrucción LOOP 105

4.5.3 Suma de un arreglo de enteros 106 4.5.4 Copia de una cadena 106

4.5.5 Repaso de sección 107

4.6

Resumen del capítulo 108

4.7

Ejercicios de programación 109

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 Defi nición y uso de los procedimientos 134

5.5.1 Directiva PROC 134

5.5.2 Instrucciones CALL y RET 136

(14)

Contenido xi

5.5.3 Ejemplo: suma de un arreglo de enteros 139 5.5.4 Diagramas de fl ujo 140

5.5.5 Almacenamiento y restauración de registros 140 5.5.6 Repaso de sección 142

5.6

Diseño de programas mediante el uso de procedimientos 143

5.6.1 Programa para sumar enteros (diseño) 143 5.6.2 Implementación de la suma de enteros 145 5.6.3 Repaso de sección 147

5.7

Resumen del capítulo 147

5.8

Ejercicios de programación 148

6 Procesamiento

condicional 150

6.1 Introducción 150

6.2

Instrucciones booleanas y de comparación 151

6.2.1 Las banderas de la CPU 151 6.2.2 Instrucción AND 152 6.2.3 Instrucción OR 153 6.2.4 Instrucción XOR 154 6.2.5 Instrucción NOT 155 6.2.6 Instrucción TEST 155 6.2.7 Instrucción CMP 156

6.2.8 Cómo establecer y borrar banderas individuales de la CPU 157 6.2.9 Repaso de sección 157

6.3 Saltos

condicionales 158

6.3.1 Estructuras condicionales 158 6.3.2 Instrucción Jcond 158

6.3.3 Tipos de instrucciones de saltos condicionales 159 6.3.4 Aplicaciones de saltos condicionales 163

6.3.5 Instrucciones de prueba de bits (opcional) 167 6.3.6 Repaso de sección 168

6.4

Instrucciones de saltos condicionales 169

6.4.1 Instrucciones LOOPZ y LOOPE 169 6.4.2 Instrucciones LOOPNZ y LOOPNE 169 6.4.3 Repaso de sección 170

6.5 Estructuras

condicionales 170

6.5.1 Instrucciones IF con estructura de bloque 170 6.5.2 Expresiones compuestas 173

6.5.3 Ciclos WHILE 174

6.5.4 Selección controlada por tablas 177 6.5.5 Repaso de sección 178

6.6

Aplicación: máquinas de estado fi nito 179

6.6.1 Validación de una cadena de entrada 180

(15)

6.6.2 Validación de un entero con signo 180 6.6.3 Repaso de sección 183

6.7 Directivas de decisión 184

6.7.1 Comparaciones con signo y sin signo 185 6.7.2 Expresiones compuestas 186

6.7.3 Directivas .REPEAT y .WHILE 188

6.8

Resumen del capítulo 189

6.9

Ejercicios de programación 190

7

Aritmética de enteros 193

7.1 Introducción 193

7.2

Instrucciones de desplazamiento y rotación 194

7.2.1 Desplazamientos lógicos y desplazamientos aritméticos 194 7.2.2 Instrucción SHL 195

7.2.3 Instrucción SHR 196

7.2.4 Instrucciones SAL y SAR 196 7.2.5 Instrucción ROL 197

7.2.6 Instrucción ROR 198

7.2.7 Instrucciones RCL y RCR 198 7.2.8 Desbordamiento con signo 199 7.2.9 Instrucciones SHLD/SHRD 199 7.2.10 Repaso de sección 200

7.3

Aplicaciones de desplazamiento y rotación 201

7.3.1 Desplazamiento de varias dobles palabras 201 7.3.2 Multiplicación binaria 202

7.3.3 Visualización de bits binarios 202

7.3.4 Aislamiento de campos de datos de archivos de MS-DOS 203 7.3.5 Repaso de sección 203

7.4

Instrucciones de multiplicación y división 204

7.4.1 Instrucción MUL 204 7.4.2 Instrucción IMUL 205

7.4.3 Evaluación del rendimiento de las operaciones de multiplicación 207 7.4.4 Instrucción DIV 208

7.4.5 División de enteros con signo 209

7.4.6 Implementación de expresiones aritméticas 211 7.4.7 Repaso de sección 212

7.5

Suma y resta extendidas 213

7.5.1 Instrucción ADC 213

7.5.2 Ejemplo de suma extendida 213 7.5.3 Instrucción SBB 214

7.5.4 Repaso de sección 215

(16)

Contenido xiii

7.6

Aritmética ASCII y con decimales desempaquetados 215

7.6.1 Instrucción AAA 216 7.6.2 Instrucción AAS 218 7.6.3 Instrucción AAM 218 7.6.4 Instrucción AAD 218 7.6.5 Repaso de sección 219

7.7

Aritmética con decimales empaquetados 219

7.7.1 Instrucción DAA 219 7.7.2 Instrucción DAS 220 7.7.3 Repaso de sección 220

7.8

Resumen del capítulo 221

7.9

Ejercicios de programación 222

8 Procedimientos

avanzados 224

8.1 Introducción 224

8.2

Marcos de pila 225

8.2.1 Parámetros de pila 225 8.2.2 Variables locales 233

8.2.3 Instrucciones ENTER y LEAVE 236 8.2.4 Directiva LOCAL 237

8.2.5 Procedimiento WriteStackFrame 240 8.2.6 Repaso de sección 241

8.3 Recursividad 242

8.3.1 Cálculo recursivo de una suma 243 8.3.2 Cálculo de un factorial 243 8.3.3 Repaso de sección 245

8.4 Directiva

.MODEL 246

8.4.1 Especifi cadores de lenguaje 247 8.4.2 Repaso de sección 248

8.5

INVOKE, ADDR, PROC y PROTO (opcional) 248

8.5.1 Directiva INVOKE 248 8.5.2 Operador ADDR 249 8.5.3 Directiva PROC 250 8.5.4 Directiva PROTO 253

8.5.5 Clasifi caciones de parámetros 255 8.5.6 Ejemplo: intercambio de dos enteros 256 8.5.7 Tips de depuración 256

8.5.8 Repaso de sección 257

8.6

Creación de programas con varios módulos 258

8.6.1 Ocultar y exportar nombres de procedimientos 258 8.6.2 Llamadas a procedimientos externos 258

(17)

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

9

Cadenas y arreglos 269

9.1 Introducción 269

9.2

Instrucciones primitivas de cadenas 270

9.2.1 MOVSB, MOVSW y MOVSD 271 9.2.2 CMPSB, CMPSW y CMPSD 272 9.2.3 SCASB, SCASW y SCASD 274 9.2.4 STOSB, STOSW y STOSD 274 9.2.5 LODSB, LODSW y LODSD 275 9.2.6 Repaso de sección 275

9.3

Procedimientos de cadenas seleccionados 276

9.3.1 Procedimiento Str_compare 276 9.3.2 Procedimiento Str_length 277 9.3.3 Procedimiento Str_copy 278 9.3.4 Procedimiento Str_trim 278 9.3.5 Procedimiento Str_ucase 279

9.3.6 Programa de demostración de la biblioteca de cadenas 280 9.3.7 Repaso de sección 282

9.4 Arreglos

bidimensionales 282

9.4.1 Ordenamiento de fi las y columnas 282 9.4.2 Operandos base-índice 283

9.4.3 Operandos base-índice-desplazamiento 285 9.4.4 Repaso de sección 285

9.5

Búsqueda y ordenamiento de arreglos de enteros 285

9.5.1 Ordenamiento de burbuja 286 9.5.2 Búsqueda binaria 287 9.5.3 Repaso de sección 293

9.6

Resumen del capítulo 294

9.7

Ejercicios de programación 295

10 Estructuras y macros 299

10.1 Estructuras 299

10.1.1 Defi nición de estructuras 300

(18)

Contenido xv

10.1.2 Declaración de variables de estructura 301 10.1.3 Referencias a variables de estructura 302 10.1.4 Ejemplo: mostrar la hora del sistema 305 10.1.5 Estructuras que contienen estructuras 307 10.1.6 Ejemplo: paso del borracho 307

10.1.7 Declaración y uso de uniones 310 10.1.8 Repaso de sección 312

10.2 Macros 313

10.2.1 Generalidades 313 10.2.2 Defi nición de macros 313 10.2.3 Invocación de macros 314

10.2.4 Características adicionales de los macros 315 10.2.5 Uso de la biblioteca de macros del libro 318 10.2.6 Programa de ejemplo: envolturas 324 10.2.7 Repaso de sección 325

10.3 Directivas de ensamblado condicional 326

10.3.1 Comprobación de argumentos faltantes 326 10.3.2 Inicializadores de argumentos predeterminados 328 10.3.3 Expresiones booleanas 328

10.3.4 Directivas IF, ELSE y ENDIF 328 10.3.5 Las directivas IFIDN e IFIDNI 329 10.3.6 Ejemplo: suma de la fi la de una matriz 330 10.3.7 Operadores especiales 333

10.3.8 Macrofunciones 336 10.3.9 Repaso de sección 337

10.4 Defi nición de bloques de repetición 338

10.4.1 Directiva WHILE 338 10.4.2 Directiva REPEAT 338 10.4.3 Directiva FOR 339 10.4.4 Directiva FORC 340 10.4.5 Ejemplo: lista enlazada 340 10.4.6 Repaso de sección 342

10.5 Resumen del capítulo 342

10.6 Ejercicios de programación 343

11 Programación en MS Windows 346

11.1 Programación de la consola Win32 346

11.1.1 Antecedentes 347

11.1.2 Funciones de la consola Win32 350 11.1.3 Visualización de un cuadro de mensaje 352 11.1.4 Entrada de consola 354

11.1.5 Salida de consola 360

11.1.6 Lectura y escritura de archivos 361

(19)

11.1.7 E/S de archivos en la biblioteca Irvine32 365 11.1.8 Prueba de los procedimientos de E/S de archivos 367 11.1.9 Manipulación de ventanas de consola 370

11.1.10 Control del cursor 373 11.1.11 Control del color de texto 373 11.1.12 Funciones de hora y fecha 375 11.1.13 Repaso de sección 379

11.2 Escritura de una aplicación gráfi ca de Windows 379

11.2.1 Estructuras necesarias 380 11.2.2 La función MessageBox 381 11.2.3 El procedimiento WinMain 382 11.2.4 El procedimiento WinProc 382 11.2.5 El procedimiento ErrorHandler 383 11.2.6 Listado del programa 383

11.2.7 Repaso de sección 386

11.3 Asignación dinámica de memoria 387

11.3.1 Programas PruebaMonton 390 11.3.2 Repaso de sección 393

11.4 Administración de memoria en la familia IA-32 393

11.4.1 Direcciones lineales 394 11.4.2 Traducción de páginas 397 11.4.3 Repaso de sección 398

11.5 Resumen del capítulo 399

11.6 Ejercicios de programación 400

12 Interfaz con lenguajes de alto nivel 402

12.1 Introducción 402

12.1.1 Convenciones generales 402 12.1.2 Repaso de sección 404

12.2 Código ensamblador en línea 404

12.2.1 La directiva __asm en Microsoft Visual C++ 404 12.2.2 Ejemplo de cifrado de archivos 406

12.2.3 Repaso de sección 409

12.3 Enlace con C/C++ en modo protegido 409

12.3.1 Uso de lenguaje ensamblador para optimizar código en C++ 410 12.3.2 Llamadas a funciones en C y C++ 415

12.3.3 Ejemplo de tabla de multiplicación 416 12.3.4 Llamadas a funciones de la biblioteca de C 419 12.3.5 Programa de listado de directorios 422 12.3.6 Repaso de sección 423

12.4 Enlace con C/C++ en modo de direccionamiento real 423

12.4.1 Enlace con Borland C++ 424

(20)

Contenido xvii

12.4.2 Ejemplo: LeerSector 425

12.4.3 Ejemplo: enteros aleatorios grandes 428 12.4.4 Repaso de sección 430

12.5 Resumen del capítulo 430

12.6 Ejercicios de programación 431

13 Programación en MS-DOS de 16 bits 432

13.1 MS-DOS y la IBM-PC 432

13.1.1 Organización de la memoria 433 13.1.2 Redirección de entrada-salida 434 13.1.3 Interrupciones de software 435 13.1.4 Instrucción INT 435

13.1.5 Codifi cación para los programas de 16 bits 436 13.1.6 Repaso de sección 437

13.2 Llamadas a funciones de MS-DOS (INT 21h) 438

13.2.1 Funciones de salida selectas 439

13.2.2 Ejemplo de programa: Hola programador 441 13.2.3 Funciones de entrada selectas 442

13.2.4 Funciones de fecha/hora 446 13.2.5 Repaso de sección 449

13.3 Servicios estándar de E/S de archivos de MS-DOS 449

13.3.1 Crear o abrir un archivo (716Ch) 451 13.3.2 Cerrar manejador de archivo (3Eh) 452 13.3.3 Mover apuntador de archivo (42h) 452

13.3.4 Obtener la fecha y hora de la creación de un archivo 453 13.3.5 Procedimientos de biblioteca selectos 453

13.3.6 Ejemplo: leer y copiar un archivo de texto 454 13.3.7 Leer la cola de comandos de MS-DOS 456 13.3.8 Ejemplo: creación un archivo binario 458 13.3.9 Repaso de sección 461

13.4 Resumen del capítulo 461

13.5 Ejercicios del capítulo 463

14 Fundamentos de los discos 464

14.1 Sistemas de almacenamiento en disco 464

14.1.1 Pistas, cilindros y sectores 465 14.1.2 Particiones de disco (volúmenes) 466 14.1.3 Repaso de sección 468

14.2 Sistemas de archivos 468

14.2.1 FAT12 469

(21)

14.2.2 FAT16 469 14.2.3 FAT32 469 14.2.4 NTFS 470

14.2.5 Áreas principales del disco 470 14.2.6 Repaso de sección 471

14.3 Directorio de disco 472

14.3.1 Estructura de directorios de MS-DOS 473

14.3.2 Nombres de archivos extensos en MS Windows 475 14.3.3 Tabla de asignación de archivos (FAT) 476

14.3.4 Repaso de sección 477

14.4 Lectura y escritura de sectores de disco (7305h) 477

14.4.1 Programa para visualización de sectores 478 14.4.2 Repaso de sección 482

14.5 Funciones de archivo a nivel de sistema 482

14.5.1 Obtener el espacio libre del disco (7303h) 483 14.5.2 Crear subdirectorio (39h) 485

14.5.3 Eliminar subdirectorio (3Ah) 486 14.5.4 Establecer el directorio actual (3Bh) 486 14.5.5 Obtener el directorio actual (47h) 486

14.5.6 Obtener y establecer atributos de archivo (7143h) 486 14.5.7 Repaso de sección 487

14.6 Resumen del capítulo 487

14.7 Ejercicios de programación 488

15 Programación a nivel del BIOS 490

15.1 Introducción 490

15.1.1 Área de datos del BIOS 491

15.2 Entrada de teclado mediante INT 16h 492

15.2.1 Cómo funciona el teclado 492 15.2.2 Funciones de INT 16h 493 15.2.3 Repaso de sección 497

15.3 Programación de VIDEO con INT 10h 498

15.3.1 Fundamentos 498 15.3.2 Control del color 499

15.3.3 Funciones de video de INT 10h 501

15.3.4 Ejemplos de procedimientos de la biblioteca 511 15.3.5 Repaso de sección 512

15.4 Dibujo de gráfi cos mediante INT 10h 512

15.4.1 Funciones de INT 10h relacionadas con píxeles 513 15.4.2 Programa DibujarLinea 514

(22)

Contenido xix

15.4.3 Programa de coordenadas cartesianas 515

15.4.4 Conversión de coordenadas cartesianas a coordenadas de pantalla 517 15.4.5 Repaso de sección 518

15.5 Gráfi cos de mapas de memoria 519

15.5.1 Modo 13h: 320 x 200, 256 colores 519

15.5.2 Programa de gráfi cos de mapas de memoria 520 15.5.3 Repaso de sección 523

15.6 Programación del ratón 523

15.6.1 Funciones INT 33h para el ratón 523 15.6.2 Programa para rastrear el ratón 528 15.6.3 Repaso de sección 532

15.7 Resumen del capítulo 533

15.8 Ejercicios del capítulo 534

16 Programación experta en MS-DOS 536

16.1 Introducción 536

16.2 Defi nición de segmentos 537

16.2.1 Directivas de segmento simplifi cadas 537 16.2.2 Defi niciones explícitas de segmentos 539 16.2.3 Redefi niciones de segmentos 542 16.2.4 Combinación de segmentos 542 16.2.5 Repaso de sección 543

16.3 Estructura de un programa en tiempo de ejecución 544

16.3.1 Prefi jo de segmento de programa 544 16.3.2 Programas COM 545

16.3.3 Programas EXE 546 16.3.4 Repaso de sección 547

16.4 Manejo de interrupciones 548

16.4.1 Interrupciones de hardware 549

16.4.2 Instrucciones de control de interrupciones 550

16.4.3 Escritura de un manejador de interrupciones personalizado 551 16.4.4 Programas TSR (Terminar y permanecer residente) 553 16.4.5 Aplicación: el programa No_reinicio 554

16.4.6 Repaso de sección 557

16.5 Control de hardware mediante el uso de puertos de E/S 558

16.5.1 Puertos de entrada-salida 558 16.5.2 Programa de sonido de PC 558

16.6 Resumen del capítulo 560

(23)

17

Procesamiento de punto fl otante

y codifi cación de instrucciones 562

17.1 Representación binaria de punto fl otante 562

17.1.1 Representación de punto fl otante binaria IEEE 563 17.1.2 El exponente 564

17.1.3 Números de punto fl otante binarios normalizados 565 17.1.4 Creación de la representación IEEE 565

17.1.5 Conversión de fracciones decimales a reales binarios 567 17.1.6 Repaso de sección 568

17.2 Unidad de punto fl otante 569

17.2.1 Pila de registros FPU 569 17.2.2 Redondeo 571

17.2.3 Excepciones de punto fl otante 573

17.2.4 Conjunto de instrucciones de punto fl otante 573 17.2.5 Instrucciones aritméticas 576

17.2.6 Comparación de valores de punto fl otante 579 17.2.7 Lectura y escritura de valores de punto fl otante 582 17.2.8 Sincronización de excepciones 583

17.2.9 Ejemplos de código 584 17.2.10 Aritmética de modo mixto 585

17.2.11 Enmascaramiento y desenmascaramiento de excepciones 586 17.2.12 Repaso de sección 587

17.3 Codifi cación de instrucciones Intel 588

17.3.1 Formato de instrucciones IA-32 588 17.3.2 Instrucciones de un solo byte 589 17.3.3 Movimiento inmediato a un registro 590 17.3.4 Instrucciones en modo de registro 591

17.3.5 Prefi jo de tamaño de operando del procesador IA-32 591 17.3.6 Instrucciones en modo de memoria 592

17.3.7 Repaso de sección 595

17.4 Resumen del capítulo 596

17.5 Ejercicios de programación 597

Apéndice A Referencia de MASM 600

Apéndice B El conjunto de instrucciones IA-32 619

Apéndice C Interrupciones del BIOS y de MS-DOS 650

Apéndice D Respuestas a las preguntas de repaso 659

Índice 705

(24)

xxi

La quinta edición de Lenguaje ensamblador para computadoras basadas en Intel, enseña la programación en lenguaje ensamblador y la arquitectura del procesador Intel IA-32; el texto es apropiado para los siguientes cursos universitarios:

• Programación en lenguaje ensamblador. • Fundamentos de los sistemas computacionales. • Fundamentos de la arquitectura computacional.

Los estudiantes utilizan los procesadores Intel o AMD y programan con Microsoft Macro Assembler (MASM) 8.0, que se ejecuta en cualquiera de las siguientes plataformas MS-Windows: Windows 95, 98, Millenium, NT, 2000 y XP.

Aunque este libro se diseñó en un principio como texto de programación para estudiantes universitarios, ha evolucionado a lo largo de los últimos 15 años en algo mucho más completo. Muchas universidades utilizan el libro para sus cursos introductorios de arquitectura computacional. Como una muestra de su popularidad, la cuarta edición se tradujo al coreano, chino, francés, ruso y polaco.

Énfasis de los temas Esta edición incluye temas que conducen de una manera natural hacia cursos sub-siguientes en arquitectura computacional, sistemas operativos y escritura de compiladores:

• Concepto de máquina virtual. • Operaciones booleanas elementales. • Ciclo de ejecución de instrucciones.

• Acceso a memoria e intercambio (handshaking). • Interrupciones y sondeo.

• Concepto de canalización y superescalares. • E/S basada en hardware.

• Representación binaria para punto fl otante.

Otros temas se relacionan específi camente a la arquitectura Intel IA-32: • Memoria protegida y paginación en la arquitectura IA-32.

• Segmentación de memoria en modo de direccionamiento real. • Manejo de interrupciones de 16 bits.

• Llamadas al sistema en MS-DOS y BIOS (interrupciones).

• Arquitectura y programación de la Unidad de punto fl otante de IA-32. • Codifi cación de instrucciones de IA-32.

Ciertos ejemplos que aparecen en el libro se pueden emplear en cursos que se imparten en la parte fi nal de un plan de estudios de ciencias computacionales:

• Algoritmos de búsqueda y ordenación. • Estructuras de lenguajes de alto nivel. • Máquinas de estado fi nito.

• Ejemplos de optimización de código.

Prefacio

(25)

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 codifi cació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. 10 Una documentación mejorada de la biblioteca de macros del libro.

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 fl otante de la arquitectura IA-32. Tipos de datos de punto

fl otante. Codifi cación y decodifi cació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 estuestu-diantes deberían escribir programas a nivel de máquina. En ambos casos, obtendrán una experiencia memorable que les brindará la confi anza 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áfi cos) 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.

(26)

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 fi nal 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 superfi cie 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 anfi triones.

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 fi nal 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 simplifi can 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 efi cientes y a comprender mejor la forma en que los compiladores generan código objeto.

Prefacio xxiii

(27)

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).

Resumen de los capítulos

Los capítulos 1 a 8 contienen los fundamentos básicos del lenguaje ensamblador, y deben cubrirse en se-cuencia. Después de eso, hay un buen grado de libertad. El siguiente gráfi co de dependencia de los capítulos muestra cómo los últimos dependen del conocimiento obtenido en los anteriores. El capítulo 10 se dividió en dos partes para este gráfi co, ya que ningún otro depende del conocimiento de cómo crear macros:

11 1 al 8 9 13 14 15 16 17 10 (estructuras) 12 10 (macros)

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.

(28)

3. Fundamentos de lenguaje ensamblador: introducción al lenguaje ensamblador, enlace y depuración,

defi nición de constantes y variables.

4. Transferencias de datos, direccionamiento y aritmética: transferencia simple de datos e

instruccio-nes aritméticas, ciclo de ensamblado-enlace-ejecución, operadores, directivas, expresioinstruccio-nes, instruccioinstruccio-nes JMP y LOOP, y direccionamiento indirecto.

5. Procedimientos: enlace a una biblioteca externa, descripción de la biblioteca de vínculos del libro,

operaciones de pila, defi nición y uso de procedimientos, diagramas de fl ujo y diseño estructurado des-cendente (top-down).

6. Procesamiento condicional: instrucciones booleanas y de comparación, saltos condicionales y ciclos,

estructuras lógicas de alto nivel y máquinas de estado fi nito.

7. Aritmética de enteros: instrucciones de rotación y corrimiento con aplicaciones útiles, multiplicación y

división, suma y resta extendidas, aritmética ASCII y con decimales empaquetados.

8. Procedimientos avanzados: pila de parámetros, variables locales, directivas avanzadas PROC e

INVO-KE, y recursividad.

9. Cadenas y arreglos: primitivas de cadena, manipulación de arreglos de caracteres y enteros, arreglos

bidimensionales, ordenación y búsqueda.

10. Estructuras y macros: estructuras, macros, directivas de ensamblado condicional y defi nición de bloques

de repetición.

11. Programación en MS-Windows: conceptos de administración de memoria en modo protegido, uso de

la API de Microsoft Windows para mostrar texto y colores, y asignación de memoria dinámica.

12. Interfaz de lenguajes de alto nivel: convenciones para paso de parámetros, código de ensamblado en

línea, y enlace de módulos en lenguaje ensamblador con programas en C y C++.

13. Programación en MS-DOS de 16 bits: llamadas a las interrupciones de MS-DOS para operaciones de

entrada-salida de consola y archivos.

14. Fundamentos de los discos: sistemas de almacenamiento en disco, sectores, clústeres, directorios, tablas

de asignación de archivos, manejo de los códigos de error de MS-DOS, manipulación de unidades y direc-torios.

15. Programación a nivel de BIOS: entrada desde el teclado, video con texto y gráfi cos, y programación

del ratón.

16. Programación experta en MS-DOS: segmentos con diseño personalizado, estructura de un programa en

tiempo de ejecución, y manejo de interrupciones. control del hardware mediante el uso de puertos de E/S.

17. Procesamiento de punto fl otante y codifi cación de instrucciones: representación binaria de punto

fl otante y aritmética de punto fl otante. Aprenda a programar la Unidad de punto fl otante del procesador IA-32. Comprensión de la codifi cación de instrucciones de máquina del procesador IA-32.

Apéndice A: referencia de MASM.

Apéndice B: el conjunto de instrucciones IA-32. Apéndice C: interrupciones del BIOS y de MS-DOS. Apéndice D: respuestas a las preguntas de repaso.

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 fl otante. Las páginas de contenido son docu-mentos HTML, de manera que los estudiantes e instructores pueden agregar fácilmente su propio contenido personalizado.

Prefacio xxv

(29)

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ífi co 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 infl uencia para el desarrollo de este libro, en algunos casos en varias ediciones:

• Gerald Cahill, Antelope Valley College. • James Brink. Pacifi c 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 identifi caron numerosos errores. Varias personas revirevi-saron 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, Pacifi c 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.

(30)

• Sajid Iqbal, Faran Institute of Technology. • Charles Jones, Maryville College. • Vincent Kayes, Mount St. Mary College. • Eric Kobrin, Miami.

• Pablo Maurin, Miami.

• Barry Meaker, Ingeniero de diseño, Boeing Corporation. • Ian Merkel, Miami.

• Sylvia Miner, Miami.

• M. Nawaz, OPSTEC College of Computer Science. • Kam Ng, Universidad China de Hong Kong. • Hien Nguyen, Miami.

• Ernie Philipp, Northern Virginia Community College. • Boyd Stephens, UGMO Research, LLC.

• John Taylor, Inglaterra.

• Zachary Taylor, Columbia College.

• Virginia Welsh, Community College of Baltimore County. • Robert Workman, Southern Connecticut State University. • Tianzheng, Wu, Mount Mercy College.

• Matthew Zukoski, Universidad Lehigh.

Prefacio xxvii

(31)
(32)

CÓDIGOS DE EXPLORACIÓN DEL TECLADO

Los siguientes códigos de exploración del teclado pueden obtenerse al llamar a INT 16h, o a INT 21h para la entrada del teclado una segunda vez (la primera vez, la lectura del teclado devuelve 0). Todos los códigos están en hexadecimal: TECLAS DE FUNCIÓN Tecla Normal Con mayúsculas Con Ctrl Con Alt F1 3B 54 5E 68 F2 3C 55 5F 69 F3 3D 56 60 6A F4 3E 57 61 6B F5 3F 58 62 6C F6 40 59 63 6D F7 41 5A 64 6E F8 42 5B 65 6F F9 43 5C 66 70 F10 44 5D 67 71 F11 85 87 89 8B F12 86 88 8A 8C

Tecla Sola Con tecla Ctrl Inicio 47 77 Fin 4F 75 AvPág 49 84 RePág 51 76 ImprPant 37 72 Flecha izquierda 4B 73 Flecha derecha 4D 74 Flecha arriba 48 8D Flecha abajo 50 91 Ins 52 92 Supr 53 93 Retroceso tab 0F 94 ⫹ gris 4E 90 ⫺ gris 4A 8E

O

V

P

E

F

L

A

P

E

www.elsolucionario.net

(33)
(34)

1

Conceptos básicos

1.1 Bienvenido al lenguaje ensamblador

1.1.1 Preguntas importantes por hacer 1.1.2 Aplicaciones del lenguaje ensamblador 1.1.3 Repaso de sección

1.2 Concepto de máquina virtual

1.2.1 Historia de los ensambladores de la PC 1.2.2 Repaso de sección

1.3 Representación de datos

1.3.1 Números binarios 1.3.2 Suma binaria

1.3.3 Tamaños de almacenamiento de enteros 1.3.4 Enteros hexadecimales

1.3.5 Enteros con signo

1.3.6 Almacenamiento de caracteres 1.3.7 Repaso de sección

1.4 Operaciones booleanas

1.4.1 Tablas de verdad para las funciones booleanas

1.4.2 Repaso de sección

1.5 Resumen del capítulo

1.1

Bienvenido al lenguaje ensamblador

Lenguaje ensamblador para computadoras basadas en microprocesadores Intel se enfoca en la programación de

microprocesadores compatibles con la familia de procesadores IA-32 de Intel, en la plataforma MS-Windows. Puede usar un procesador Intel o AMD de 32/64 bits para ejecutar todos los programas de este libro.

La familia IA-32 empezó con el Intel 80386 y continúa con el Pentium 4. Microsoft MASM (Macro

Assem-bler) 8.0 es nuestro ensamblador preferido, el cual se ejecuta en MS-Windows. Hay otros ensambladores

muy buenos para las computadoras basadas en Intel, incluyendo TASM (Turbo Assembler), NASM (Netwide

Assembler), y el ensamblador de GNU. De todos ellos, TASM tiene la sintaxis más parecida a MASM, por lo

que usted (con ayuda de su instructor) podría ensamblar y ejecutar la mayoría de los programas presentados en este libro. Los otros ensambladores (NASM y GNU) tienen una sintaxis un poco distinta.

El lenguaje ensamblador es el lenguaje de programación más antiguo y, de todos los lenguajes, es el que más se asemeja al lenguaje máquina nativo. Proporciona un acceso directo al hardware de la computadora, por lo que usted debe tener una buena comprensión acerca de la arquitectura y el sistema operativo de su computadora.

1

(35)

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á sufi ciente 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ífi co 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.

1.1.1 Preguntas importantes por hacer

¿Qué conocimientos previos debo tener? Antes de leer este libro, debe haber completado un curso universitario de nivel básico sobre programación de computadoras. De esta forma, comprenderá mejor las instrucciones de programación de alto nivel tales como IF, ciclos y arreglos, al implementarlos en lenguaje ensamblador.

¿Qué son los ensambladores y los enlazadores? Un ensamblador es un programa utilitario que con-vierte el código fuente de los programas escritos en lenguajes ensamblador a lenguaje máquina. Un

enlaza-dor es un programa utilitario que combina los archivos individuales creados por un ensamblaenlaza-dor, en un solo

programa ejecutable. Hay una herramienta relacionada, llamada depurador, la cual le permite avanzar paso a paso a través de un programa mientras se ejecuta, para poder examinar los registros y la memoria.

¿Qué hardware y software necesito? Necesita una computadora con un procesador Intel386, Intel486, Pentium o compatible. Por ejemplo, los procesadores AMD funcionan muy bien con este libro. MASM (el ensamblador) es compatible con todas las versiones de 32 bits de Microsoft Windows, empezando con Windows 95. Algunos de los programas avanzados, relacionados con el acceso directo al hardware y la pro-gramación de los sectores de disco deben ejecutarse en MS-DOS, Windows 95/98/Me, debido a las estrictas restricciones de seguridad impuestas por Windows NT/2000/XP.

Además, necesitará lo siguiente:

Editor: use un editor de texto o un editor para programadores, para crear los archivos de código fuente en lenguaje ensamblador.

Depurador de 32 bits: en sentido estricto, no necesita un depurador, pero es muy conveniente tener uno. El depurador que se incluye con Visual C++ 2005 Express es excelente.

(36)

1.1 Bienvenido al lenguaje ensamblador 3

¿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áfi cos 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 MicroMicro-soft. 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.

¿Cómo se relaciona el lenguaje ensamblador con el lenguaje máquina? El lenguaje máquina es un lenguaje numérico que un procesador de computadora (la CPU) entiende de manera específi ca. Los proce-sadores compatibles con IA-32 entienden un lenguaje máquina común. El lenguaje ensamblador consiste en instrucciones escritas con nemónicos cortos, tales como ADD, MOV, SUB y CALL. El lenguaje ensamblador

(37)

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á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 afi rmar 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ífi cas 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ífi ca. 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,

Referencias

Documento similar