lenguaje ensamblador 5 ed

756
Kip R. Irvine QUINTA EDICIÓN LENGUAJE ENSAMBLADOR PARA COMPUTADORAS BASADAS EN INTEL®

Upload: fabio-augusto-vanegas-bovea

Post on 23-Jun-2015

3.626 views

Category:

Documents


31 download

TRANSCRIPT

  • 1. Port. Lenguaje Ensamblador.ai7/16/0712:48:46 PMLENGUAJE ENSAMBLADORLENGUAJE ENSAMBLADOR PARA COMPUTADORAS BASADAS EN INTELPARA COMPUTADORAS BASADAS EN INTELQ U I N T A E d i C i nK ipR. I r v i n e Nuevos captulos acerca del diseo del conjunto de instrucciones y la programacin con nmeros de punto flotante; as como un nuevo entorno de desarrollo y ensamblador. Una nueva versin de MASM con Microsoft Visual C++ y un depurador avanzado. Explicaciones claras sobre los ciclos de ejecucin de instrucciones, la codificacin de los saltos condicionales, las llamadas a funciones de C/C++, la codificacin 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 anlisis mejorado sobre IMUL que incluye las instrucciones con dos y tres operandos.El sitio Web de este libro, www.pearsoneducacion.net/irvine, proporciona un vnculo para descargar MASM 8.0, junto con ms de 100 programas de ejemplo, extensas bibliotecas de vnculos de 16 y 32 bits, y tutoriales de programacin adicionales.QUINTA EDICINLENGUAJE ENSAMBLADORLa quinta edicin completamente actualizada incluye:PARA COMPUTADORAS BASADAS EN INTELClaro, completo y fcil de entender; este libro simplifica y desmitifica la arquitectura y programacin en lenguaje ensamblador de los modernos procesadores Intel IA-32. Combina la teora con muchos ejercicios de prctica, lo que proporciona a los lectores los conocimientos y la experiencia necesarios para alcanzar el xito en cualquier entorno orientado a OS o a mquinas. El libro empieza con una base slida de la programacin en lenguaje ensamblador: arquitectura de la mquina y del procesador, transferencia de datos y procesamiento condicional, para despus presentar las cadenas y los arreglos, y las llamadas a funciones de C/C++, entre otros temas clave. El mtodo 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 segmentacin de memoria. Para los estudiantes de ingeniera ofrece tres captulos completos sobre la programacin en modo real: desde el nivel del BIOS hasta las interrupciones de MS-DOS.I r v i neQUINTA EDICINVistenos en: www.pearsoneducacion.netK ipR. I r v i n e

