Programación Avanzada En Lenguaje Ensamblador
Total Page:16
File Type:pdf, Size:1020Kb
Programación Avanzada en Lenguaje Ensamblador Ramón Medina Reservados todos los derechos. Ni la totalidad ni parte de este libro puede reproducirse o transmitirse por ningún procedimiento electrónico o mecánico, incluyendo fotocopia, grabación magnética o cualquier medio de almacenamiento de información o sistema de recuperación, sin permiso escrito del autor. El autor de este libro ha hecho el máximo esfuerzo posible para la obtención de un texto y unos programas en correcto funcionamiento y sin errores. Las teorías y programas presentados en el libro han sido desarrollados y comprobados individualmente para determinar su efectividad. Aun así, el autor no asume ninguna responsabilidad por daños producidos por, o como consecuencia de la utilización o aplicación de las ideas o programas presentadas en este libro. Copyright (C) 1992, Ramón Medina Dedicatoria A mis cuatro más grandes amores: DIOS, Marilys, Luis Alejandro y Cristian Adrián. ii Prefacio Los programadores se pasan la vida argumentando acerca de cual es el mejor lenguaje. Si se le pregunta a un programador de C acerca del PASCAL y dirá que este nunca será lo suficientemente flexible. Si a un partidario del PASCAL se le comenta acerca de la facilidad del BASIC, seguramente traerá a colación los GOTO. Y si a un fanático del FORTH, se le dice que el suyo es un lenguaje raro y obscuro, poco adecuado para trabajos serios, probablemente sea la última vez que le dirija la palabra. Supongamos, que en lugar de programadores, tenemos a un grupo de chef de cocina, discutiendo acerca de si las recetas deben ser escritas en francés, inglés o español. Por supuesto que resulta tonto. El sabor de la comida será el mismo independientemente del idioma en que haya sido escrita la receta. Lo mismo ocurre en programación. Todos los lenguajes de alto nivel, debe convertir sus instrucciones en código de máquina para poder ser ejecutado por el microprocesador instalado en la computadora. Como podemos ver, todos los lenguajes de programación hablan el mismo idioma. Por todo esto, tiene sentido aprender a programar en lenguaje ensamblador, sea cual sea el lenguaje de alto nivel de su preferencia, ya que es el único lenguaje de programación que le permite hablar en el idioma nativo del microprocesador y explotar todo su potencial. En los próximos capítulos trataremos de explicar desde los conceptos básicos hasta tópicos avanzados de la programación en lenguaje ensamblador, desde los sistemas de numeración y arquitectura interna de un computador, hasta librerías de aplicaciones y programas residentes. Para los principiantes, añado lo siguiente: Si alguna vez ha oído que el lenguaje ensamblador es difícil, no lo crea. Con las características y herramientas de programación disponibles hoy en día, en poco tiempo se sorprenderá desarrollando aplicaciones en este lenguaje con toda libertad. iii Contenido Capítulo I: Conceptos Básicos, 1. Sistemas de Numeración, 1. Cambios de base de numeración, 2. Estructura de la memoria del computador, 3. Bit, 3. Byte, 4. Nibble, 4. Suma de números binarios, 4. Número negativos, 4. Numeración BCD, 5. BCD empaquetado, 5. BCD desempaquetado, 5. Caracteres ASCII, 5. Funciones Lógicas, 5. Función AND o producto lógico, 5. Función OR o suma lógica, 6. Función NOT o inversión, 6. Función XOR u o-exclusiva, 6. Capítulo II: Organización interna del computador, 7. Arquitectura fundamental de un computador, 7. Unidad Central de Procesamiento, 8. Unidad de Control, 8. Unidad Aritmético-Lógica, 8. Memoria, 8. Memoria ROM, 9. Memoria RAM, 9. Periféricos, 9. Buses, 9. Bus de Datos, 9. Bus de Direcciones, 9. Bus de Control, 9. Capítulo III: La familia de microprocesadores 80x86, 11. Características Generales, 11. Arquitectura Interna Básica, 12. Modos Real y Protegido, 12. Registros Internos, 12. Registros de Datos, 13. Registros Indice, 14. Registro de Estado, 15. Registros de Segmento, 15. Función de los registros de segmento, 16. Modos de direccionamiento, 16. Direccionamiento registro, 16. Direccionamiento inmediato, 16. Direccionamiento directo, 16. Direccionamiento indirecto, 17. Direccionamiento indirecto a registro, 17. Direccionamiento indirecto relativo a base, 17. Direccionamiento indexado, 17. Direccionamiento indexado a base, 17. Contrarrestación de segmentos, 18. Interrupciones, 18. Tabla de vector de interrupciones, 19. Tipos de interrupciones, 19. Interrupciones por software, 20. Interrupciones por hardware, 20. Instrucciones del microprocesador, 20. Instrucciones de transferencia de datos, 21. Instrucciones aritméticas, 21. Instrucciones lógicas, 21. Instrucciones para manejo de cadenas, 21. El prefijo REP, 21. Instrucciones para control del contador de programa, 21. Instrucciones de salto condicional, 22. Instrucciones de control del procesador, 22. Instrucciones de entrada y salida, 22. Instrucciones para generación de interrupciones por software, 22. Instrucciones de rotación y desplazamiento, 22. Capítulo IV: Introducción a la programación en lenguaje ensamblador, 23. Escribiendo el primer programa en lenguaje ensamblador 23. Ensamblando el primer programa, 24. Enlazando el primer programa, 24. Ejecutando el primer programa, 25. Modificaciones al primer programa, 25. El segundo programa en lenguaje ensamblador: REVERSE.ASM, 26. Capítulo V: Programando para MS-DOS, 28. Estructura del MS-DOS, 28. BIOS, 28. El núcleo del DOS (kernel), 28. El procesador de comandos (COMMAND.COM), 29. Estructura de los programas de aplicación para MS-DOS, 30. El prefijo de segmento de programa (PSP), 30. Estructura de un programa con extensión COM, 32. Ejemplo de un programa con extensión COM, 33. Estructura de un programa con extensión EXE, 33. Segmentos de programa, 35. Capítulo VI: Herramientas de Programación, 37. Editor de Textos, 37. Ensamblador, 37. Turbo Assembler, 37. Opciones, 38. Archivo de Listado, 38. Archivo de Referencia Cruzada, 38. Enlazador, 39. Turbo Link, 39. Opciones, 39. MAKE, 40. Depurador, 41. Librerías, 41. Turbo Librarian, 42. Operaciones, 42. Capítulo VII: Programación en Lenguaje Ensamblador, 43. Archivos Fuente, Objeto y Ejecutable, 43. Contenido de un Archivo Fuente., 43 Tipos de Sentencias Fuente, 43. Instrucciones, 43. Campo Etiqueta, 44. Campo Nombre, 44. Campo de Operandos, 44. Directivas, 45. Tipos de Operandos, 44. Campo Comentario, 45. Constantes, 45. Operadores, 45. Tipos de Directivas, 46. Directivas de Datos, 46. Directivas Condicionales, 46. Directivas de Listado, 47. Directivas de Macros, 47. Macros, Procedimientos y Herramientas para Programación Modular, 47. Macros, 48. Etiquetas Locales, 49. Directivas de Repetición, 49. Otras directivas de Macros, 51. Directivas de Compilación Condicional, 51. Archivos de Inclusión, 53. Procedimientos, 53. Pasos para Escribir un Procedimiento, 54. Pase de parámetros, 55. A través de registros, 55. A través de Variables Globales, 55. A Través de la Pila, 55. Parámetros por Valor y por Referencia, 57. Parámetros por Valor, 57. Parámetros por Referencia, 57. iii Funciones versus Procedimientos, 57. Retornando Datos en Registros, 57. Retornando Datos en la Pila, 57. Reporte por Excepción, 58. Capítulo VIII: Aplicaciones. Templates para programas COM y EXE, 59. Template para programas COM, 59. Template para programas EXE, 60. Estructuras de Control, 60. Estructura IF-THEN-ELSE, 61. Estructura WHILE-DO, 62. Aplicaciones, 62. Teclado, 63. Video, 66. Manejo de archivos, 81. Directorios, 91. Acceso a disco, 95. Manejo dinámico de memoria, 98. Uso de las funciones de asignación dinámica de memoria, 98. Ajuste de la memoria ocupada por el programa de aplicación, 98. Impresora y puerto serial, 101. Ratón, 105. Conversión de datos, 107. Cadenas, 119. Misceláneos, 125. Programas residentes, 135. Generalidades de un programa residente, 135. Reglas básicas para la escritura de programas TSR, 136. Template para escritura de programas residentes, 138. Interfaz con lenguajes de alto nivel, 148. Interfaz con PASCAL, 148. Mapa de memoria de un programa en PASCAL, 148. PSP, 148. Segmento de código, 148. Segmento de datos, 148. La pila, 148. Espacio de memoria para overlays, 149. Bloque de memoria dinámica, 149. Uso de los registros del microprocesador, 149. Atributo de los procedimientos (NEAR o FAR), 149. La directiva $L y el atributo external, 150. La directiva PUBLIC, 150. La directiva EXTRN, 150. Pase de parámetros, 150. Parámetros por valor, 150. Parámetros por referencia, 151, Limpieza de la pila, 151. La directiva ARG, 151. La directiva MODEL, 151. Resultado de un función en PASCAL, 152. Variables locales, 152. Variables estáticas, 152. Variables volátiles, 152. Interfaz con lenguaje C y C++, 154. Reglas para mezclar programas en C++ con lenguaje ensamblador, 154. En lace de módulos en C++ con módulos en lenguaje ensamblador, 154. Uso de la directiva extern "C" para simplificar el enlace, 155. Modelos de memoria y segmentos, 155. Directivas simplificadas y C++, 156. Símbolos públicos y externos, 157. Carácter de subrayado y Lenguaje C, 157. Mayúsculas y minúsculas, 157. Pase de parámetros, 157. Uso de registros , 158, Retorno de valores, 158. Apéndice A: Instrucciones de la familia de microprocesadores 80x86. Apéndice B: Turbo Assembler: Operadores. Apéndice C: Turbo Assembler: Directivas. Apéndice D: Turbo Assembler: Opciones. Apéndice E: Turbo Link: Opciones. Apéndice F: Funciones del DOS. Apéndice G: Funciones del BIOS y del Ratón. Apéndice H: Lecturas de Referencia. iv Conceptos Básicos Los sistemas basados en microprocesadores están englobados dentro de lo que en electrónica se conoce como sistemas digitales.