2. CARACTERES ASCII DE CONTROL La siguiente lista muestra los cdigos ASCII que se generan al oprimir una combinacin de teclas de control. Los nemnicos y las descripciones se reeren a las funciones ASCII que se utilizan para el formato de la pantalla y la impresora, y para las comunicaciones de datos. Cdigo ASCII* Ctrl-Nemnico DescripcinCdigo ASCII* Ctrl-Nemnico Descripcin00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0ECtrl-A Ctrl-B Ctrl-C Ctrl-D Ctrl-E Ctrl-F Ctrl-G Ctrl-H Ctrl-I Ctrl-J Ctrl-K Ctrl-L Ctrl-M Ctrl-NNUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 24Ctrl-P Ctrl-Q Ctrl-R Ctrl-S Ctrl-T Ctrl-U Ctrl-V Ctrl-W Ctrl-X Ctrl-Y Ctrl-Z Crl-I CtrlCtrl-I Ctrl-^DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RSEscape de vnculo de datos Control de dispositivo 1 Control de dispositivo 2 Control de dispositivo 3 Control de dispositivo 4 Reconocimiento negativo Inactividad sncrona Fin del bloque de transmisin Cancelar Fin del medio Sustituto Escape Separador de archivo Separador de grupo Separador de registro0FCtrl-O SI25Ctrl-USSeparador de unidadCarcter nulo Inicio de encabezado Inicio de texto Fin de texto Fin de transmisin Investigacin Reconocimiento Campana Retroceso Tabulacin horizontal Avance de lnea Tabulacin vertical Avance de pgina Retorno de carro Desplazamiento hacia fuera Desplazamiento hacia dentro* Los cdigos ASCII estn en hexadecimal. El cdigo ASCII 1Fh es Ctrl-Guin corto (-).COMBINACIONES ALT+TECLA Los siguientes cdigos de exploracin hexadecimales se producen al oprimir la tecla ALT y cada carcter: TeclaCdigo de exploracinTeclaCdigo de exploracinTeclaCdigo de exploracin178A1EN31279B30O1837AC2EP1947BD20Q1057CE12R1367DF21S1F77EG22T1487FH23U16980I17V2F081J24W1182K25X2D83L26Y15M32Z2C 3. Lenguaje ensamblador para computadoras basadas en Intel Quinta edicinKIP R. IRVINE Florida International University School of Computing and Information SciencesTRADUCCIN Alfonso Vidal Romero Elizondo Ingeniero en Sistemas Electrnicos Instituto Tecnolgico y de Estudios Superiores de Monterrey - Campus MonterreyREVISIN TCNICA Mara Concepcin Villar Cuesta Armandina J. Leal Flores Departamento de Ciencias Computacionales Instituto Tecnolgico y de Estudios Superiores de Monterrey - Campus MonterreyJos Miguel Morn Loza Presidente de la Academia de Sistemas Digitales Avanzados Centro Universitario de Ciencias Exactas e Ingenieras Universidad de Guadalajara 4. Irvine, Kip R. Lenguaje ensamblador para computadoras basadas en Intel PEARSON EDUCACIN, Mxico, 2008 ISBN: 978-970-26-1081-6 rea: Ingeniera Formato: 18.5 23.5 cmsPginas: 752Authorized 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 Traduccin autorizada de la edicin en idioma ingls. Assembly language for intel-based computers, 5e por Kip R. Irvine, publicada por Pearson Education, Inc., publicada como Prentice Hall, Copyright 2007. Todos los derechos reservados. Edicin en espaol Editor:Luis Miguel Cruz Castillo e-mail: [email protected] Editor de desarrollo: Bernardino Gutirrez Hernndez Supervisor de produccin: Enrique Trejo Hernndez Edicin en ingls 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 OBrien 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 OBrien Marketing Assistant: Mack Patterson QUINTA EDICIN, 2008 D.R. 2008 por Pearson Educacin de Mxico, S.A. de C.V. Atlacomulco 500-5o piso Col. Industrial Atoto C.P. 53519, Naucalpan de Jurez, Edo. de Mxico Cmara Nacional de la Industria Editorial Mexicana. Reg. Nm. 1031. Prentice Hall es una marca registrada de Pearson Educacin de Mxico, S.A. de C.V. Reservados todos los derechos. Ni la totalidad ni parte de esta publicacin pueden reproducirse, registrarse o transmitirse, por un sistema de recuperacin de informacin, en ninguna forma ni por ningn medio, sea electrnico, mecnico, fotoqumico, magntico o electroptico, por fotocopia, grabacin o cualquier otro, sin permiso previo por escrito del editor. El prstamo, alquiler o cualquier otra forma de cesin de uso de este ejemplar requerir tambin la autorizacin del editor o de sus representantes. ISBN 10: 970-26-1081-8 ISBN 13: 978-970-26-1081-6 Impreso en Mxico. Printed in Mexico. 1 2 3 4 5 6 7 8 9 0 - 10 09 08 5. Para Jack y Candy Irvine 6. Contenido Prefacioxxi1Conceptos bsicos1.1Bienvenido al lenguaje ensamblador 1.1.1 1.1.2 1.1.31.2157Historia de los ensambladores de la PC Repaso de seccin 9Representacin de datos 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.71.4Preguntas importantes por hacer 2 Aplicaciones del lenguaje ensamblador Repaso de seccin 6Concepto de mquina virtual 1.2.1 1.2.21.3199Nmeros binarios 10 Suma binaria 11 Tamaos de almacenamiento de enteros Enteros hexadecimales 13 Enteros con signo 14 Almacenamiento de caracteres 16 Repaso de seccin 1812Operaciones booleanas 20 1.4.1 1.4.2Tablas de verdad para las funciones booleanas Repaso de seccin 23221.5Resumen del captulo2Arquitectura del procesador IA-322.1Conceptos generales 2.1.1 2.1.2 2.1.3 2.1.4 2.1.52.22325Diseo bsico de una microcomputadora Ciclo de ejecucin de instrucciones 27 Lectura de la memoria 30 Cmo se ejecutan los programas 31 Repaso de seccin 32Arquitectura del procesador IA-32 2.2.1 2.2.2Modos de operacin 33 Entorno bsico de ejecucin34vii263325 7. viiiContenido2.2.3 2.2.4 2.2.52.3Modo de direccionamiento real Modo protegido 41 Repaso de seccin 433939Componentes de una microcomputadora IA-32 2.4.1 2.4.2 2.4.3 2.4.4 2.4.52.537Administracin de memoria del procesador IA-32 2.3.1 2.3.2 2.3.32.4Unidad de punto otante 36 Historia del microprocesador Intel Repaso de seccin 39Tarjeta madre 43 Salida de video 44 Memoria 45 Puertos de entrada/salida e interfaces de dispositivos Repaso de seccin 464345Sistema de entrada/salida 46 2.5.1 2.5.2Cmo funciona todo 46 Repaso de seccin 492.6Resumen del captulo3Fundamentos del lenguaje ensamblador3.1Elementos bsicos del lenguaje ensamblador 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 3.1.9 3.1.10 3.1.113.2Versin alternativa de SumaResta Plantilla de programa 61 Repaso de seccin 6151575860Ensamblado, enlazado y ejecucin de programas 3.3.1 3.3.23.4Constantes enteras 52 Expresiones enteras 52 Constantes numricas reales 53 Constantes tipo carcter 54 Constantes tipo cadena 54 Palabras reservadas 54 Identicadores 54 Directivas 55 Instrucciones 55 La instruccin NOP (ninguna operacin) Repaso de seccin 58Ejemplo: suma y resta de enteros 3.2.1 3.2.2 3.2.33.349El ciclo de ensamblado-enlazado-ejecucin Repaso de seccin 64Denicin de datos 3.4.1 3.4.2 3.4.364Tipos de datos intrnsecos 64 Instruccin de denicin de datos 64 Denicin de datos BYTE y SBYTE 66626251 8. Contenido3.4.4 3.4.5 3.4.6 3.4.7 3.4.8 3.4.9 3.4.10 3.4.11 3.4.123.5Denicin de datos WORD y SWORD 67 Denicin de datos DWORD y SDWORD 68 Denicin de datos QWORD 69 Denicin de datos TBYTE 69 Denicin de datos de nmeros reales 69 Orden Little Endian 69 Agregar variables al programa SumaResta 70 Declaracin de datos sin inicializar 71 Repaso de seccin 71Constantes simblicas 72 3.5.1 3.5.2 3.5.3 3.5.4 3.5.53.6ixDirectiva de signo de igual 72 Clculo de los tamaos de los arreglos y cadenas Directiva EQU 74 Directiva TEXTEQU 74 Repaso de seccin 7573Programacin en modo de direccionamiento real (opcional) 3.6.175Cambios bsicos 753.7Resumen del captulo3.8Ejercicios de programacin4Transferencias de datos, direccionamiento y aritmtica 794.1Instrucciones de transferencia de datos 4.1.1 4.1.2 4.1.3 4.1.4 4.1.5 4.1.6 4.1.7 4.1.8 4.1.9 4.1.104.277Introduccin 79 Tipos de operandos 80 Operandos directos de memoria 80 Instruccin MOV 81 Extensin con cero y con signo de enteros Instrucciones LAHF y SAHF 84 Instruccin XCHG 84 Operandos de desplazamiento directo 84 Programa de ejemplo (movimientos) 85 Repaso de seccin 86Suma y resta 4.2.1 4.2.2 4.2.3 4.2.4 4.2.5 4.2.6 4.2.7 4.2.8768287Instrucciones INC y DEC 87 Instruccin ADD 87 Instruccin SUB 88 Instruccin NEG 88 Implementacin de expresiones aritmticas 89 Banderas afectadas por la suma y la resta 89 Programa de ejemplo (SumaResta3) 92 Repaso de seccin 9379 9. x4.3ContenidoOperadores y directivas relacionadas con los datos 4.3.1 4.3.2 4.3.3 4.3.4 4.3.5 4.3.6 4.3.7 4.3.84.4Direccionamiento indirecto 99 4.4.1 4.4.2 4.4.3 4.4.4 4.4.54.5Operador OFFSET 94 Directiva ALIGN 95 Operador PTR 95 Operador TYPE 96 Operador LENGTHOF 97 Operador SIZEOF 97 Directiva LABEL 97 Repaso de seccin 98 Operandos indirectos 99 Arreglos 100 Operandos indexados 101 Apuntadores 102 Repaso de seccin 103Instrucciones JMP y LOOP1044.5.1 4.5.2 4.5.3 4.5.4 4.5.5106Instruccin JMP 104 Instruccin LOOP 105 Suma de un arreglo de enteros Copia de una cadena 106 Repaso de seccin 1074.6Resumen del captulo4.7Ejercicios de programacin5Procedimientos 1115.1Introduccin5.2Enlace con una biblioteca externa 5.2.1 5.2.25.3111 111Antecedentes 112 Repaso de seccin 113113Generalidades 113 Descripciones de los procedimientos individuales Programas de prueba de la biblioteca 125 Repaso de seccin 129Operaciones de la pila 5.4.1 5.4.2 5.4.35.5109La biblioteca de enlace del libro 5.3.1 5.3.2 5.3.3 5.3.45.4108129La pila en tiempo de ejecucin 129 Instrucciones PUSH y POP 131 Repaso de seccin 134Denicin y uso de los procedimientos 5.5.1 5.5.2115Directiva PROC 134 Instrucciones CALL y RET13613494 10. Contenido5.5.3 5.5.4 5.5.5 5.5.65.6xiEjemplo: suma de un arreglo de enteros 139 Diagramas de ujo 140 Almacenamiento y restauracin de registros 140 Repaso de seccin 142Diseo de programas mediante el uso de procedimientos 5.6.1 5.6.2 5.6.3Programa para sumar enteros (diseo) 143 Implementacin de la suma de enteros 145 Repaso de seccin 1475.7Resumen del captulo5.8Ejercicios de programacin6Procesamiento condicional6.1Introduccin6.2Instrucciones booleanas y de comparacin 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.2.6 6.2.7 6.2.8 6.2.96.36.4158Estructuras condicionales 158 Instruccin Jcond 158 Tipos de instrucciones de saltos condicionales 159 Aplicaciones de saltos condicionales 163 Instrucciones de prueba de bits (opcional) 167 Repaso de seccin 168169Instrucciones LOOPZ y LOOPE 169 Instrucciones LOOPNZ y LOOPNE 169 Repaso de seccin 170Estructuras condicionales 170 6.5.1 6.5.2 6.5.3 6.5.4 6.5.56.6150Instrucciones IF con estructura de bloque Expresiones compuestas 173 Ciclos WHILE 174 Seleccin controlada por tablas 177 Repaso de seccin 178170Aplicacin: mquinas de estado nito 6.6.1151Las banderas de la CPU 151 Instruccin AND 152 Instruccin OR 153 Instruccin XOR 154 Instruccin NOT 155 Instruccin TEST 155 Instruccin CMP 156 Cmo establecer y borrar banderas individuales de la CPU Repaso de seccin 157Instrucciones de saltos condicionales 6.4.1 6.4.2 6.4.36.5148150Saltos condicionales 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6147Validacin de una cadena de entrada180179157143 11. xiiContenido6.6.2 6.6.36.7Validacin de un entero con signo Repaso de seccin 183Directivas de decisin 6.7.1 6.7.2 6.7.3180184Comparaciones con signo y sin signo 185 Expresiones compuestas 186 Directivas .REPEAT y .WHILE 1886.8Resumen del captulo6.9Ejercicios de programacin7Aritmtica de enteros7.1Introduccin7.2Instrucciones de desplazamiento y rotacin 7.2.1 7.2.2 7.2.3 7.2.4 7.2.5 7.2.6 7.2.7 7.2.8 7.2.9 7.2.107.3193193 194201Desplazamiento de varias dobles palabras 201 Multiplicacin binaria 202 Visualizacin de bits binarios 202 Aislamiento de campos de datos de archivos de MS-DOS Repaso de seccin 203203204Instruccin MUL 204 Instruccin IMUL 205 Evaluacin del rendimiento de las operaciones de multiplicacin Instruccin DIV 208 Divisin de enteros con signo 209 Implementacin de expresiones aritmticas 211 Repaso de seccin 212Suma y resta extendidas 7.5.1 7.5.2 7.5.3 7.5.4194Desplazamientos lgicos y desplazamientos aritmticos Instruccin SHL 195 Instruccin SHR 196 Instrucciones SAL y SAR 196 Instruccin ROL 197 Instruccin ROR 198 Instrucciones RCL y RCR 198 Desbordamiento con signo 199 Instrucciones SHLD/SHRD 199 Repaso de seccin 200Instrucciones de multiplicacin y divisin 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.4.6 7.4.77.5190Aplicaciones de desplazamiento y rotacin 7.3.1 7.3.2 7.3.3 7.3.4 7.3.57.4189Instruccin ADC 213 Ejemplo de suma extendida Instruccin SBB 214 Repaso de seccin 215213 213207 12. Contenido7.6Aritmtica ASCII y con decimales desempaquetados 7.6.1 7.6.2 7.6.3 7.6.4 7.6.57.7xiiiInstruccin AAA Instruccin AAS Instruccin AAM Instruccin AAD Repaso de seccin216 218 218 218 219Aritmtica con decimales empaquetados 7.7.1 7.7.2 7.7.37.8Resumen del captulo7.9Ejercicios de programacin8Procedimientos avanzados8.1Introduccin8.2Marcos de pila 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.68.38.4224224 225242Clculo recursivo de una suma Clculo de un factorial 243 Repaso de seccin 245243Especicadores de lenguaje Repaso de seccin 248247INVOKE, ADDR, PROC y PROTO (opcional) 8.5.1 8.5.2 8.5.3 8.5.4 8.5.5 8.5.6 8.5.7 8.5.88.6222Directiva .MODEL 246 8.4.1 8.4.28.5221Parmetros de pila 225 Variables locales 233 Instrucciones ENTER y LEAVE 236 Directiva LOCAL 237 Procedimiento WriteStackFrame 240 Repaso de seccin 241Recursividad 8.3.1 8.3.2 8.3.3219Instruccin DAA 219 Instruccin DAS 220 Repaso de seccin 220Directiva INVOKE 248 Operador ADDR 249 Directiva PROC 250 Directiva PROTO 253 Clasicaciones de parmetros 255 Ejemplo: intercambio de dos enteros Tips de depuracin 256 Repaso de seccin 257256Creacin de programas con varios mdulos 8.6.1 8.6.2248Ocultar y exportar nombres de procedimientos Llamadas a procedimientos externos 258258258215 13. xivContenido8.6.3 8.6.4 8.6.5 8.6.6 8.6.7Uso de variables y smbolos a travs de los lmites de los mdulos 259 Ejemplo: programa SumaArreglo 260 Creacin de mdulos mediante el uso de Extern 261 Creacin de mdulos mediante el uso de INVOKE y PROTO 264 Repaso de seccin 2668.7Resumen del captulo8.8Ejercicios de programacin9Cadenas y arreglos9.1Introduccin9.2Instrucciones primitivas de cadenas 9.2.1 9.2.2 9.2.3 9.2.4 9.2.5 9.2.69.3269269 270MOVSB, MOVSW y MOVSD 271 CMPSB, CMPSW y CMPSD 272 SCASB, SCASW y SCASD 274 STOSB, STOSW y STOSD 274 LODSB, LODSW y LODSD 275 Repaso de seccin 275276Procedimiento Str_compare 276 Procedimiento Str_length 277 Procedimiento Str_copy 278 Procedimiento Str_trim 278 Procedimiento Str_ucase 279 Programa de demostracin de la biblioteca de cadenas Repaso de seccin 282280Arreglos bidimensionales 282 9.4.1 9.4.2 9.4.3 9.4.49.5268Procedimientos de cadenas seleccionados 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.3.6 9.3.79.4267Ordenamiento de las y columnas 282 Operandos base-ndice 283 Operandos base-ndice-desplazamiento 285 Repaso de seccin 285Bsqueda y ordenamiento de arreglos de enteros 9.5.1 9.5.2 9.5.3Ordenamiento de burbuja Bsqueda binaria 287 Repaso de seccin 2932869.6Resumen del captulo2949.7Ejercicios de programacin29510 Estructuras y macros 10.1 Estructuras29910.1.1 Denicin de estructuras300299285 14. Contenido10.1.2 10.1.3 10.1.4 10.1.5 10.1.6 10.1.7 10.1.8xvDeclaracin de variables de estructura 301 Referencias a variables de estructura 302 Ejemplo: mostrar la hora del sistema 305 Estructuras que contienen estructuras 307 Ejemplo: paso del borracho 307 Declaracin y uso de uniones 310 Repaso de seccin 31210.2 Macros 10.2.1 10.2.2 10.2.3 10.2.4 10.2.5 10.2.6 10.2.7313Generalidades 313 Denicin de macros 313 Invocacin de macros 314 Caractersticas adicionales de los macros 315 Uso de la biblioteca de macros del libro 318 Programa de ejemplo: envolturas 324 Repaso de seccin 32510.3 Directivas de ensamblado condicional 10.3.1 10.3.2 10.3.3 10.3.4 10.3.5 10.3.6 10.3.7 10.3.8 10.3.910.4 Denicin de bloques de repeticin 10.4.1 10.4.2 10.4.3 10.4.4 10.4.5 10.4.6326Comprobacin de argumentos faltantes 326 Inicializadores de argumentos predeterminados Expresiones booleanas 328 Directivas IF, ELSE y ENDIF 328 Las directivas IFIDN e IFIDNI 329 Ejemplo: suma de la la de una matriz 330 Operadores especiales 333 Macrofunciones 336 Repaso de seccin 337328338Directiva WHILE 338 Directiva REPEAT 338 Directiva FOR 339 Directiva FORC 340 Ejemplo: lista enlazada 340 Repaso de seccin 34210.5 Resumen del captulo34210.6 Ejercicios de programacin34311 Programacin en MS Windows 11.1 Programacin de la consola Win32 11.1.1 11.1.2 11.1.3 11.1.4 11.1.5 11.1.6Antecedentes 347 Funciones de la consola Win32 350 Visualizacin de un cuadro de mensaje Entrada de consola 354 Salida de consola 360 Lectura y escritura de archivos 361346 352346 15. xviContenido11.1.7 11.1.8 11.1.9 11.1.10 11.1.11 11.1.12 11.1.13E/S de archivos en la biblioteca Irvine32 365 Prueba de los procedimientos de E/S de archivos Manipulacin de ventanas de consola 370 Control del cursor 373 Control del color de texto 373 Funciones de hora y fecha 375 Repaso de seccin 37936711.2 Escritura de una aplicacin grca de Windows 11.2.1 11.2.2 11.2.3 11.2.4 11.2.5 11.2.6 11.2.7379Estructuras necesarias 380 La funcin MessageBox 381 El procedimiento WinMain 382 El procedimiento WinProc 382 El procedimiento ErrorHandler 383 Listado del programa 383 Repaso de seccin 38611.3 Asignacin dinmica de memoria38711.3.1 Programas PruebaMonton 390 11.3.2 Repaso de seccin 39311.4 Administracin de memoria en la familia IA-3239311.4.1 Direcciones lineales 394 11.4.2 Traduccin de pginas 397 11.4.3 Repaso de seccin 39811.5 Resumen del captulo39911.6 Ejercicios de programacin40012 Interfaz con lenguajes de alto nivel 12.1 Introduccin40240212.1.1 Convenciones generales 402 12.1.2 Repaso de seccin 40412.2 Cdigo ensamblador en lnea40412.2.1 La directiva __asm en Microsoft Visual C++ 12.2.2 Ejemplo de cifrado de archivos 406 12.2.3 Repaso de seccin 40912.3 Enlace con C/C++ en modo protegido 12.3.1 12.3.2 12.3.3 12.3.4 12.3.5 12.3.6404409Uso de lenguaje ensamblador para optimizar cdigo en C++ Llamadas a funciones en C y C++ 415 Ejemplo de tabla de multiplicacin 416 Llamadas a funciones de la biblioteca de C 419 Programa de listado de directorios 422 Repaso de seccin 42341012.4 Enlace con C/C++ en modo de direccionamiento real 12.4.1 Enlace con Borland C++424423 16. Contenidoxvii12.4.2 Ejemplo: LeerSector 425 12.4.3 Ejemplo: enteros aleatorios grandes 12.4.4 Repaso de seccin 43012.5 Resumen del captulo42843012.6 Ejercicios de programacin43113 Programacin en MS-DOS de 16 bits 13.1 MS-DOS y la IBM-PC 13.1.1 13.1.2 13.1.3 13.1.4 13.1.5 13.1.6432Organizacin de la memoria 433 Redireccin de entrada-salida 434 Interrupciones de software 435 Instruccin INT 435 Codicacin para los programas de 16 bits Repaso de seccin 43743613.2 Llamadas a funciones de MS-DOS (INT 21h) 13.2.1 13.2.2 13.2.3 13.2.4 13.2.5Funciones de salida selectas 439 Ejemplo de programa: Hola programador Funciones de entrada selectas 442 Funciones de fecha/hora 446 Repaso de seccin 44943844113.3 Servicios estndar de E/S de archivos de MS-DOS 13.3.1 13.3.2 13.3.3 13.3.4 13.3.5 13.3.6 13.3.7 13.3.8 13.3.9Crear o abrir un archivo (716Ch) 451 Cerrar manejador de archivo (3Eh) 452 Mover apuntador de archivo (42h) 452 Obtener la fecha y hora de la creacin de un archivo Procedimientos de biblioteca selectos 453 Ejemplo: leer y copiar un archivo de texto 454 Leer la cola de comandos de MS-DOS 456 Ejemplo: creacin un archivo binario 458 Repaso de seccin 46113.4 Resumen del captulo46113.5 Ejercicios del captulo45346314 Fundamentos de los discos 14.1 Sistemas de almacenamiento en disco 14.1.1 Pistas, cilindros y sectores 465 14.1.2 Particiones de disco (volmenes) 14.1.3 Repaso de seccin 46814.2 Sistemas de archivos 14.2.1 FAT12 469468466464 464449432 17. xviiiContenido14.2.2 14.2.3 14.2.4 14.2.5 14.2.6FAT16 469 FAT32 469 NTFS 470 reas principales del disco Repaso de seccin 47114.3 Directorio de disco 14.3.1 14.3.2 14.3.3 14.3.4470472Estructura de directorios de MS-DOS 473 Nombres de archivos extensos en MS Windows Tabla de asignacin de archivos (FAT) 476 Repaso de seccin 47747514.4 Lectura y escritura de sectores de disco (7305h) 14.4.1 Programa para visualizacin de sectores 14.4.2 Repaso de seccin 48214.5 Funciones de archivo a nivel de sistema 14.5.1 14.5.2 14.5.3 14.5.4 14.5.5 14.5.6 14.5.7482Obtener el espacio libre del disco (7303h) 483 Crear subdirectorio (39h) 485 Eliminar subdirectorio (3Ah) 486 Establecer el directorio actual (3Bh) 486 Obtener el directorio actual (47h) 486 Obtener y establecer atributos de archivo (7143h) Repaso de seccin 48714.6 Resumen del captulo48648714.7 Ejercicios de programacin48815 Programacin a nivel del BIOS 15.1 Introduccin49015.1.1 rea de datos del BIOS49115.2 Entrada de teclado mediante INT 16h49215.2.1 Cmo funciona el teclado 492 15.2.2 Funciones de INT 16h 493 15.2.3 Repaso de seccin 49715.3 Programacin de VIDEO con INT 10h 15.3.1 15.3.2 15.3.3 15.3.4 15.3.5477478Fundamentos 498 Control del color 499 Funciones de video de INT 10h 501 Ejemplos de procedimientos de la biblioteca Repaso de seccin 51215.4 Dibujo de grcos mediante INT 10h49851151215.4.1 Funciones de INT 10h relacionadas con pxeles 15.4.2 Programa DibujarLinea 514513490 18. Contenidoxix15.4.3 Programa de coordenadas cartesianas 515 15.4.4 Conversin de coordenadas cartesianas a coordenadas de pantalla 15.4.5 Repaso de seccin 51815.5 Grcos de mapas de memoria51915.5.1 Modo 13h: 320 x 200, 256 colores 519 15.5.2 Programa de grcos de mapas de memoria 15.5.3 Repaso de seccin 52315.6 Programacin del ratn51752052315.6.1 Funciones INT 33h para el ratn 523 15.6.2 Programa para rastrear el ratn 528 15.6.3 Repaso de seccin 53215.7 Resumen del captulo53315.8 Ejercicios del captulo53416 Programacin experta en MS-DOS 16.1 Introduccin53616.2 Denicin de segmentos 16.2.1 16.2.2 16.2.3 16.2.4 16.2.5536537Directivas de segmento simplicadas 537 Deniciones explcitas de segmentos 539 Redeniciones de segmentos 542 Combinacin de segmentos 542 Repaso de seccin 54316.3 Estructura de un programa en tiempo de ejecucin 16.3.1 16.3.2 16.3.3 16.3.4Prejo de segmento de programa Programas COM 545 Programas EXE 546 Repaso de seccin 54716.4 Manejo de interrupciones 16.4.1 16.4.2 16.4.3 16.4.4 16.4.5 16.4.6544544548Interrupciones de hardware 549 Instrucciones de control de interrupciones 550 Escritura de un manejador de interrupciones personalizado Programas TSR (Terminar y permanecer residente) 553 Aplicacin: el programa No_reinicio 554 Repaso de seccin 55755116.5 Control de hardware mediante el uso de puertos de E/S 16.5.1 Puertos de entrada-salida 558 16.5.2 Programa de sonido de PC 55816.6 Resumen del captulo560558 19. xxContenido17 Procesamiento de punto otante y codicacin de instrucciones 562 17.1 Representacin binaria de punto otante 17.1.1 17.1.2 17.1.3 17.1.4 17.1.5 17.1.6562Representacin de punto otante binaria IEEE 563 El exponente 564 Nmeros de punto otante binarios normalizados 565 Creacin de la representacin IEEE 565 Conversin de fracciones decimales a reales binarios 567 Repaso de seccin 56817.2 Unidad de punto otante56917.2.1 Pila de registros FPU 569 17.2.2 Redondeo 571 17.2.3 Excepciones de punto otante 573 17.2.4 Conjunto de instrucciones de punto otante 573 17.2.5 Instrucciones aritmticas 576 17.2.6 Comparacin de valores de punto otante 579 17.2.7 Lectura y escritura de valores de punto otante 582 17.2.8 Sincronizacin de excepciones 583 17.2.9 Ejemplos de cdigo 584 17.2.10 Aritmtica de modo mixto 585 17.2.11 Enmascaramiento y desenmascaramiento de excepciones 17.2.12 Repaso de seccin 58717.3 Codicacin de instrucciones Intel 17.3.1 17.3.2 17.3.3 17.3.4 17.3.5 17.3.6 17.3.7588Formato de instrucciones IA-32 588 Instrucciones de un solo byte 589 Movimiento inmediato a un registro 590 Instrucciones en modo de registro 591 Prejo de tamao de operando del procesador IA-32 Instrucciones en modo de memoria 592 Repaso de seccin 59517.4 Resumen del captulo59159617.5 Ejercicios de programacinApndice A Apndice B Apndice C Apndice D ndice 705586597Referencia de MASM 600 El conjunto de instrucciones IA-32 619 Interrupciones del BIOS y de MS-DOS 650 Respuestas a las preguntas de repaso 659 20. Prefacio La quinta edicin de Lenguaje ensamblador para computadoras basadas en Intel, ensea la programacin en lenguaje ensamblador y la arquitectura del procesador Intel IA-32; el texto es apropiado para los siguientes cursos universitarios: Programacin 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 programacin para estudiantes universitarios, ha evolucionado a lo largo de los ltimos 15 aos en algo mucho ms completo. Muchas universidades utilizan el libro para sus cursos introductorios de arquitectura computacional. Como una muestra de su popularidad, la cuarta edicin se tradujo al coreano, chino, francs, ruso y polaco. nfasis de los temas Esta edicin incluye temas que conducen de una manera natural hacia cursos subsiguientes en arquitectura computacional, sistemas operativos y escritura de compiladores: Concepto de mquina virtual. Operaciones booleanas elementales. Ciclo de ejecucin de instrucciones. Acceso a memoria e intercambio (handshaking). Interrupciones y sondeo. Concepto de canalizacin y superescalares. E/S basada en hardware. Representacin binaria para punto otante. Otros temas se relacionan especcamente a la arquitectura Intel IA-32: Memoria protegida y paginacin en la arquitectura IA-32. Segmentacin de memoria en modo de direccionamiento real. Manejo de interrupciones de 16 bits. Llamadas al sistema en MS-DOS y BIOS (interrupciones). Arquitectura y programacin de la Unidad de punto otante de IA-32. Codicacin de instrucciones de IA-32. Ciertos ejemplos que aparecen en el libro se pueden emplear en cursos que se imparten en la parte nal de un plan de estudios de ciencias computacionales: Algoritmos de bsqueda y ordenacin. Estructuras de lenguajes de alto nivel. Mquinas de estado nito. Ejemplos de optimizacin de cdigo.xxi 21. xxiiPrefacioMejoras en la quinta edicin En esta edicin hemos agregado una variedad de mejoras y nueva informacin, que mencionamos en la siguiente tabla, por nmero de captulo: CaptuloMejoras2Una explicacin mejorada del ciclo de ejecucin de instrucciones.5Una biblioteca de vnculos expandida, con subrutinas adicionales para escribir interfaces de usuario robustas, calcular la sincronizacin de los programas, generar enteros seudoaleatorios y analizar cadenas de enteros. La documentacin de la biblioteca tiene mejoras considerables.6Una explicacin mejorada de la codicacin de saltos condicionales y los rangos de saltos relativos.7Se agregaron las instrucciones IMUL de dos y tres operandos. Se muestran comparaciones de rendimiento para distintos enfoques, en relacin con la multiplicacin de enteros.8Se redise por completo, de manera que se expliquen primero los detalles de bajo nivel de los marcos de pila (registros de activacin), antes de presentar las directivas de alto nivel INVOKE y PROC de MASM.10Una documentacin mejorada de la biblioteca de macros del libro.11Nuevo tema: Asignacin de memoria dinmica en aplicaciones MS-Windows. Se mejor la cobertura sobre el manejo de archivos y reporte de errores en aplicaciones MS-Windows.12Una cobertura mejorada acerca de las llamadas a funciones de C y C++ desde lenguaje ensamblador.17Introduccin al conjunto de instrucciones de punto otante de la arquitectura IA-32. Tipos de datos de punto otante. Codicacin y decodicacin de instrucciones IA-32.An sigue siendo un libro de programacin Este libro contina con su misin original: ensear a los estudiantes cmo escribir y depurar programas a nivel de mquina. Nunca sustituir a un libro completo sobre arquitectura computacional, pero ofrece a los estudiantes la experiencia prctica de escribir software en un entorno que les ensee cmo funciona una computadora. Nuestra premisa es que los estudiantes retienen mejor el conocimiento cuando se combina la teora con la experiencia. En un curso de ingeniera, los estudiantes construyen prototipos; en un curso de arquitectura computacional, los estudiantes deberan escribir programas a nivel de mquina. En ambos casos, obtendrn una experiencia memorable que les brindar la conanza de trabajar en cualquier entorno orientado a SO/mquina. Modo real y modo protegido Esta edicin hace nfasis en el modo protegido de 32 bits, pero cuenta con tres captulos dedicados a la programacin en modo real. Por ejemplo, hay un captulo completo acerca de la programacin del BIOS para el teclado, la pantalla de video (incluyendo grcos) y el ratn. Otro captulo trata acerca de la programacin en MS-DOS mediante el uso de interrupciones (llamadas al sistema). Los estudiantes pueden sacar provecho de la programacin 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 slo porque evita las complicaciones relacionadas con el direccionamiento tipo segmento-desplazamiento. Los prrafos marcados en forma especial y los cuadros contextuales destacan las diferencias ocasionales entre la programacin en modo protegido y en modo real. La mayora de las diferencias se abstraen mediante las bibliotecas de vnculos paralelas del libro, para la programacin en modo real y modo protegido. Bibliotecas de vnculos Suministramos dos versiones de la biblioteca de vnculos que utilizan los estudiantes para las operaciones bsicas de entrada-salida, simulaciones, sincronizacin y dems cosas tiles. La versin de 32 bits (Irvine32.lib) se ejecuta en modo protegido y enva su salida a la consola Win32. La versin de 16 bits (Irvine16.lib) se ejecuta en modo de direccionamiento real. En el sitio Web del libro se ofrece el cdigo fuente completo para las bibliotecas. Estas bibliotecas de vnculos estn disponibles slo 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. 22. PrefacioxxiiiSoftware y ejemplos incluidos Todos los programas de ejemplo se probaron con Microsoft Macro Assembler versin 8.0. Las aplicaciones en C++ de 32 bits del captulo 12 se probaron con Microsoft Visual C++ .NET. Los programas en modo de direccionamiento real del captulo 12 (enlazados a C++) se ensamblaron con Borland Turbo Assembler (TASM). Informacin del sitio Web En el sitio Web www.pearsoneducacion.net/irvine, encontrar las actualizaciones y correcciones a este libro (en ingls) incluyendo proyectos de programacin adicionales, para que los instructores los asignen al nal de cada captulo as como cdigo en espaol. Si por alguna razn no puede acceder a este sitio, visite http://www.asmirvine.com donde encontrar informacin acerca del libro y un vnculo hacia su sitio Web actual.Objetivos generales Los siguientes objetivos de este libro estn diseados para ampliar el inters y conocimiento del estudiante sobre los temas relacionados con el lenguaje ensamblador: Arquitectura y programacin de los procesadores IA-32 de Intel. Programacin en modo de direccionamiento real y en modo protegido. Directivas, macros, operadores y estructura de programas en lenguaje ensamblador. Metodologa de programacin, para mostrar cmo usar el lenguaje ensamblador para crear herramientas de software a nivel de sistema y programas de aplicacin. Manipulacin del hardware de computadora. Interaccin entre los programas en lenguaje ensamblador, el sistema operativo y otros programas de aplicacin. Uno de nuestros objetivos es ayudar a los estudiantes a lidiar con los problemas de la programacin mediante un enfoque mental a nivel de mquina. Es importante pensar en la CPU como una herramienta interactiva, y aprender a supervisar su operacin de la forma ms directa posible. Un depurador es el mejor amigo del programador, no slo para atrapar errores, sino tambin como una herramienta educativa que nos ensea acerca de la CPU y el sistema operativo. Motivamos a los estudiantes para que busquen ms all de la supercie de los lenguajes de alto nivel, para que descubran que la mayora de los lenguajes de programacin estn diseados para ser portables y, por lo tanto, independientes de sus equipos antriones. Adems 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 referencia, como las guas a las interrupciones de MS-DOS y los nemnicos de las instrucciones, estn disponibles al nal del libro. Requisitos previos El lector deber ser capaz de programar hbilmente cuando menos en algn otro lenguaje de programacin, de preferencia en Java, C o C++. Uno de los captulos trata acerca de la interconexin con C++, por lo que sera muy til tener un compilador a la mano. He utilizado este libro en el saln de clases con estudiantes con maestras en ciencias computacionales y sistemas de informacin administrativa; tambin se ha usado en diversos cursos de ingeniera.Caractersticas Listados completos de programas En la pgina Web encontrar el cdigo fuente de los ejemplos de este libro, y en el sitio en ingls hay listados adicionales. Se suministra una biblioteca completa de vnculos, la cual contiene ms de 30 procedimientos que simplican la entrada y salida del usuario, el procesamiento numrico, 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. Lgica de programacin Dos de los captulos enfatizan la lgica booleana y la manipulacin a nivel de bits. Hicimos nuestro mejor esfuerzo por tratar de relacionar la lgica de la programacin de alto nivel con los detalles de bajo nivel de la mquina. Este enfoque ayuda a los estudiantes a crear implementaciones ms ecientes y a comprender mejor la forma en que los compiladores generan cdigo objeto. 23. xxivPrefacioConceptos de hardware y sistemas operativos Los primeros dos captulos introducen los conceptos bsicos de hardware y representacin de datos, incluyendo nmeros binarios, arquitectura de la CPU, banderas de estado y asignacin de memoria. Una investigacin acerca del hardware de computadora y una perspectiva histrica 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 programacin estructurada En el captulo 5 se inicia un nfasis en los procedimientos y la descomposicin funcional. Se proporcionan ejercicios de programacin ms complejos a los estudiantes, con lo que se ven obligados a enfocarse en el diseo, antes de empezar a escribir cdigo. Conceptos de almacenamiento en disco Los estudiantes aprenden los principios fundamentales detrs del sistema de almacenamiento en disco en los sistemas basados en MS-Windows, desde los puntos de vista de hardware y de software. Creacin de bibliotecas de vnculos Los estudiantes pueden agregar sus propios procedimientos a la biblioteca de vnculos del libro, as como crear algunas nuevas. En este libro aprendern a usar un enfoque de caja de herramientas hacia la programacin, y a escribir cdigo que sea til en ms de un programa. Macros y estructuras Existe un captulo dedicado a la creacin de estructuras, uniones y macros, que son esenciales en el lenguaje ensamblador y la programacin de sistemas. Las macros condicionales con operadores avanzados sirven para hacer las macros ms profesionales. Interfaz con lenguajes de alto nivel Hay un captulo dedicado exclusivamente a la interconexin 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 programacin en lenguajes de alto nivel. Pueden aprender a optimizar su cdigo y ver ejemplos de cmo los compiladores de C++ optimizan el cdigo. Ayudas para los instructores Todos los listados de los programas estn disponibles en la Web. Hay un banco de exmenes disponible para los instructores, as como preguntas de repaso, soluciones a los ejercicios de programacin y una presentacin en diapositivas de Microsoft Power Point para cada captulo (todo en ingls).Resumen de los captulos Los captulos 1 a 8 contienen los fundamentos bsicos del lenguaje ensamblador, y deben cubrirse en secuencia. Despus de eso, hay un buen grado de libertad. El siguiente grco de dependencia de los captulos muestra cmo los ltimos dependen del conocimiento obtenido en los anteriores. El captulo 10 se dividi en dos partes para este grco, ya que ningn otro depende del conocimiento de cmo crear macros: 15171 al 810 (macros)1391410 (estructuras)1112161. Conceptos bsicos: aplicaciones del lenguaje ensamblador, conceptos bsicos, lenguaje mquina y representacin de datos. 2. Arquitectura del procesador IA-32: diseo bsico de una microcomputadora, ciclo de ejecucin de instrucciones, arquitectura del procesador IA-32, administracin de memoria en los procesadores IA-32, componentes de una microcomputadora y el sistema de entrada-salida. 24. Prefacioxxv3. Fundamentos de lenguaje ensamblador: introduccin al lenguaje ensamblador, enlace y depuracin, denicin de constantes y variables. 4. Transferencias de datos, direccionamiento y aritmtica: transferencia simple de datos e instrucciones aritmticas, ciclo de ensamblado-enlace-ejecucin, operadores, directivas, expresiones, instrucciones JMP y LOOP, y direccionamiento indirecto. 5. Procedimientos: enlace a una biblioteca externa, descripcin de la biblioteca de vnculos del libro, operaciones de pila, denicin y uso de procedimientos, diagramas de ujo y diseo estructurado descendente (top-down). 6. Procesamiento condicional: instrucciones booleanas y de comparacin, saltos condicionales y ciclos, estructuras lgicas de alto nivel y mquinas de estado nito. 7. Aritmtica de enteros: instrucciones de rotacin y corrimiento con aplicaciones tiles, multiplicacin y divisin, suma y resta extendidas, aritmtica ASCII y con decimales empaquetados. 8. Procedimientos avanzados: pila de parmetros, variables locales, directivas avanzadas PROC e INVOKE, y recursividad. 9. Cadenas y arreglos: primitivas de cadena, manipulacin de arreglos de caracteres y enteros, arreglos bidimensionales, ordenacin y bsqueda. 10. Estructuras y macros: estructuras, macros, directivas de ensamblado condicional y denicin de bloques de repeticin. 11. Programacin en MS-Windows: conceptos de administracin de memoria en modo protegido, uso de la API de Microsoft Windows para mostrar texto y colores, y asignacin de memoria dinmica. 12. Interfaz de lenguajes de alto nivel: convenciones para paso de parmetros, cdigo de ensamblado en lnea, y enlace de mdulos en lenguaje ensamblador con programas en C y C++. 13. Programacin 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, clsteres, directorios, tablas de asignacin de archivos, manejo de los cdigos de error de MS-DOS, manipulacin de unidades y directorios. 15. Programacin a nivel de BIOS: entrada desde el teclado, video con texto y grcos, y programacin del ratn. 16. Programacin experta en MS-DOS: segmentos con diseo personalizado, estructura de un programa en tiempo de ejecucin, y manejo de interrupciones. control del hardware mediante el uso de puertos de E/S. 17. Procesamiento de punto otante y codicacin de instrucciones: representacin binaria de punto otante y aritmtica de punto otante. Aprenda a programar la Unidad de punto otante del procesador IA-32. Comprensin de la codicacin de instrucciones de mquina del procesador IA-32. Apndice A: referencia de MASM. Apndice B: el conjunto de instrucciones IA-32. Apndice C: interrupciones del BIOS y de MS-DOS. Apndice 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 vnculos 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 numricas, modos de direccionamiento, uso de registros, programacin con el depurador y nmeros binarios de punto otante. Las pginas de contenido son documentos HTML, de manera que los estudiantes e instructores pueden agregar fcilmente su propio contenido personalizado. 25. xxviPrefacioHerramientas de depuracin Tutoriales acerca del uso de Microsoft CodeView, Microsoft Visual Studio y Microsoft Windows Debugger (WinDbg). Interrupciones de BIOS y MS-DOS El apndice C contiene un breve listado de las funciones INT 10h (video), INT 16h (teclado), e INT 21h (MS-DOS) ms utilizadas. Conjunto de instrucciones El apndice B presenta la mayora de las instrucciones no privilegiadas para la familia de procesadores IA-32. Para cada instruccin describimos su efecto, mostramos su sintaxis y cules 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 gua til y amigable durante la escritura de esta quinta edicin. Karen Ettinger hizo un magnco trabajo como editora de produccin, con un seguimiento constante a los numerosos pequeos detalles . Camille Trentacoste particip como gerente editorial del libro. Quinta edicin Ofrezco mi agradecimiento especial a los siguientes profesores que impulsaron mi moral, me dieron estupendos consejos pedaggicos y examinaron minuciosamente todo el libro. Ellos han sido una enorme inuencia para el desarrollo de este libro, en algunos casos en varias ediciones: Gerald Cahill, Antelope Valley College. James Brink. Pacic Lutheran University. William Barrett, San Jose State University. Quiero agradecer tambin a Scott Blackledge y John Taylor, ambos programadores profesionales, que revisaron la mayor parte del manuscrito e identicaron numerosos errores. Varias personas revisaron captulos 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 edicin Las siguientes personas fueron de invaluable ayuda para crear la cuarta edicin: Gerald Cahill, Antelope Valley College. James Brink, Pacic 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 correccin de la cuarta edicin: 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. 26. Prefacio 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 diseo, 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.xxvii 27. CDIGOS DE EXPLORACIN DEL TECLADO Los siguientes cdigos de exploracin 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 cdigos estn en hexadecimal:TECLAS DE FUNCIN TeclaNormalCon maysculasCon CtrlCon AltF13B545E68F23C555F69F33D56606AF43E57616BF53F58626CF64059636DF7415A646EF8425B656FF9435C6670F10445D6771F118587898BF1286888A8CTeclaSolaCon tecla CtrlInicio4777Fin4F75AvPg4984RePg5176ImprPant3772Flecha izquierda4B73Flecha derecha4D74Flecha arriba488DFlecha abajo5091Ins5292O V P E F L A PSupr5393Retroceso tab0F94 gris4E90 gris4A8EE 28. 1 Conceptos bsicos 1.1 Bienvenido al lenguaje ensamblador 1.1.1 1.1.2 1.1.31.3.3 1.3.4 1.3.5 1.3.6 1.3.7Preguntas importantes por hacer Aplicaciones del lenguaje ensamblador Repaso de seccin1.2 Concepto de mquina virtual 1.2.1 1.2.21.4 Operaciones booleanasHistoria de los ensambladores de la PC Repaso de seccin1.4.11.3 Representacin de datos 1.3.1 1.3.2Tamaos de almacenamiento de enteros Enteros hexadecimales Enteros con signo Almacenamiento de caracteres Repaso de seccin1.4.2Nmeros binarios Suma binariaTablas de verdad para las funciones booleanas Repaso de seccin1.5 Resumen del captulo1.1 Bienvenido al lenguaje ensamblador Lenguaje ensamblador para computadoras basadas en microprocesadores Intel se enfoca en la programacin 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 contina con el Pentium 4. Microsoft MASM (Macro Assembler) 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 ms parecida a MASM, por lo que usted (con ayuda de su instructor) podra ensamblar y ejecutar la mayora 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 programacin ms antiguo y, de todos los lenguajes, es el que ms se asemeja al lenguaje mquina nativo. Proporciona un acceso directo al hardware de la computadora, por lo que usted debe tener una buena comprensin acerca de la arquitectura y el sistema operativo de su computadora.1 29. 2Captulo 1 Conceptos bsicosValor 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. Programacin en lenguaje ensamblador. Introduccin a la arquitectura computacional. Fundamentos de los sistemas computacionales. Programacin 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 bsicos acerca de la arquitectura computacional, el lenguaje mquina y la programacin de bajo nivel. Aprender suciente lenguaje ensamblador como para probar su conocimiento en la familia de los microprocesadores ms 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 prctica. 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 programacin de bajo nivel y del estudio de los detalles acerca del software y hardware de computadora, preste atencin a la siguiente cita de un cientco computacional lder en la industria, 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 mquina en s, fue el ms 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 informacin 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 bsico sobre programacin de computadoras. De esta forma, comprender mejor las instrucciones de programacin 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 convierte el cdigo fuente de los programas escritos en lenguajes ensamblador a lenguaje mquina. Un enlazador es un programa utilitario que combina los archivos individuales creados por un ensamblador, en un solo programa ejecutable. Hay una herramienta relacionada, llamada depurador, la cual le permite avanzar paso a paso a travs 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 programacin 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. Adems, necesitar lo siguiente: Editor: use un editor de texto o un editor para programadores, para crear los archivos de cdigo 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. 30. 1.1Bienvenido al lenguaje ensamblador3Qu tipos de programas podr crear? Este libro muestra cmo 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. Tambin 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 cmo programar en modo de direccionamiento real, y se dedican dos captulos exclusivamente a la programacin de colores y grcos en modo real. Modo protegido de 32 bits: los programas en modo protegido de 32 bits se ejecutan en todas las versiones de 32 bits de Microsoft Windows. Por lo general son ms fciles de escribir y de comprender que los programas en modo real. Qu obtengo con este libro? Adems de una buena cantidad de papel impreso podr descargar Microsoft Assembler del sitio Web de Microsoft. En el sitio Web www.asmirvine.com podr consultar los detalles acerca de cmo obtener el ensamblador. En el sitio Web del libro encontrar lo siguiente: Archivo de ayuda en lnea, en donde se detallan los procedimientos de la biblioteca del libro y las estructuras esenciales de la API de Windows, por Gerald Cahill. Libro de trabajo de lenguaje ensamblador, una coleccin de tutoriales escritos por el autor. Bibliotecas de vnculos Irvine32 e Irvine16, para la programacin en modo de direccionamiento real y modo protegido, con cdigo fuente completo. Programas de ejemplo, con todo el cdigo fuente del libro. Correcciones al libro y a los programas de ejemplo. Esperamos que no sean demasiadas! Tutoriales acerca de cmo instalar el ensamblador. Artculos sobre temas avanzados que no se incluyeron en el libro impreso por falta de espacio. Grupo de discusin, que cuenta con ms de 500 miembros. Qu voy a aprender? Este libro le ofrece mucha informacin sobre la arquitectura computacional, la programacin y las ciencias computacionales. He aqu lo que ver: Los principios bsicos de la arquitectura computacional, aplicados en la familia de procesadores IA-32 de Intel. La lgica booleana bsica y su aplicacin en relacin con la programacin 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 cdigo de mquina nativo. La manera en que los lenguajes de alto nivel implementan expresiones aritmticas, ciclos y estructuras lgicas a nivel de mquina. La representacin de los datos, incluyendo enteros con y sin signo, nmeros reales y datos tipo carcter. A depurar programas a nivel de mquina. 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 aplicacin se comunican con el sistema operativo de la computadora, a travs de manejadores de interrupciones, llamadas al sistema y reas comunes de memoria. A interconectar el cdigo en lenguaje ensamblador con programas en C++. A crear programas de aplicacin en lenguaje ensamblador. Cmo se relaciona el lenguaje ensamblador con el lenguaje mquina? El lenguaje mquina es un lenguaje numrico que un procesador de computadora (la CPU) entiende de manera especca. Los procesadores compatibles con IA-32 entienden un lenguaje mquina comn. El lenguaje ensamblador consiste en instrucciones escritas con nemnicos cortos, tales como ADD, MOV, SUB y CALL. El lenguaje ensamblador 31. 4Captulo 1 Conceptos bsicostiene una relacin de uno a uno con el lenguaje mquina: cada una de las instrucciones en lenguaje ensamblador corresponden a una sola instruccin en lenguaje mquina. Cmo se relacionan C++ y Java con el lenguaje ensamblador? Los lenguajes de alto nivel, tales como C++ y Java, tienen una relacin de uno a varios con el lenguaje ensamblador y el lenguaje mquina. Una sola instruccin en C++ se expande en varias instrucciones en lenguaje ensamblador o lenguaje mquina. Podemos mostrar cmo las instrucciones en C++ se expanden en cdigo mquina. La mayora de las personas no puede leer cdigo de mquina puro, por lo que utilizaremos su pariente ms cercano, el lenguaje ensamblador. La siguiente instruccin en C++ lleva a cabo dos operaciones aritmticas y asigna el resultado a una variable. Suponga que X y Y son enteros: int Y; int X = (Y + 4) * 3;A continuacin se muestra la traduccin de esta instruccin a lenguaje ensamblador. La traduccin requiere varias instrucciones, ya que el lenguaje ensamblador funciona a un nivel detallado: mov add mov imul moveax,Y eax,4 ebx,3 ebx X,eax; ; ; ; ;mueve Y al registro EAX suma 4 al registro EAX mueve el 3 al registro EBX multiplica EAX por EBX 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 armar que C++ es superior al lenguaje ensamblador o viceversa, sino mostrar su relacin. Nosotros? Quines somos? A lo largo de este libro ver referencias constantes a nosotros. A menudo, los autores de libros de texto y artculos acadmicos utilizan nosotros como una referencia formal a ellos mismos. Esto se debe a que parece tan informal decir, Ahora le mostrar cmo 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 distincin entre los lenguajes de alto nivel y el lenguaje ensamblador est relacionada con la portabilidad. Se dice que un lenguaje cuyos programas de cdigo 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 especcas a funciones de biblioteca que existan en un solo sistema operativo. Una importante caracterstica del lenguaje Java es que los programas compilados se ejecutan en casi cualquier sistema computacional. El lenguaje ensamblador no es portable, ya que est diseado para una familia de procesadores especca. 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 directamente con la arquitectura de la computadora, o pueden traducirse durante la ejecucin mediante un programa dentro del procesador, al cual se le conoce como intrprete de microcdigo. Por qu aprender lenguaje ensamblador? Por qu no slo leer un buen libro acerca del hardware y la arquitectura de las computadoras, y evitar aprender a programar en lenguaje ensamblador? Si estudia ingeniera computacional, es muy probable que le pidan que escriba programas embebidos. stos son programas cortos que se almacenan en una pequea cantidad de memoria, en dispositivos de un solo propsito tales como los telfonos, los sistemas del combustible y la ignicin del automvil, los sistemas de control de aire acondicionado, los sistemas de seguridad, los instrumentos para la adquisicin de datos, 32. 1.1Bienvenido al lenguaje ensamblador5las tarjetas de video, las tarjetas de sonido, los discos duros, los mdems 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 precisin en la sincronizacin y en las respuestas. Los lenguajes de alto nivel no proporcionan a los programadores un control exacto sobre el cdigo mquina generado por los compiladores. El lenguaje ensamblador nos permite especicar con precisin el cdigo ejecutable de un programa. Las consolas de videojuegos requieren que su software est altamente optimizado para que su tamao de cdigo sea pequeo y se ejecute con la mayor rapidez posible. Los programadores de videojuegos son expertos en la escritura de cdigo que aproveche al mximo las caractersticas 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 cdigo puede optimizarse en forma manual para obtener la mxima velocidad. El lenguaje ensamblador nos ayuda a obtener una comprensin general en cuanto a la interaccin entre el hardware de computadora, los sistemas operativos y los programas de aplicacin. Mediante el uso de lenguaje ensamblador, usted puede aplicar y probar la informacin terica que recibe en los cursos de arquitectura computacional y sistemas operativos. En ocasiones, los programadores de aplicaciones encuentran que las limitaciones en los lenguajes de alto nivel les impiden realizar tareas de bajo nivel con eciencia, como la manipulacin 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 controladores de dispositivos son programas que traducen los comandos generales del sistema operativo en referencias especcas 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.Hay reglas en el lenguaje ensamblador? La mayora de las reglas en el lenguaje ensamblador se basan en las limitaciones fsicas del procesador de destino y su lenguaje mquina. Por ejemplo, la CPU requiere que los dos operandos de una instruccin sean del mismo tamao. El lenguaje ensamblador tiene menos reglas que C++ o Java, ya que estos dos lenguajes de alto nivel utilizan reglas de sintaxis para reducir los errores de lgica involuntarios, a expensas del acceso a los datos de bajo nivel. Los programadores de lenguaje ensamblador pueden evadir con facilidad las restricciones caractersticas de los lenguajes de alto nivel. Por ejemplo, Java no permite el acceso a direcciones de memoria especcas. Para evadir esta restriccin podemos hacer una llamada a una subrutina en C que utilice clases de la JNI (Interfaz nativa de Java), pero puede ser complicado mantener el programa resultante. Por otro lado, el lenguaje ensamblador puede acceder a cualquier direccin de memoria. El precio por dicha libertad es alto: los programadores de lenguaje ensamblador invierten mucho tiempo en el proceso de la depuracin!1.1.2 Aplicaciones del lenguaje ensamblador En los primeros das de la programacin, la mayora de las aplicaciones se escriban parcial o totalmente en lenguaje ensamblador. Tenan que ajustarse en una pequea rea de memoria y se ejecutaban de la manera ms eciente posible en los procesadores lentos. A medida que la memoria aument su capacidad y los procesadores su velocidad, los programas se hicieron ms complejos. Los programadores cambiaron a lenguajes de alto nivel tales como C, FORTRAN y COBOL, los cuales contenan una cierta capacidad de estructuracin. Los lenguajes de programacin orientados a objetos ms recientes, tales como C++, C# y Java, han hecho posible la escritura de programas complejos que contienen millones de lneas de cdigo. Es raro ver programas de aplicacin extensos codicados por completo en lenguaje ensamblador, ya que se requerira mucho tiempo para escribirlos y darles mantenimiento. En vez de ello, el lenguaje ensamblador se utiliza para optimizar ciertas secciones de los programas de aplicacin en relacin con la velocidad y para tener acceso al hardware de la computadora. La tabla 1-1 compara la capacidad de adaptacin del lenguaje de ensamblador con los lenguajes de alto nivel, en relacin con varios tipos de aplicaciones. 33. 6Captulo 1 Conceptos bsicosTabla 1-1Comparacin entre el lenguaje ensamblador y los lenguajes de alto nivel.Tipo de aplicacinLenguajes de alto nivelLenguaje ensambladorSoftware de aplicacin comercial, escrito para una sola plataforma de tamao mediano a grandeLas estructuras formales facilitan la organizacin y el mantenimiento de secciones extensas de cdigoTiene una estructura formal mnima, por lo que los programadores con distintos niveles de experiencia deben imponer una. Esto produce dicultades en cuanto al mantenimiento del cdigo existenteControlador de dispositivo de hardwareTal vez el lenguaje no proporciona un acceso directo al hardware. An si lo hace, pueden requerirse tcnicas de codicacin complicadas, lo cual diculta el mantenimientoEl acceso al hardware es directo y simple. Es fcil de mantener cuando los programas son cortos y estn bien documentadosAplicacin comercial escrita para varias plataformas (distintos sistemas operativos)Por lo general es portable. El cdigo fuente puede recompilarse en cada sistema operativo de destino, con mnimas modicacionesDebe volver a codicarse por separado para cada plataforma, usando un ensamblador con una sintaxis diferente. Es difcil de mantenerSistemas embebidos y juegos de computadora que requieren de un acceso directo a la memoriaProduce demasiado cdigo ejecutable, y tal vez no se ejecute con ecienciaIdeal, ya que el cdigo ejecutable es pequeo y se ejecuta con rapidezC++ 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 mayora de los compiladores de C++ tienen la habilidad de generar cdigo fuente en lenguaje ensamblador, que el programador puede personalizar y renar antes de ensamblarlo en cdigo ejecutable.1.1.3 Repaso de seccin 1. Cmo funcionan los ensambladores y los enlazadores en conjunto? 2. De qu forma el estudio del lenguaje ensamblador puede mejorar su comprensin de los sistemas operativos? 3. Qu signica una relacin de uno a varios, cuando se compara un lenguaje de alto nivel con el lenguaje mquina? 4. Explique el concepto de portabilidad, empleado en los lenguajes de programacin. 5. El lenguaje ensamblador para la familia de procesadores Intel 80x86 es el mismo que para los sistemas computacionales tales como Vax o Motorola 68x00? 6. D un ejemplo de una aplicacin de sistemas embebidos. 7. Qu es un controlador de dispositivo? 8. Cree que la comprobacin de tipos en variables apuntador es ms fuerte (estricta) en lenguaje ensamblador que en C++? 9. Mencione dos tipos de aplicaciones que se adaptan mejor al lenguaje ensamblador que a un lenguaje de alto nivel. 10. Por qu un lenguaje de alto nivel no sera una herramienta ideal para escribir un programa que acceda en forma directa a una marca especca de impresora? 11. En general, por qu no se utiliza el lenguaje ensamblador cuando se escriben programas de aplicacin extensos? 12. Reto: traduzca la siguiente expresin en C++ a lenguaje ensamblador, usando como gua el ejemplo que presentamos en una seccin anterior de este captulo: X (Y * 4) 3. 34. 1.2Concepto de mquina virtual71.2 Concepto de mquina virtual Una manera bastante efectiva de explicar la relacin entre el hardware y el software es el concepto de mquina virtual. Nuestra explicacin de este modelo se deriva del libro de Andrew Tanenbaum, Structured Computer Organization.2 Para explicar este concepto, empecemos con la funcin ms bsica de una computadora: la ejecucin de programas. Por lo general, una computadora ejecuta programas escritos en su lenguaje mquina nativo. Cada instruccin en este lenguaje es lo bastante simple como para ejecutarse usando una cantidad relativamente pequea de circuitos electrnicos. Por cuestin de simplicacin, llamaremos a este lenguaje L0. Los programadores tendran muchas dicultades al escribir programas en L0, debido a que est en extremo detallado y consta slo de nmeros. Si se construyera un nuevo lenguaje L1 que fuera ms fcil de usar, los programas podran escribirse en L1. Hay dos formas de lograr esto: Interpretacin: a medida que se ejecutara el programa en L1, cada una de sus instrucciones podran decodicarse y ejecutarse mediante un programa escrito en lenguaje L0. El programa en L1 empezara a ejecutarse de inmediato, pero cada instruccin tendra que decodicarse para poder ejecutarla. Traduccin: todo el programa en L1 podra convertirse en un programa en L0, mediante un programa en L0 diseado en especco para este n. Despus, el programa resultante en L0 podra ejecutarse directamente en el hardware de la computadora. Mquinas Virtuales En vez de utilizar slo lenguajes, es ms fcil pensar en trminos de una computadora hipottica, o mquina virtual, en cada nivel. La mquina virtual VM1, como la llamaremos, puede ejecutar comandos escritos en lenguaje L1. La mquina virtual VM0 puede ejecutar comandos escritos en lenguaje L0:Cada mquina virtual puede construirse ya sea con hardware o software. Las personas pueden escribir programas para la mquina virtual VM1 y, si es prctico 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 mquina VM0. La mquina VM1 no puede ser completamente distinta de VM0, ya que el proceso de traduccin o interpretacin consumira demasiado tiempo. Qu pasara si el lenguaje que soporta la mquina VM1 no es lo suciente amigable para el programador, como para poder usarlo en aplicaciones tiles? Entonces, podra disearse otra mquina virtual, VM2, que pudiera comprenderse con mayor facilidad. Este proceso puede repetirse hasta que pueda disearse una mquina virtual VMn que soporte un lenguaje poderoso y fcil de usar. El lenguaje de programacin Java se basa en el concepto de mquina virtual. Un programa escrito en el lenguaje Java se traduce mediante un compilador de Java, que lo convierte en cdigo byte de Java. Este cdigo es un lenguaje de bajo nivel que se ejecuta con rapidez en tiempo de ejecucin mediante un programa conocido como mquina 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. Mquinas especcas 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 gura 1-1. El hardware lgico digital de una computadora representa a la mquina Nivel 0, y el Nivel 1 se implementa a travs de un intrprete 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 nmeros binarios. 35. 8Captulo 1 Conceptos bsicosMicroarquitectura (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 especcos son un secreto propietario. Podran requerirse hasta tres o cuatro instrucciones en microcdigo para llevar a cabo una instruccin primitiva, tal como obtener un nmero de memoria e incrementarlo en 1. Figura 11Los niveles del 0 al 5 de una mquina virtual.Arquitectura del conjunto de instrucciones (Nivel 2) Los fabricantes de chips de computadora disean en el procesador un conjunto de instrucciones para llevar a cabo las operaciones bsicas, tales como mover, sumar o multiplicar. Este conjunto de instrucciones se conoce tambin como lenguaje mquina convencional, o simplemente lenguaje mquina. Cada instruccin en lenguaje mquina se ejecuta mediante varias microinstrucciones. Sistema operativo (Nivel 3) Cuando las computadoras evolucionaron, se crearon mquinas virtuales adicionales, para que los programadores fueran ms productivos. Una mquina de Nivel 3 comprende comandos interactivos que introducen los usuarios para cargar y ejecutar programas, mostrar directorios, etctera. A esto se le conoce como el sistema operativo de la computadora. El software de sistema operativo se traduce en cdigo mquina, el cual se ejecuta en una mquina de Nivel 2.3 Lenguaje ensamblador (Nivel 4) Por encima del sistema operativo, los lenguajes de programacin proporcionan las capas de traduccin para hacer que el desarrollo de software a gran escala sea prctico. El lenguaje ensamblador, que aparece en el Nivel 4, utiliza nemnicos cortos tales como ADD, SUB y MOV, los cuales se traducen fcilmente 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 mquina, antes de que empiecen a ejecutarse. Lenguajes de alto nivel (Nivel 5) En el Nivel 5 estn los lenguajes de programacin 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 cdigo de Nivel 4. Este cdigo se ensambla en lenguaje mquina convencional. 36. 1.3Representacin de datos9La arquitectura del procesador Intel IA-32 soporta varias mquinas virtuales. Su modo de operacin 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 mquina virtual-86 al mismo tiempo, por lo que los programas independientes que se ejecutan en cada mquina virtual parecen tener el completo control de su equipo antrin.1.2.1 Historia de los ensambladores de la PC No hay un lenguaje ensamblador estndar ocial para los procesadores Intel. Lo que ha surgido a travs de los aos es un estndar de facto, establecido por el popular ensamblador MASM Versin 5 de Microsoft. Borland International se estableci a s misma como una de las principales competidoras a principios de la dcada de 1990 con TASM (Turbo Assembler). TASM agreg muchas mejoras y produjo lo que se conoce como Modo ideal; adems, Borland proporcion tambin un modo de compatibilidad con MASM, que coincida con la sintaxis de MASM Versin 5. Microsoft lanz a MASM 6.0 en 1992, la cual fue una actualizacin importante con muchas nuevas caractersticas. Desde entonces, Microsoft ha lanzado una variedad de actualizaciones para estar a la par con el cada vez ms grande conjunto de instrucciones de la familia Pentium. La sintaxis del ensamblador MASM no ha sufrido cambios fundamentales desde la versin 6.0. Borland lanz a TASM 5.0 de 32 bits en 1996, que coincide con la sintaxis actual de MASM. Hay otros ensambladores populares, todos los cuales varan con relacin a la sintaxis de MASM, en mayor o menor grado. Algunos de ellos son: NASM (Netwide Assembler) para Windows y Linux; MASM32, un intrprete creado por encima de MASM; Asm86; y el ensamblador de GNU, distribuido por la Fundacin de software libre.1.2.2 Repaso de seccin 1. Describa, en sus propias palabras, el concepto de mquina virtual. 2. Por qu los programadores no escriben programas en lenguaje mquina? 3. (Verdadero/Falso): cuando se ejecuta un programa interpretado escrito en lenguaje L1, cada una de sus instrucciones se decodica y se ejecuta mediante un programa escrito en lenguaje L0. 4. Explique la tcnica de traduccin al tratar con lenguajes en diferentes niveles de mquina virtual. 5. Cmo es que la arquitectura del procesador Intel IA-32 contiene un ejemplo de una mquina virtual? 6. Qu software permite que los programas compilados en Java se ejecuten en casi cualquier computadora? 7. Mencione (de menor a mayor) los seis niveles de mquina virtual que sealamos en esta seccin. 8. Por qu los programadores no escriben aplicaciones en microcdigo? 9. En qu nivel de la mquina virtual, que se muestra en la gura 1-1, se utiliza el lenguaje mquina convencional? 10. En qu otro(s) nivel(es) se traducen en instrucciones las instrucciones en el nivel de lenguaje ensamblador de una mquina virtual?1.3 Representacin de datos Antes de hablar sobre la organizacin de una computadora y del lenguaje ensamblador, vamos a aclarar los conceptos de almacenamiento binario, hexadecimal, decimal y basado en caracteres. Los programadores en lenguaje ensamblador trabajan con los datos en el nivel fsico, por lo que deben ser expertos a la hora de examinar la memoria y los registros. A menudo se utilizan los nmeros binarios para describir el contenido de la memoria de la computadora; otras veces se utilizan nmeros decimales y hexadecimales. Los programadores desarrollan cierta uidez con los formatos numricos, y pueden traducir con rapidez nmeros de un formato a otro. Cada formato (o sistema) de numeracin tiene una base, o nmero mximo de smbolos que pueden asignarse a un solo dgito. La tabla 1-2 muestra los posibles dgitos para los sistemas de numeracin que se utilizan con ms frecuencia en la literatura computacional. En la ltima la de la tabla, los nmeros hexadecimales utilizan los dgitos del 0 al 9, y continan con las letras de la A a la F para representar los valores decimales del 10 al 15. Es bastante comn utilizar nmeros hexadecimales cuando se muestra el contenido de la memoria de la computadora y las instrucciones a nivel de mquina. 37. 10Captulo 1 Conceptos bsicosTabla 1-2Los dgitos binarios, octales, decimales y hexadecimales.SistemaBaseDgitos posiblesBinario201Octal801234567Decimal100123456789Hexadecimal160123456789ABCDEF1.3.1 Nmeros binarios Una computadora almacena instrucciones y datos en memoria, en forma de colecciones de cargas electrnicas. Para representar a estas entidades con nmeros, se requiere un sistema que se adapte a los conceptos de encendido y apagado, o de verdadero y falso. Los nmeros binarios son nmeros en base 2, en donde cada dgito binario (llamado bit) es un 0 o un 1. Los bits se enumeran empezando desde cero en la parte derecha, y se incrementan hacia la izquierda. El bit de ms a la izquierda se conoce como bit ms signicativo (MSB), y el bit de ms a la derecha es el bit menos signicativo (LSB). En la siguiente gura se muestran los nmeros de los bits MSB y LSB de un nmero binario de 16 dgitos: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 nmeros reales en binario mediante el uso de esquemas de codicacin especiales pero dejaremos ese tema para un captulo posterior. Por ahora, vamos a empezar con los enteros binarios sin signo.Enteros binarios sin signo Empezando con el bit menos signicativo, cada bit en un entero binario sin signo representa una potencia incremental de 2. La siguiente gura contiene un nmero binario de 8 bits que muestra cmo se incrementan las potencias de dos, de derecha a izquierda:La tabla 1-3 presenta los valores decimales desde 20 hasta 215. Tabla 1-3 2n 20 21Valores de las posiciones de los bits binarios. Valor decimal2nValor decimal128256 51222922421010242382112048162124096 819224 25322132664214163842712821532768 38. 1.3Representacin de datos11Traduccin de enteros binarios sin signo a decimal La notacin posicional ponderada representa una manera conveniente para calcular el valor decimal de un entero binario sin signo que tiene n dgitos: dec (Dn1 2n1) (Dn2 2n2) (D1 21) (D0 20) D indica un dgito binario. Por ejemplo, el nmero binario 00001001 es igual a 9. Para calcular este valor, eliminamos los trminos iguales a cero: (1 23) (1 20) 9 La siguiente gura muestra el mismo clculo:Traduccin de enteros decimales sin signo a binario Para traducir un entero decimal sin signo a binario, divida en forma repetida el entero entre 2 y guarde cada residuo como un dgito binario. La siguiente tabla muestra los pasos requeridos para traducir el 37 decimal a binario. El resto de los dgitos, empezando desde la la superior, son los dgitos binarios D0, D1, D2, D3, D4 y D5: DivisinCocienteResiduo37 / 218118 / 2909/2414/2202/2101/201Al recolectar en orden inverso los dgitos binarios en la columna de los residuos se produce el nmero binario 100101. Como el almacenamiento en las computadoras Intel siempre consiste en nmeros binarios cuyas longitudes sean mltiplos de 8, rellenamos las posiciones de los dos dgitos a la izquierda con ceros, lo cual produce el nmero binario 00100101.1.3.2 Suma binaria Al sumar dos enteros binarios hay que proceder bit por bit, empezando con el par de bits de menor orden (a la derecha) y luego se suma cada par subsiguiente de bits. Hay cuatro maneras de sumar dos dgitos binarios, como se muestra aqu: 0000111011 1 10 39. 12Captulo 1 Conceptos bsicosAl sumar 1 y 1, el resultado es un 10 binario (considrelo como el valor decimal 2). El dgito adicional genera un acarreo hacia la posicin del siguiente bit ms alto. En la siguiente gura, sumamos los nmeros binarios 00000100 y 00000111:Empezando con el menor bit en cada nmero (posicin de bit 0), sumamos 0 1, lo cual produce un 1 en la la inferior. Lo mismo ocurre en el siguiente bit ms alto (posicin 1). En la posicin de bit 2, sumamos 1 1, lo cual genera una suma de cero y un acarreo de 1. En la posicin de bit 3, sumamos el bit de acarreo a 0 0, lo cual produce un 1. El resto de los bits son ceros. Para vericar la suma, realice la suma de los equivalentes decimales que se muestran en la parte derecha de la gura (4 7 11).1.3.3 Tamaos de almacenamiento de enteros La unidad bsica de almacenamiento para todos los datos en una computadora basada en IA-32 es un byte, que contiene 8 bits. Otros tamaos de almacenamiento son: palabra (2 bytes), doble palabra (4 bytes), y palabra cudruple (8 bytes). En la siguiente gura se muestra el nmero de bits para cada tamao:La tabla 1-4 muestra el rango de posibles valores para cada tipo de entero sin signo. Tabla 1-4Rangos de enteros sin signo.Tipo de almacenamientoRango (Bajo-Alto)Potencias de 2Byte sin signo0 a 2550 a (28 1)Palabra sin signo0 a 65,5350 a (216 1)Doble palabra sin signo0 a 4,294,967,2950 a (232 1)Palabra cudruple sin signo0 a 18,446,744,073,709,551,6150 a (264 1)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. 40. 1.3 Representacin de datos13Un terabyte (TB) es igual a 240, o 10244, o 1,099,511,627,776 bytes. Un petabyte es igual a 250, o 1,125,899,906,842,624 bytes. Un exabyte es igual a 260, o 1,152,921,504,606,846,976 bytes. Un zettabyte es igual a 270 bytes. Un yottabyte es igual a 280 bytes.1.3.4 Enteros hexadecimales Los nmeros binarios grandes son difciles de leer, por lo que los dgitos hexadecimales ofrecen una manera conveniente de representar los datos binarios. Cada dgito en un entero hexadecimal representa a cuatro dgitos binarios, y dos dgitos hexadecimales juntos representan a un byte. Un solo dgito hexadecimal representa un nmero decimal del 0 al 15, por lo que las letras A a la F representan los valores decimales en el rango del 10 al 15. La tabla 1-5 muestra cmo cada secuencia de cuatro bits binarios se traduce a un valor decimal o hexadecimal. Tabla 1-5Equivalentes en binario, decimal y hexadecimal.BinarioDecimalHexadecimalBinarioDecimalHexadecimal000000100088000111100199001022101010A001133101111B010044110012C010155110113D011066111014E011177111115FEl siguiente ejemplo muestra cmo el nmero binario 000101101010011110010100 es equivalente al nmero hexadecimal 16A794: 16A794000101101010011110010100Conversin de hexadecimal sin signo a decimal En hexadecimal, la posicin de cada dgito representa a una potencia de 16. Esto es til cuando se calcula el valor decimal de un entero hexadecimal. Suponga que numeramos con subndices los dgitos en un entero hexadecimal de cuatro dgitos: D3D2D1D0. La siguiente frmula calcula el valor decimal del nmero: dec (D3 163) (D2 162) (D1 161) (D0 160) Esta frmula puede generalizarse para cualquier nmero hexadecimal de n dgitos: dec (Dn1 16n1) (Dn2 16n2) (D1 161) (D0 160) 41. 14Captulo 1 Conceptos bsicosPor ejemplo, el nmero hexadecimal 1234 es igual a (1 163) (2 162) (3 161) (4 160), que viene siendo el nmero decimal 4660. De manera similar, el nmero hexadecimal 3BA4 es igual a (3 163) (11 162) (10 161) (4 160), que viene siendo el nmero decimal 15,268. La siguiente gura muestra este ltimo clculo:La tabla 1-6 presenta las potencias de 16, de 160 hasta 167. Tabla 1-6Potencias de 16 en decimal.16n 160Valor decimal116465,536161651,048,57625616616,777,2164096167268,435,456161 162 16316nValor decimalConversin de decimal sin signo a hexadecimal Para convertir un entero decimal sin signo a hexadecimal, divida repetidas veces el valor decimal entre 16 y conserve el residuo de cada divisin como un dgito hexadecimal. Por ejemplo, la siguiente tabla presenta los pasos para convertir el nmero 422 decimal a hexadecimal: DivisinCocienteResiduo422 / 1626626 / 161A1 / 1601Si recolectamos los dgitos de la columna del residuo en orden inverso, la representacin hexadecimal es 1A6. En la seccin 1.3.1 utilizamos el mismo algoritmo para los nmeros binarios.1.3.5 Enteros con signo Los enteros binarios con signo son positivos o negativos. En las computadoras basadas en Intel, el bit ms signicativo (MSB) indica el signo: 0 es positivo y 1 es negativo. La siguiente gura muestra ejemplos de enteros negativos y positivos de 8 bits: 42. 1.3Representacin de datos15Notacin de complemento a dos Los enteros negativos utilizan la representacin de complemento a dos, en base al principio matemtico que establece que el complemento a dos de un entero es su inverso aditivo. (Si suma un nmero a su inverso aditivo, el resultado de la suma es cero). La representacin en complemento a dos es til para los diseadores de procesadores, ya que elimina la necesidad de tener circuitos digitales separados para manejar tanto la suma como la resta. Por ejemplo, si presentamos al procesador la expresin A B, tan slo necesita convertirla en una expresin de suma: A (B). Para formar el complemento a dos de un entero binario, se invierten (complementan) sus bits y se le suma 1. Por ejemplo, si utilizamos el valor binario de 8 bits 00000001, su complemento a dos resulta ser 11111111, como puede verse a continuacin: Valor inicial00000001Paso 1: invertir los bits11111110Paso 2: sumar 1 al valor del paso 1 Suma: representacin en complemento a dos11111110 +00000001 1111111111111111 es la representacin en complemento a dos de 1. La operacin de complemento a dos es reversible, por lo que el complemento a dos de 11111111 es 00000001. Complemento a dos de hexadecimal Para formar el complemento a dos de un entero hexadecimal, invierta todos los bits y sume 1. Una manera sencilla de invertir los bits de un dgito hexadecimal es restar 15 al dgito. He aqu varios ejemplos de enteros hexadecimales convertidos a sus complementos a dos: 6A3D 95C3 21F0 DE10--> --> --> -->95C2 6A3C DE0F 21EF+ + + +1 1 1 1--> --> --> -->95C3 6A3D DE10 21F0Conversin de binario con signo a decimal Para calcular el equivalente decimal de un entero binario con signo, realice una de las siguientes opciones: Si el bit ms alto es un 1, el nmero est almacenado en notacin de complemento a dos. Forme su complemento a dos una segunda vez para obtener su equivalente positivo. Despus convierta este nuevo nmero en decimal, como si fuera un entero binario sin signo. Si el bit ms alto es un 0, puede convertirlo en decimal como si fuera un entero binario sin signo. Por ejemplo, el nmero binario con signo 11110000 tiene un 1 en el bit ms alto, lo cual indica que es un entero negativo. Primero hay que formar su complemento a dos, y despus el resultado se convierte en decimal. He aqu los pasos en el proceso: Valor inicial11110000Paso 1: invertir los bits00001111Paso 2: sumar 1 al valor del paso 1 Paso 3: formar el complemento a dos Paso 4: convertir en decimal00001111 1+00010000 16Como el entero original (11110000) era negativo, inferimos que su valor decimal era de 16. 43. 16Captulo 1 Conceptos bsicosConversin de entero decimal a binario Para determinar la representacin binaria de un entero decimal con signo, haga lo siguiente: 1. Convierta el valor absoluto del entero decimal a binario. 2. Si el entero decimal original era negativo, forme el complemento a dos del nmero binario del paso anterior. Por ejemplo, el nmero d