LENGUAJE ENSAMBLADOR Y PROGRAMACIÓN PARA IBM® PC Y COMPATIBLES

608
 LENGUAJE ENSAMBLADOR Y PROGRAMACIÓN PARA IBM®   PC Y COMPATIBLES British Columbia Institute of Technology TRADUCCIÓN: Lic. Víctor Hugo Ibarra Mercado Lic. en Física y Matemáticas Coordinador Matemáticas Aplicadas Escuela de Actuaría - Universidad Anáhuac REVISIÓN TÉCNICA: Prof. Raymundo Hugo Rangel Gutiérrez UNAM Tercera edición Peter Abel ® México • Argentina • Brasil • Colombia • Costa Rica • Chile • Ecuador España • Guatemala • Panamá • Perú • Puerto Rico • Uruguay «Venezuela

description

LENGUAJE ENSAMBLADORY PROGRAMACIÓNPARA IBM® PC Y COMPATIBLESTercera ediciónAutor: Peter Abel

Transcript of LENGUAJE ENSAMBLADOR Y PROGRAMACIÓN PARA IBM® PC Y COMPATIBLES

  • LENGUAJE ENSAMBLADOR Y PROGRAMACIN PARA IBM PC Y COMPATIBLES

    British Columbia Institute of Technology

    TRADUCCIN: Lic. Vctor Hugo Ibarra Mercado Lic. en Fsica y Matemticas Coordinador Matemticas Aplicadas Escuela de Actuara - Universidad Anhuac

    REVISIN TCNICA: Prof. Raymundo Hugo Rangel Gutirrez UNAM

    Tercera edicin

    Peter Abel

    Mxico Argentina Brasil Colombia Costa Rica Chile Ecuador Espaa Guatemala Panam Per Puerto Rico Uruguay Venezuela

  • EDICIN EN INGLS PRE-PRESS/MANUFACTURING BUYER: ACQUISITIONS EDITOR: EDITORIAL7PRODUCTION SUPERVISIN

    AND INTERIOR DESIGN: COPY EDITOR; EDITORIAL ASSISTANT: SUPLEMENT EDITOR:

    BILL SCAZZERO MARCIA HORTON

    RICHARD DeLORENZO BRIAN BAKER DOLORES MARS ALICE DWORKIN

    ABEL: LENGUAJE ENSAMBLADOR Y PROGRAMACIN PARA IBM PC Y COMPATIBLES (3a. ed.)

    Traducido del ingls de la obra: IBM-PC ASSEMBLY LANGUAGE AND PROGRAMMING.

    All Rights Reserved. Authorized translation from English language edition published by Prentice Hall Inc, A Simn & Shuster Company.

    Todos los derechos reservados. Traduccin autorizada de la edicin en ingls publicada por Prentice Hall Inc.

    All Rights Reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage and retrieval system, without permission in writing from the publisher.

    Prohibida la reproduccin total o parcial de esta obra, por cualquier medio o mtodo, sin la autorizacin escrita del editor.

    Derechos reservados 1996 respecto a la primera edicin en espaol publicada por PRENTICE-HALL HISPANOAMERICANA, S.A. Atlacomulco N m . 500-5 Piso Col. Industrial Atoto

    53519, Naucalpan de Jurez, Edo. de Mxico

    ISBN 968-880-708-7 Miembro de la Cmara Nacional de la Industria Editorial, Reg. Nm. 1524 Original English Language Edition Published by Prentice Hall Inc. Copyrigth MCMXCV ISBN 0-13-124603-8 IMPRESO EN MXICO/PRINTED IN MXICO

  • Contenido

    PREFACIO

    Parte A Fundamentos de hardware y software de la PC

    / INTRODUCCIN AL HARDWARE DE LA PC Introduccin 1 Bits y bytes 2 Nmeros binarios 3 Representacin hexadecimal 6 Cdigo ASCII 7 El procesador 7 Memoria interna 9 Segmentos y direccionamiento 10 Registros 13 Puntos clave 17 Preguntas 18

    2 REQUERIMIENTOS DE SOFTWARE DE LA PC Introduccin 19 Caractersticas del sistema operativo 19 El proceso de arranque 20 Interfaz DOS-BIOS 21 Programa cargador del sistema 21

  • La pila (stack) 22 Direccionamiento de programas 24 Referencias a memoria y a registros 26 Puntos clave 26 Preguntas 27

    3 EJECUCIN DE INSTRUCCIONES Introduccin 28 El programa DEBUG 29 Visualizacin de las localidades de memoria 30 Ejemplo I de lenguaje de mquina: Datos inmediatos 32 Ejemplo II de lenguaje de mquina: Datos definidos 37 Cmo introducir un programa simblico en ensamblador 40 Uso de la instruccin INT 41 Cmo guardar un programa desde DEBUG 43 Ejemplo de lenguaje ensamblador: El operador PTR 44 Puntos clave 45 Preguntas 45

    Parte B Fundamentos de lenguaje ensamblador

    4 REQUERIMIENTOS DE LENGUAJE ENSAMBLADOR Introduccin 48 Ensambladores y compiladores 49 Comentarios en lenguaje ensamblador 49 Palabras reservadas 50 Identificadores 50 Instrucciones 51 Directivas 52 Cmo inicializar un programa para su ejecucin 55 Cmo terminar la ejecucin de un programa 57 Ejemplo de un programa fuente 58 Cmo inicializar el modo protegido 59 Directivas simplificadas de segmentos 59 Definicin de datos 61 Directivas para la definicin de datos 63 La directiva EQU 68 Puntos clave 69 Preguntas 70

    5 CMO ENSAMBLAR, ENLAZAR Y EJECUTAR UN PROGRAMA Introduccin 72 Cmo preparar un programa para su ejecucin 73 Cmo ensamblar un programa fuente 73

  • Contenido v i i

    Listado del ensamblador de las definiciones convencionales de segmentos 75 Listado del ensamblador de las directivas simplificadas de segmentos 79 Ensamblador de dos pasadas 79 Cmo enlazar un programa objeto 81 Cmo ejecutar un programa 83 Listado de referencias cruzadas 84 Diagnstico de errores 85 Puntos clave 86 Preguntas 86

    6 INSTRUCCIONES Y DIRECCIONAMIENTO DEL PROCESADOR 88

    . Introduccin 88 El conjunto de instrucciones del procesador 88 Operandos 92 La instruccin MOV 95 Instrucciones para mover y llenar 96 Operandos inmediatos 97 La instruccin XCHG 98 La instruccin LEA 99 Las instrucciones INC y DEC 99 Instrucciones de movimiento extendido 99 La instruccin INT 101 Alineacin de direcciones 101 Direcciones cercana y lejana 102 Prefijo que invalida el segmento 102 Puntos clave 103 Preguntas 104

    7 ESCRITURADEPROGRAMAS.COM 106

    Introduccin 106 Diferencias entre programas .COM y .EXE 106 Conversin a formato .COM 107 Ejemplo de un programa .COM 108 La pila de .COM 109 Sugerencias para la depuracin 110 Puntos clave 110 Preguntas 111

    8 LGICA Y CONTROL DE PROGRAMAS 112 Introduccin 112 Direcciones corta, cercana y lejana 113 Etiquetas de instrucciones 113 La instruccin JMP 114 La instruccin LOOP 116 El registro de banderas 117

  • viii C o n t e n i d o

    La instruccin CMP 118 Instrucciones de salto condicional 118 Llamada a procedimientos 121 Efectos en la pila de la ejecucin de programas 123 Operaciones booleanas 125 Cambio de minsculas a maysculas 126 Corrimiento de bits 127 Rotacin de bits (desplazamiento circular) 129 Tablas de bifurcacin 131 Organizacin de un programa 132 Puntos clave 134 Preguntas 135

    Parte C Operaciones para la pantalla y el teclado 136

    9 INTRODUCCIN AL PROCESAMIENTO EN PANTALLA Y DEL TECLADO 136 Introduccin 136 La pantalla 137 Colocacin del cursor 138 Limpiar la pantalla 138 Funcin 09H del DOS para despliegue en pantalla 139 Funcin OAH del DOS para entrada del teclado 141 Cmo aceptar y desplegar nombres 142 Uso de caracteres de control para desplegar 146 Funcin 02H del DOS para despliegue en pantalla 147 Manejadores de archivos 148 Manejadores de archivo para despliegue en pantalla 148 Manejadores de archivo para entrada desde el teclado 149 Puntos clave 151 Preguntas 152

    10 PROCESAMIENTO AVANZADO DE LA PANTALLA 153

    Introduccin 153 Adaptadores de video 154 Especificaciones del modo de video 155 Modo de texto 155 Pginas de pantalla 158 Interrupcin 10H del BIOS para modo de texto 159 Uso del BIOS para desplegar el conjunto de caracteres ASCII 165 Caracteres ASCII extendidos 166 Intermitencia, video inverso y recorrido de la pantalla 169 Despliegue directo en video 171 Modo grfico 173 Interrupcin 10H del BIOS para grficos 175 Cmo especificar y desplegar el modo grfico 178 Determinacin del tipo de adaptador de video 178

  • Contenido ix

    Puntos clave 180 Preguntas 180

    // PROCESAMIENTO AVANZADO DEL TECLADO 182

    Introduccin 182 El teclado 183 Estado del shift del teclado 184 Bfer del teclado 185 Interrupcin 21H del DOS para entrada desde el teclado 185 Interrupcin 16H del BIOS para entrada desde el teclado 187 Teclas de funcin extendidas y cdigos de rastreo 189 Seleccin de un men 191 Interrupcin 09H y el bfer del teclado 195 Cmo ingresar el conjunto completo de caracteres ASCII 197 Puntos clave 198 Preguntas 198

    Parte D Manipulacin de datos 200

    12 OPERACIONES CON CADENAS DE CARACTERES 200

    Introduccin 200 Caractersticas de las operaciones con cadenas de caracteres 201 REP: Prefijo de repeticin de cadena 201 MOVS: Mover una cadena de caracteres 202 LODS: Carga una cadena de caracteres 204 STOS: Almacenar una cadena de caracteres 205 Cmo transferir datos con LODS y STOS 206 CMPS: Comparar cadenas 206 SCAS: Bsqueda en cadenas 209 Buscar y reemplazar 210 Codificacin alterna para instrucciones de cadena de caracteres 211 Cmo duplicar un patrn 211 Cmo alinear a la derecha en la pantalla 212 Puntos clave 215 Preguntas 215

    13 ARITMTICA: IPROCESAMIENTO DE DATOS BINARIOS 217 Introduccin 217 Suma y resta 218 Aritmtica con palabras mltiples 220 Datos con signo y sin signo 223 Multiplicacin 224 Multiplicacin de palabras mltiples 226 Instrucciones especiales de multiplicacin 230 Multiplicacin por corrimiento 231

  • X C o n t e n i d o

    Divisin 232 Divisin por medio de corrimientos 236 Cambio (inversin) del signo 237 Procesadores numricos de datos (coprocesadores) 237 Puntos clave 239 Preguntas 239

    14 ARITMTICA: IIPROCESAMIENTO DE DATOS ASCII Y BCD 241 Introduccin 241 Datos en formato decimal 242 Procesamiento de datos ASCII 243 Procesamiento de datos BCD desempaquetados 245 Procesamiento de datos BCD empaquetados 248 Conversin de formato ASCII a binario 250 Conversin de formato binario a ASCII 250 Corrimiento y redondeo 251 Programa para convertir datos ASCII 253 Puntos clave 258 Preguntas 259

    15 PROCESAMIENTO DE TABLAS 260

    Introduccin 260 Definicin de tablas 260 Direccionamiento directo en tablas 262 Bsqueda en una tabla 266 La instruccin XLAT (Traducir) 271 Despliegue de caracteres hexadecimales y ASCII 272 Ordenamiento de entradas de una tabla 274 Listas ligadas (enlazadas) 275 Tipo, longitud y tamao de los operadores 279 Puntos,clave 279 Preguntas 280

    Parte E Entrada/salida avanzada 282

    16 ORGANIZACIN DEL ALMACENAMIENTO EN DISCO 282 Introduccin 282 Caractersticas de los discos 282 rea de sistemas y rea de datos en disco 285 Registro de arranque 286 Directorio 287 Tabla de asignacin de archivos 288 Ejercicio que implica el uso de la FAT 292 Procesamiento de archivos en disco 294 Puntos clave 294 Preguntas 295

    T

  • Contenido x i

    17 PROCESAMIENTO EN DISCO: I-ESCRITURA Y LECTURA DE ARCHIVOS

    Introduccin 296 Cadenas ASCIIZ 297 Manejadores de archivos 297 Cdigos de error de regreso 298 Apuntadores de archivo 298 Uso de manejadores de archivo para crear archivos en disco 298 Uso de manejadores de archivo para leer archivos en disco 303 Procesamiento de archivos ASCII 307 Uso de manejadores de archivo para procesamiento directo 310 Servicios de disco que usan bloques de control de archivo 312 Uso de FCB para crear archivos en disco 316 Uso de FCB para lectura secuencial de archivos en disco 318 Uso de FCB para procesamiento directo 319 Procesamiento directo de bloques 320 E/S absoluta de disco 321 Puntos clave 322 Preguntas 323

    18 PROCESAMIENTO EN DISCO: II-OPERACIONES DEL DOS PARA SOPORTE DE DISCOS Y ARCHIVOS 325

    Introduccin 325 Operaciones para manejo de unidades de disco 326 Programa: Lectura de informacin desde los sectores 336 Operaciones para manejar el directorio y la FAT 338 Programa: Despliegue del directorio 340 Operaciones para manejar archivos en disco 340 Programa: Borrar archivos de manera selectiva 347 Puntos clave 350 Preguntas 350

    19 PROCESAMIENTO EN DISCO: III-OPERACIONES DEL BIOS PARA DISCO 352

    Introduccin 352 Byte de estado del BIOS 353 Operaciones bsicas del BIOS para disco 354 Uso del BIOS para leer sectores 356 Otras operaciones del BIOS para disco 356 Palabras clave 362 Preguntas 362

    20 IMPRESIN 364 Introduccin 364 Caracteres comunes de control para impresora 365 DOS 21H, funcin 40H: Imprimir caracteres 365

  • Impresin con encabezados de pgina 366 Impresin de archivos ASCII y manejo de tabuladores 369 DOS 21H, funcin 05H: Imprimir un carcter 373 Caracteres especiales de control para la impresora 373 Funciones de la INT 17H del BIOS para impresin 374 Puntos clave 376 Preguntas 376

    21 OTRAS FACILIDADES DE ENTRADA/SALIDA

    Introduccin 377 Caractersticas del ratn 377 Funciones del ratn 378 Operaciones comunes del ratn 379 Programa para el ratn 385 Puertos 388 Generacin de sonidos 390 Puntos clave 391 Preguntas 392

    Programacin avanzada

    22 ESCRITURA DE MACROS

    Introduccin 393 Una definicin sencilla de una macro 394 Uso de parmetros en macros 394 Comentarios 396 Uso de una macro dentro de una definicin de una macro 398 La directiva LOCAL 399 Incluir (include) desde una biblioteca de macros 401 Concatenacin 402 Directivas de repeticin 403 Directivas condicionales 404 Puntos clave 408 Preguntas 410

    23 ENLACE A SUBPROGRAMAS

    Introduccin 411 Segmentos 412 Llamadas intrasegmento 413 Llamadas intersegmento 414 Atributos EXTRN y PUBLIC 415 Atributos EXTERN y PUBLIC para una etiqueta 417 Uso de PUBLIC en el segmento de cdigo 419 Directivas simplificadas de segmento 421 Datos comunes en subprogramas 423

  • Contenido x i i i

    Definicin de datos en ambos programas 423 Paso de parmetros 425 Enlace de programas en Pascal y en lenguaje ensamblador 429 Enlazando programas C y lenguaje ensamblador 431 Puntos clave 434 Preguntas 435

    24 ADMINISTRACIN DE LA MEMORIA DEL DOS 437 Introduccin 437 Programas principales del DOS 438 rea de memoria alta 439 COMMAND.COM 439 Prefijo de segmento de programa (PSP) 440 Bloques de memoria 444 Estrategia de asignacin de memoria 447 Cargador de programa 448 Asignacin y liberacin de memoria 453 Carga y ejecucin de una funcin de programa 454 Traslape de programas 458 Programas residentes 462 Puntos clave 467 Preguntas 468

    Parte G Captulos de referencia 469

    25 REAS DE DATOS E INTERRUPCIONES DEL BIOS 469 Introduccin 469 El proceso de arranque 470 El rea de datos del BIOS 470 Servicios de interrupcin 474 Interrupciones del BIOS 475 Puntos clave 478 Preguntas 479

    26 INTERRUPCIONES DEL DOS 480

    Introduccin 480 Interrupciones del DOS 481 Servicio de la INT 21H del DOS 481 Puntos clave 486 Preguntas 486

    27 OPERADORES Y DIRECTIVAS 487

    Introduccin 487 Especificadores de tipo 487

  • Operadores 488 Directivas 494

    28 EL CONJUNTO DE INSTRUCCIONES DE LA PC

    Introduccin 514 Notacin de registros 515 Byte del modo de direccionamiento 515 Instrucciones de dos bytes 517 Instrucciones de tres bytes 517 Instrucciones de cuatro bytes 517 Conjunto de instrucciones 518

    APNDICES A Conversin entre hexadecimal y decimal 542 B Cdigos de caracteres ASCII 545 C Palabras reservadas 547 D Opciones de ensamblado y de enlace 549 E El programa DEBUG del DOS 557 F Cdigos de rastreo del teclado y cdigos ASCII

    RESPUESTAS A PREGUNTAS SELECCIONADAS

    NDICE

  • Prefacio

    El corazn de la computadora es el microprocesador, ste maneja las necesidades aritmticas, de lgica y de control de la computadora. El microprocesador tiene su origen en la dcada de los sesenta, cuando se dise el circuito integrado (IC por sus siglas en ingls) al combinar varios componentes electrnicos en un solo componente sobre un "chip" de silicio. Los fabricantes colocaron este diminuto chip en un dispositivo parecido a un ciempis y lo conectaron a un sistema en funcionamiento. A principios de los aos setenta Intel introdujo el chip 8008 el cual, instalado en una computadora terminal, acompa a la primera generacin de microprocesadores.

    En 1974 el 8008 evolucion en el 8080, un popular microprocesador de la segunda genera- . cin para propsitos generales. En 1978 Intel produjo la tercera generacin de procesadores 8086, para proporcionar alguna compatibilidad con el 8080 y que representan un avance significativo de diseo. Despus, Intel desarroll una variacin del 8086 para ofrecer un diseo ligeramente ms sencillo y compatibilidad con los dispositivos de entrada/salida de ese momento. Este nuevo procesador, el 8088, fue seleccionado por IBM para su computadora personal en 1981. Una versin mejorada del 8088 es el 80188, y versiones mejoradas del 8086 son los 80186, 80286, 80386, 80486 y el Pentium (tambin conocido como P5), cada uno de ellos permite operaciones adicionales y ms procesamiento.

    La variedad de microcomputadoras tambin ocasion un renovado inters en el lenguaje ensamblador, cuyo uso conlleva diferentes ventajas:

    Un programa escrito en lenguaje ensamblador requiere considerablemente menos memoria y tiempo de ejecucin que un programa escrito en los conocidos como lenguajes de alto nivel, como Pascal y C.

    El lenguaje ensamblador da a un programador la capacidad de realizar tareas muy tcnicas que seran difciles, si no es que imposibles de realizar en un lenguaje de alto nivel.

    x v

  • xvi P r e f a c i o

    El conocimiento del lenguaje ensamblador permite una comprensin de la arquitectura de la mquina que ningn lenguaje de alto nivel puede ofrecer.

    Aunque la mayora de los especialistas en software desarrolla aplicaciones en lenguajes de alto nivel, que son ms fciles de escribir y de dar mantenimiento, una prctica comn es recodificar en lenguaje ensamblador aquellas rutinas que han causado cuellos de botella en el procesamiento.

    Los programas residentes y rutinas de servicio de interrupcin casi siempre son desarrollados en lenguaje ensamblador. Los lenguajes de alto nivel fueron diseados para eliminar las particularidades de una com-

    putadora especfica, mientras que un lenguaje ensamblador est diseado para una computadora especfica, o, de manera ms correcta, para una familia especfica de microprocesadores. A conti-nuacin se listan los requisitos para aprender el lenguaje ensamblador de la PC:

    Tener acceso a una computadora personal de IBM (cualquier modelo) o una compatible. Una copia del sistema operativo ms-dos o pc-dos (de preferencia, una versin reciente) y

    estar familiarizado con su uso. Una copia de un programa ensamblador (otra vez, de preferencia, una versin reciente).

    Las versiones de Microsoft son conocidas como MASM y QuickAssembler: TASM es de Borland y OPTASM es de System.

    Para el aprendizaje de lenguaje ensamblador no es necesario lo siguiente: Conocimiento previo de un lenguaje de programacin, aunque el tenerlo puede ayudarle a

    comprender algunos conceptos de programacin ms rpido. Conocimiento previo de electrnica o circuitera. Este libro proporciona toda la informacin

    acerca de la arquitectura de la PC que usted necesita para programar en lenguaje ensamblador.

    SISTEMAS OPERATIVOS

    Los propsitos principales de un sistema operativo son (1) permitir a los usuarios instruir a una computadora con respecto a las acciones que debe tomar (como ejecutar un programa en particu-lar) y (2) facilitar los medios de almacenamiento de la informacin en disco ("catalogar") y de tener acceso a la misma.

    El sistema operativo ms comn para la PC y sus compatibles es el MS-DOS de Microsoft, conocido como PC-DOS en la IBM PC. Cada una de las versiones del DOS ha proporcionado caractersticas adicionales que han extendido las capacidades de la PC. Un estudio de sistemas operativos avanzados, como os/2 y UNix, se encuentra fuera del los alcances de este libro.

    OBJETIVO DEL LIBRO

    El propsito principal de este libro es ayudar a los lectores en el aprendizaje de la programacin en lenguaje ensamblador. Para este fin, el libro cubre los aspectos ms sencillos del hardware y del lenguaje y despus conforme se requiere introduce las instrucciones necesarias. El texto tam-bin subraya la claridad de los programas de ejemplo. As, los ejemplos utilizan aquellas instruc-ciones y enfoques que son ms fciles de entender, aunque un programador profesional resolvera problemas similares con un cdigo ms sofisticado, pero menos claro.

  • Prefacio x v i i

    CMO EMPLEAR EL LIBRO Esta obra puede emplearse tanto como libro de texto que como de referencia permanente. Para hacer ms eficaz su inversin en una microcomputadora y software, trabaje con cuidado en cada uno de los captulos y relea cualquier material que no sea claro de inmediato. Teclee los progra-mas de ejemplo en su computadora, convirtalos en "mdulos" ejecutables y preprelos para ejecutarlos (o "correrlos"). Tambin, resuelva los del final de cada captulo.

    Los primeros nueve captulos tratan el material fundamental para el libro y para el lenguaje ensamblador. Despus de estudiarlos puede continuar con los captulos 12, 13, 15, 16, 20, 21 o 22. L o s captulos 25, 26, 27 y 28 tienen la intencin de ser referencias. Los captulos interrelacionados son:

    9 a 11 (sobre operaciones con la pantalla y el teclado). 13 y 14 (sobre operaciones aritmticas). 16 a 19 (sobre procesamiento en disco). 23 y 24 (sobre subprogramas y administracin de la memoria).

    Al terminar este libro, usted ser capaz de:

    Entender el hardware de la computadora personal. Entender cdigo en lenguaje de mquina y en formato hexadecimal. Entender los pasos al ensamblar, enlazar y ejecutar un programa. Escribir programas en lenguaje ensamblador para manejar el teclado y la pantalla, realizar

    aritmtica, hacer conversiones entre los formatos ASCII y binario, formar tablas de bsqueda y ordenamiento y manejar entradas y salidas de disco.

    Rastrear la ejecucin de la mquina como ayuda en la depuracin de programas. Escribir sus macroinstrucciones para facilitar la codificacin. Enlazar programas ensamblados aparte en un programa ejecutable.

    Aprender lenguaje ensamblador y conseguir que sus programas funcionen es una experien-cia excitante y desafiante. Por el tiempo y esfuerzo invertidos, las recompensas de seguro son grandes.

    NOTAS SOBRE LA TERCERA EDICIN Esta tercera edicin lleva una considerable cantidad de mejoras sobre la edicin anterior. Algunas de ellas son:

    Inclusin y mayor nfasis en las funciones adicionales en versiones ms recientes del DOS. Programacin para operaciones con el ratn.

    Los programas tambin omiten instrucciones de macros (stas se explican en el captulo 22). A pesar de que los programadores profesionales utilizan macros constantemente, su aparicin en un libro de esta naturaleza interferira con el aprendizaje de los principios del lenguaje. Una vez, que estos principios se han aprendido, un programador puede adoptar las tcnicas inteligentes del profesional.

  • xviii P r e f a c i o

    Caractersticas de los procesadores 80486 y Pentium de Intel. Inclusin de material acerca del rea de memoria superior y el rea de memoria alta. Inclusin de material sobre las ms recientes versiones de ensamblados. Mayor cobertura de funciones de procesamiento en disco para DOS, la tabla de asignacin

    de archivos y procesamiento directo. Detalles completos de los cdigos de rastreo y de las combinaciones de teclas del teclado

    extendido. Reorganizacin y revisin considerables de las explicaciones en todas las partes del texto.

    RECONOCIMIENTOS

    El autor est agradecido por la ayuda y cooperacin de todos aquellos que contribuyeron con sugerencias para la revisin y correccin de ediciones anteriores. Para esta tercera edicin, vaya un agradecimiento especial a Brian R. Anderson del British Columbia Institute of Technology por la informacin sobre el ratn y la programacin C.

  • PARTE A Fundamentos del hardware y software de la PC

    CAPTULO 1

    Introduccin al hardware de la PC

    OBJETIVO

    Expl icar las caracterst icas bsicas del ha rdware de la mic ro -computadora y la organizac in de p rog ramas .

    INTRODUCCIN Escribir un programa en lenguaje ensamblador requiere de conocimientos acerca del hardware (arquitectura) de la computadora, su conjunto de instrucciones y sus reglas de uso. En este cap-tulo se ofrece una explicacin del hardware bsico: bits, bytes, registros, el procesador y el bus de datos. El conjunto de instrucciones y su uso son desarrollados a lo largo del libro.

    Los bloques fundamentales de informacin de una computadora son los bits y los bytes. stos proporcionan los medios por los cuales la computadora puede representar datos e instruccio-nes en la memoria.

    Los elementos principales de hardware interno de la computadora son un microprocesador, la memoria y los registros; los elementos de hardware externo son los dispositivos de entrada/ salida, como el teclado, el monitor y el disco. El software consta de diversos programas y archi-vos de datos (incluyendo al sistema operativo) almacenados en el disco. Para ejecutar (o correr) un programa, el sistema lo copia del disco a la memoria interna. (La memoria interna es lo que la gente entiende cuando pide que su computadora tenga, por ejemplo, 8 megabytes de memoria.) El microprocesador ejecuta las instrucciones del programa, y los registros manejan la aritmtica, movimiento de datos y el direccionamiento.

    1

  • 2 Introduccin al hardware de la PC Captulo 1

    Un programa en lenguaje ensamblador consiste en uno o ms segmentos para definir datos y almacenar instrucciones de mquina y un segmento llamado stack (o pila) que contiene direccio-nes almacenadas.

    BITS Y BYTES

    La unidad ms pequea de informacin en la computadora es el bit. Un bit puede estar no magne-tizado, o apagado, de modo que su valor es cero, o bien, magnetizado, o encendido, de modo que su valor es uno. Un solo bit no proporciona mucha informacin, pero es sorprendente lo que un conjunto de ellos puede hacer.

    Bytes

    A un grupo de nueve bits se le llama byte, el cual representa localidades de almacenamiento, tanto en memoria interna como en discos externos. En memoria, cada byte tiene una direccin nica, que inicia con cero para el primer byte. Cada byte tiene ocho bits para datos y un bit de paridad:

    0 0 0 0 0 0 0 0 1

    bits de datos paridad

    Los ocho bits de datos proporcionan la base para la aritmtica binaria y para representar caracte-res como la letra A o el smbolo de asterisco (*). Ocho bits permiten 256 combinaciones diferentes de condiciones de apagado-encendido (off-on), desde todos los bits apagados (00000000) hasta todos los bits encendidos (11111111). Por ejemplo, una representacin de los bits para la letra A es 01000001 y para el asterisco es 00101010, aunque no tenemos que memorizarlas.

    La paridad requiere que el nmero de bits encendidos en cada byte siempre sea impar. Puesto que la letra A contiene dos bits encendidos, para forzar la paridad impar el procesador establece de forma automtica su bit de paridad en encendido (01000001-1). De forma similar, puesto que el asterisco tiene tres bits encendidos, para mantener la paridad impar el procesador establece el bit de paridad en apagado (00101010-0). Cuando una instruccin hace referencia a un byte en memoria interna, el procesador verifica su paridad. Si su paridad es par, el sistema supone que un bit est "perdido" y exhibe un mensaje 0 de error. Un error de paridad puede ser resultado de una falla en el hardware o un trastorno elctrico; de cualquier forma, es un acontecimiento raro.

    Puede preguntarse cmo es que la computadora "sabe" que el valor de los bits 01000001 representa la letra A. Cuando usted oprime la A en el teclado, el sistema enva una seal desde esa tecla a la memoria y establece un byte (en una posicin de entrada) al valor 01000001. Usted puede mover el contenido de este byte de un lugar a otro de la memoria y aun imprimirlo o mostrarlo en la pantalla como la letra A.

    Para propsitos de referencia, los bits en el byte se numeran del 0 al 7 de derecha a izquier-da, como se muestra aqu para la letra A (ya no nos preocuparemos por el bit de paridad):

    Nmero de bit: Contenido en bits para la A:

    7 6 5 4 3 2 1 0 0 1 0 0 0 0 0 1

  • Nmeros binarios 3

    Bytes relacionados

    Un programa puede tratar a un grupo de bytes como una unidad de informacin, como tiempo o distancia. A un grupo de uno o ms bytes que definen un valor particular se le conoce comnmente como campo. La computadora tambin emplea ciertos tamaos que le son naturales:

    Palabra. Un campo de 2 bytes (16 bits). Los bits en una palabra son numerados desde 0 hasta 15, de derecha a izquierda, como se muestra a continuacin para las letras ' P C :

    Nmero de bit Contenidos en bits (PC):

    15 14 13 12 11 10 9 8 7 6 5 4 3 2 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1

    Palabra doble. Un campo de 4 bytes (32 bits). Palabra cudruple. Un campo de 8 bytes (64 bits). Prrafo. Un campo de 16 bytes (128 bits). Kilobyte (KB). El nmero 2 1 0 es igual a 1024, el cual pasa a ser el valor de K, por kilobytes.

    Por tanto, una computadora con una memoria de 640K tiene 640 x 1024, o 655,360 bytes. Megabyte (MB). El nmero 2 2 0 es igual a 1,048,576, o un megabyte.

    NMEROS BINARIOS Puesto que la computadora slo puede distinguir entre bits 0 y 1, trabaja con un sistema de numeracin de base 2 conocido como binario. De hecho, la palabra "bit" es una contraccin de las palabras inglesas "binary digit" (dgito binario).

    Una coleccin de bits puede representar cualquier valor numrico. El valor de un nmero binario depende de las posiciones relativas de cero a uno de los bits. Al igual que en los nmeros decimales, las posiciones de derecha a izquierda representan potencias ascendentes (pero de 2, no de 10). En el siguiente nmero de ocho bits, todos los bits se toman como uno (encendido):

    Posicin: 7 6 5 4 3 2 1 0 Valor del bit: 1 1 1 1 1 1 1 1 Valor de la posicin: 128 64 32 16 8 4 2 1

    El primer bit de la derecha toma el valor 1 (2);. el que sigue a la izquierda toma el valor 2 (2 1); el siguiente el valor 4 (2 2), y as sucesivamente. En este caso el valor del nmero binario es 1 + 2 + 4 + ... + 128 = 255 (o 2 8 - 1).

    En forma similar, el valor del nmero binario 01000001 se calcula como 1 ms 64, o 65:

    Valor del bit: 0 1 0 0 0 0 0 1 Valor de la posicin: 128 64 32 16 8 4 2 1

    Pero, no es 01000001 la letra A? En realidad, s. Los bits 01000001 pueden representar ya sea el nmero 65 o bien la letra A, como a continuacin se indica:

  • Introduccin a l h a r d w a r e de la PC Captulo 1

    Si un programa define los datos para propsitos aritmticos, entonces 01000001 es un nmero binario equivalente al nmero decimal 65.

    Si un programa define los datos con propsitos descriptivos, como encabezados, entonces 01000001 representa un carcter alfabtico.

    . Cuando inicie la programacin, ver con ms claridad esta distincin, puesto que define y utiliza cada elemento de informacin para un propsito especfico. En la prctica, rara vez los dos usos son fuente de confusin.

    Un nmero binario no est limitado a 8 bits. Un procesador que utiliza una arquitectura de 16 bits (o de 32 bits) maneja de manera automtica nmeros de 16 bits (o de 32 bits). Para 16 bits, 2 1 6 - 1, da valores hasta 65,535, y para 32 bits, 2 3 2 - 1, proporciona valores hasta 4,294,967,295.

    Aritmtica binaria

    La microcomputadora realiza aritmtica slo en formato binario. En consecuencia, el programa-dor de lenguaje ensamblador tiene que estar familiarizado con el formato binario y la suma binaria. Los siguientes ejemplos ilustran la suma binaria: . ,

    ; i

    0 0 1 1 + 0 + 1 + 1 + 1

    0 1 10 1 11

    Note en los dos ltimos ejemplos un 1 de acarreo. Ahora, sumemos 01000001 a 00101010. Estamos sumando la letra A con el asterisco? No, son las cifras decimales 65 y 42:

    Decimal Binario 65 01000001

    +42 +00101010 107 01101011

    Verifique que la suma binaria 01101011 realmente es 107. Otro ejemplo: sume los valores deci-males 60 y 53:

    Decimal Binario 60 00111100

    + 53 +00110101 113 01110001

    Nmeros negativos

    Los nmeros binarios anteriores son todos positivos, porque en cada uno el ltimo bit de la izquierda es un cero. Un nmero binario negativo tiene un 1 en el bit de la izquierda. Sin embar-go, no es tan simple como cambiar el bit de la izquierdaa 1, tal como 01000001 ( + 6 5 ) a 11000001. Un valor negativo se expresa en notacin de complemento a dos; esto es, para representar un nmero binario como negativo la regla es: invierta los bits y sume 1. (Se entiende por invertir un bit que si su valor es 1, lo cambiamos por 0, y si su valor es 0, lo cambiamos por 1.) Como ejemplo, encontrar el complemento a dos de 01000001 (o 65):

  • Nmeros binarios 5

    Nmero + 6 5 : 01000001 Invertir los bits: 10111110 Sumar 1: 1 N m e r o - 6 5 : 10111111

    Un nmero binario es negativo si su ltimo bit a la izquierda es 1, pero si suma los valores de los bits que tienen 1, para convertir el nmero 10111111 a decimal, no obtendr 65. Para de-terminar el valor absoluto de un nmero negativo binario, simplemente repita la operacin ante-rior, esto es, invierta los bits y sume 1:

    N m e r o - 6 5 : 10111111 Invertir los bits: 01000000 Sumar 1: 1_ Nmero +65 : 01000001

    La suma de +65 y - 6 5 debe ser cero. Prubelo:

    +65 01000001 - 6 5 +10111111

    00 (1)00000000 En la suma, el valor de los 8 bits es cero, y el acarreo de un 1 a la izquierda se pierde. Pero como existe un acarreo hacia el bit de signo y un acarreo hacia afuera del bit de signo, el resultado es correcto.

    La resta binaria es simple: convierta el nmero que ser restado a su complemento a dos y sume los nmeros. Restar 42 de 65. La representacin binaria de 42 es 00101010 y su comple-mento a dos es 11010110:

    65 01000001 + (-42) +11010110

    23 (1)00010111 El resultado, 23, es correcto. Una vez ms, existe un acarreo vlido hacia el bit de signo y un acarreo hacia fuera.

    Si la justificacin para la notacin de complemento a dos no es inmediatamente clara, considere la siguiente pregunta: Qu valor tiene que ser sumado al nmero binario 00000001 para hacer que la suma sea igual a 00000000? En trminos de nmeros decimales, la respuesta sera - 1 . El complemento a dos del 1 es 11111111. As sumamos +1 y -1 como sigue:

    1 00000001 + ( - 1 ) 11111111

    Resultado: (1)00000000 Ignorando el acarreo de 1, puede ver que el nmero binario 11111111 es equivalente al decimal -1. Tambin puede ver un patrn en la forma en que los nmeros binarios decrecen en valor

    + 3 00000011 +2 00000010 + 1 00000001

    0 00000000 -1 11111111 -2 11111110 -3 11111101

  • 6 Introduccin a l h a r d w a r e de la PC Captulo 1

    De hecho, en un nmero negativo los bits con cero indican su valor (absoluto): trate el valor posicional de cada uno de los bits con cero como si fueran 1, sume los valores y agregue 1.

    Este material sobre aritmtica binaria y nmeros negativos lo encontrar provechoso cuando vea los captulos 12 y 13, sobre aritmtica.

    REPRESENTACIN HEXADECIMAL Imagine que quiere ver los contenidos de cuatro bytes adyacentes, que representan un valor bina-rio, en memoria (una palabra doble). Aunque un byte puede tener cualquiera de las 256 combina-ciones de bits, no hay manera de mostrar o imprimir muchos de ellos como caracteres ASCII comunes. (Ejemplos de tales caracteres son las configuraciones de bits para Tab, Enter, Form Feed y Escape [tabulador, Intro, Avance de pgina y Escape.) En consecuencia, los diseadores de computadoras desarrollaron un mtodo abreviado para representar informacin binaria. El mtodo divide todo byte en mitades y expresa el valor para cada medio byte. Como ejemplo, considere los siguientes cuatro bytes:

    Binario: 0101 1001 0011 0101 1011 1001 1100 1110 Decimal: 5 9 3 5 11 9 12 14

    Puesto que los nmeros 11, 12 y 14 necesitan 2 dgitos, se extiende el sistema de numera-cin de manera que 10 = A, 11 = B, 12 = C, 13 = D, 14 = E y 15 = F. Aqu est el nmero en forma abreviada que representa el contenido de los bytes dados:

    59 35 B9 CE

    Por tanto, el sistema de numeracin incluye los "dgitos" 0 a F, y ya que existen 16 de tales dgitos, el sistema es conocido como representacin hexadecimal (o hex). La figura 1-1 muestra los nmeros decimales de 0 a 15 junto con sus valores equivalentes en binario y en hexadecimal.

    B i n a r i o D e c i m a l H e x a d e c i m a l B i n a r i o D e c i m a l H e x a d e c i m a l

    0000 ')

    0 0 1000 8 8 0001 1 1 1001 9 9 0010 2 2 1010 10 A 0011 3 3 1011 11 B 0100 4 4 1100 12 C 0101 5 5 1101 13 D 0110 6 6 1110 14 E 0111 7 7 1111 15 F

    Figura 1-1 Representacin binaria, decimal y hexadecimal

    El lenguaje ensamblador hace uso considerable del formato hexadecimal. Un listado de un programa ensamblador muestra, en hexadecimal, todas las direcciones, instrucciones de cdigo de mquina y el contenido de las constantes de datos. Para depurar sus programas, puede usar el programa DEBUG del DOS, el cual tambin muestra las direcciones y los contenidos de los bytes en formato hexadecimal.

    Muy pronto estar trabajando en formato hexadecimal. Tenga en mente que el nmero hexadecimal que sigue inmediatamente a F es el 10 hexadecimal, que es el valor decimal 16. Veamos a continuacin algunos ejemplos sencillos de aritmtica hexadecimal:

  • El procesador 7

    6 + 4 +

    5 8

    F + 1

    F + F

    10 + 30

    FF + 1

    A D 10 1E 40 100 Note tambin que el 40 hexadecimal es igual al 64 decimal, el 100 hexadecimal es el 256 decimal y el 1,000 hexadecimal es el 4,096 decimal.

    En un programa para indicar un nmero hexadecimal, se escribe una "H" inmediatamente despus del nmero; as 25H = 37 decimal. Por convencin, un nmero hexadecimal siempre empieza con un dgito 0 a 9, as que debe codificar B8H, como 0B8H. En este libro indicamos un valor hexadecimal con la palabra "hex" o una "H" despus del nmero (como en 4C hex o 4CH); un valor binario con la palabra "binario" o una " B " a continuacin del nmero (como 01001100 binario o 01001100B), y un valor decimal simplemente por un nmero (como 76). Se exceptan los casos en que la base es obvia por el contexto.

    En el apndice A se explica cmo convertir nmeros hexadecimales a decimal, y viceversa.

    CDIGO ASCII Para uniformar la representacin de caracteres, los fabricantes de microcomputadoras han adop-tado el cdigo ASCII (American Standard Code for Information Interchange). Un cdigo unifor-me facilita la transferencia de informacin entre los diferentes dispositivos de la computadora. El cdigo ASCII extendido de 8 bits que utiliza la PC proporciona 256 caracteres, incluyendo smbo-los para alfabetos extranjeros. Por ejemplo, la combinacin de bits 01000001 (41 hex) indica la letra A. El apndice B tiene una lista de los 256 caracteres ASCII y el captulo 8 ensea cmo mostrarlos en la pantalla.

    EL PROCESADOR

    Un elemento importante del hardware de la PC es la unidad del sistema, que contiene una tarjeta de sistema, fuente de poder y ranuras de expansin para tarjetas opcionales. Los elementos de la tarjeta de sistema son un microprocesador Intel (o equivalente), memoria de slo lectura (ROM) y memoria de acceso aleatorio (RAM).

    El cerebro de la PC y compatibles es un microprocesador basado en la familia 8086 de Intel, que realiza todo el procesamiento de datos e instrucciones. Los procesadores varan en velocidad y capacidad de memoria, registros y bus de datos. Un bus de datos transfiere datos entre el procesador, la memoria y los dispositivos externos. En realidad, dirige el trfico (trnsito) de datos. En seguida se anota una breve descripcin de varios procesadores de Intel:

    8088/80188. Estos procesadores tienen registros de 16 bits y un bus de datos de 8 bits, y pueden direccionar hasta un milln de bytes en memoria interna. Los registros pueden procesar dos bytes al mismo tiempo, mientras que el bus de datos slo puede transferir un byte a la vez. El 80188 es un 8088 con mayor potencia por la adicin de unas cuantas instrucciones. Ambos procesadores corren en lo que se conoce como modo real, esto es, un programa a la vez.

    8086/80186. Estos procesadores son similares a los 8088/80188, pero tienen un bus de datos de 16 bits y corren ms rpido. El 80186 es un 8086 ms potente con unas cuantas instruc-ciones adicionales.

  • 8 Introduccin a l h a r d w a r e de la PC Captulo 1

    80286. Este procesador puede correr ms rpido que los anteriores y direccionar hasta 16 millones de bytes. Puede correr en modo real o en modo protegido para multitareas.

    80386. Este procesador tiene registros de 32 bits y un bus de datos de 32 bits, y puede direccionar hasta cuatro mil millones de bytes en memoria. Puede correr en modo real o en modo protegido para multitareas.

    80486. Este procesador tambin tiene registros de 32 bits y un bus de datos de 32 bits (aunque algunos clones tienen un bus de datos de 16 bits) y est diseado para mejorar el desem-peo. Puede correr en modo real o en modo protegido para multitareas.

    Pent ium (o P5) . Este procesador tiene registros de 32 bits, un bus de datos de 64 bits y puede ejecutar ms de una instruccin por ciclo de reloj. (Intel adopt el nombre "Pentium" porque, a diferencia de los nmeros, los nombres pueden tener derechos reservados.)

    Unidad de ejecucin y unidad de interfaz del bus El procesador se divide en dos unidades lgicas: una unidad de ejecucin (EU) y una unidad de interfaz del bus (BIU), como se ilustra en la figura 1-2. El papel de la EU es ejecutar instruccio-nes, mientras que la BIU enva instrucciones y datos a la EU. La EU contiene una unidad aritm-tico-lgica (ALU), una unidad de control (CU) y varios registros. Estos elementos ejecutan ins-trucciones y operaciones aritmticas y lgicas.

    La funcin ms importante de la BIU es manejar la unidad de control del bus, los registros de segmentos y la cola de instrucciones. La BIU controla los buses que transfieren los datos a la EU, a la memoria y a los dispositivos de entrada/salida externos, mientras que los registros de segmentos controlan el direccionamiento de memoria.

    EU: Unidad de ejecucin AH AL

    BH | BL CH 1 CL

    DH 1 DL

    SP

    BP

    SI DI

    ALU: Unidad aritmtico-lgica

    CU: Unidad de control

    Registro de banderas

    Apuntador de instrucciones

    BIU: Unidad de interfaz del bus

    Control del programa

    CS

    Unidad de control

    del bus

    Cola de instrucciones

    Figura 1-2 Unidad de ejecucin y unidad de interfaz del bus

  • Memoria interna 9

    Otra funcin de la BIU es permitir el acceso a instrucciones. Ya que las instrucciones de un programa en ejecucin se encuentran en la memoria, la BIU debe accesar instrucciones desde la memoria y colocarlas en la cola de instrucciones. Puesto que el tamao de esta cola es de 4 a 32 bytes, dependiendo del procesador, la BIU es capaz de adelantarse y buscar con anticipacin instrucciones de manera que siempre haya una cola de instrucciones listas para ser ejecutadas.

    La EU y la BIU trabajan en paralelo, si bien la BIU se mantiene un paso adelante. La EU notifica a la BIU cundo necesita acceso a los datos en memoria o a un dispositivo de E/S. Tambin, la EU solicita instrucciones de mquina de la cola de instrucciones de la BIU. La instruccin que se encuentra adelante de la cola es la actualmente ejecutable, y mientras la EU est ocupada ejecutando una instruccin, la BIU busca otra en la memoria. Esta bsqueda se traslapa con la ejecucin y aumenta la velocidad de procesamiento.

    Los procesadores hasta el 80486 tienen lo que se conoce como tubera sencilla, la cual los restringe a completar una instruccin antes de iniciar la siguiente. El Pentium y procesadores posteriores tienen una tubera doble (o dual) que les permite correr varias operaciones en paralelo.

    MEMORIA INTERNA

    La microcomputadora posee dos tipos de memoria interna: memoria de acceso aleatorio (RAM) y memoria de slo lectura (ROM). Los bytes en memoria se numeran en forma consecutiva, ini-ciando con 00, de modo que cada localidad tiene un nmero de direccin nico.

    La figura 1-3 muestra un mapa fsico de memoria de una PC tipo 8086. Del primer megabyte de memoria, los primeros 640K los ocupa la RAM, la mayor parte de la cual est disponible para su uso.

    ROM. La ROM es un chip especial de memoria que (como su nombre lo indica) slo puede ser leda. Ya que las instrucciones y los datos estn "grabados" permanentemente en un chip de ROM, no pueden ser alterados. EL Sistema Bsico de Entrada/Salida (BIOS) de ROM inicia en la direccin 768K y maneja los dispositivos de entrada/salida, como un controlador de disco duro. La ROM que inicia en 960K controla las funciones bsicas de la computadora, como la autoprueba al encender, patrones de puntos para los grficos y el autocargador de disco. Cuan-do se enciende la computadora, la ROM realiza ciertas verificaciones y carga, desde el disco, los datos especiales del sistema que enva a la RAM.

    Inicio Direccin Uso

    Dec 960K

    Hex F0000 G4K sistema base de ROM

    768K C0000 192K rea de expansin de memoria (ROM) memoria

    128 K rea de despliegue de video (RAM)

    superior

    640K A0000

    memoria 640 K memoria (RAM) convencional

    cero 00000

    Figura 1-3 Mapa de memoria fsica

  • 10 Introduccin a l h a r d w a r e de la PC Captulo 1

    R A M . Un programador est preocupado principalmente con la RAM, que sera mejor lla-mada "memoria de lectura-escritura". La RAM se dispone como una "hoja de trabajo" para almacenamiento temporal y ejecucin de programas.

    Ya que el contenido de la RAM se pierde cuando se apaga la computadora, debe reservar almacenamiento externo para guardar programas y datos. Si cuando enciende la computadora tiene insertado un disco flexible con DOS o un disco duro instalado, el procedimiento de arranque en ROM carga el programa COMMAND.COM en RAM. Despus se le pide a C0MMAND.COM realizar acciones, como cargar un programa de un disco a la RAM. Puesto que el COMMAND.COM ocupa una pequea parte de RAM, tambin existe espacio para otros programas. Su programa se ejecuta en RAM y por lo comn produce salida a la pantalla, a la impresora o a un disco. Cuando termina, usted puede pedir al C0MMAND.COM cargar otro programa en RAM, una accin que se escribe sobre el programa anterior. En todo el estudio posterior de la RAM se usar el trmino general "memoria".

    Direccionamiento de localidades de memoria

    Dependiendo del modelo, el procesador puede accesar uno o ms bytes de memoria a la vez. Considere el nmero decimal 1,025. La representacin hexadecimal de esta cifra, 0401H, requie-re de dos bytes (o una palabra) de memoria. Consta de un byte de orden alto (ms significativo), 04, y un byte de orden bajo (menos significativo), 01 . El sistema almacena en memoria estos bytes en secuencia inversa de bytes: el byte de orden bajo en la direccin baja de memoria y el byte de orden alto en la direccin alta de memoria. Por ejemplo, el procesador transferira 0401H de un registro a las localidades de memoria 5612 y 5613 como:

    registro 04 01

    01 04

    localidad 5612, localidad 5613, byte menos significativo byte ms significativo

    El procesador espera que los datos numricos en la memoria estn en secuencia inversa de bytes y los procesa de acuerdo con esto. Cuando el procesador recupera la palabra de la memoria, otra vez invierte los bytes, restablecindolos de manera correcta en el registro como 04 01 hex. Aunque esta caracterstica es enteramente automtica, usted tiene que estar alerta cuando progra-me y depure programas en lenguaje ensamblador.

    Un programador de lenguaje ensamblador tiene que distinguir claramente entre la direccin y los contenidos de una localidad de memoria. En el ejemplo anterior, el contenido de la localidad 5612 es 01 y el contenido de la localidad 5613 es 04.

    SEGMENTOS Y D I R E C C I O N A M I E N T O

    Un segmento es un rea especial en un programa que inicia en un lmite de un prrafo, esto es, en una localidad regularmente divisible entre 16, o 10 hex. Aunque un segmento puede estar ubicado casi en cualquier lugar de la memoria y, en modo real, puede ser hasta de 64K, slo necesita tanto espacio como el programa requiera para su ejecucin.

  • Segmentos y direccionamiento 11

    Un segmento en modo real puede ser de hasta 64K. Se puede tener cualquier nmero de seg-mentos; para direccionar un segmento en particular basta cambiar la direccin en el registro del segmento apropiado. Los tres segmentos principales son los segmentos de cdigo, de datos y de la pila.

    Segmento de cdigo

    El segmento de cdigo (CS) contiene las instrucciones de mquina que son ejecutadas. Por lo comn, la primera instruccin ejecutable est en el inicio del segmento, y el sistema operativo enlaza a esa localidad para iniciar la ejecucin del programa. Como su nombre indica, el registro del CS direcciona el segmento de cdigo. Si su rea de cdigo requiere ms de 64K, su programa puede necesitar definir ms de un segmento de cdigo.

    Segmento de datos

    El segmento de datos (DS) contiene datos, constantes y reas de trabajo definidos por el progra-ma. El registro del DS direcciona el segmento de datos. Si su rea de datos requiere de ms de 64K, su programa puede necesitar definir ms de un segmento de datos.

    Segmento de la pila

    En trminos sencillos, la pila contiene los datos y direcciones que usted necesita guardar tempo-ralmente o para uso de sus "llamadas" subrutinas. El registro del segmento de la pila (SS) direcciona el segmento de la pila.

    Lmites de los segmentos

    Los registros de segmentos contienen la direccin inicial de cada segmento. La figura 1-4 presenta un esquema de los registros CS, DS y SS; los registros y segmentos no necesariamente estn en el orden mostrado. Otros registros de segmentos son el ES (segmento extra) y, en los procesadores 80386 y posteriores, los registros FS y GS, que tienen usos especializados.

    Como ya dijimos, un segmento inicia en un lmite de prrafo, que es una direccin por lo comn divisible entre el 16 decimal, o 10 hex. Suponga que un segmento de datos inicia en la localidad de memoria 045F0H. Ya que en este y todos los dems casos el ltimo dgito hexadecimal de la derecha es cero, los diseadores de computadora decidieron que sera innecesario almacenar el dgito cero en el registro del segmento. As, 045F0H se almacena como 045F, con el cero de la extrema derecha sobrentendido. En donde sea apropiado, el texto indica al cero de la derecha con corchetes, como en 045FfO].

    S e g m e n t o de la pila

    Segmento de datos

    Segmento de cd igo

    Reubicable en m e m o r i a

    Figura 1-4 Segmentos y registros

  • Introduccin a l h a r d w a r e de la PC Captulo 1

    Desplazamientos de segmentos

    En un programa, todas las localidades de memoria estn referidas a una direccin inicial de segmento. La distancia en bytes desde la direccin del segmento se define como el desplazamiento (offset). Un desplazamiento de dos bytes (16 bits) puede estar en el rango de 000OH hasta FFFFH, o bien, desde cero hasta 65,535. As, el primer byte del segmento de cdigo tiene un desplaza-miento 00, el segundo byte tiene un desplazamiento 0 1 , etc., hasta el desplazamiento 65,535. Para referir cualquier direccin de memoria en un segmento, el procesador combina la direccin del segmento en un registro de segmento con un valor de desplazamiento.

    En el ejemplo siguiente, el registro DS contiene la direccin de segmento del segmento de datos en 045F[0] hexadecimal y una instruccin hace referencia a una localidad con un desplaza-miento de 0032H bytes dentro del segmento de datos.

    I I direccin de segmento 045F0H desplazamiento 32H

    Por tanto, la localidad real de memoria del byte referido por la instruccin es 04622H:

    Direccin del segmento DS: 045F0H Desplazamiento: +0032H Direccin real: 04622H

    Note que un programa tiene uno o ms segmentos, los cuales pueden iniciar casi en cual-quier lugar de memoria, variar en tamao y estar en cualquier orden.

    Capacidad de direccionamiento

    La serie de PC ha usado varios procesadores Intel que proporcionan diferentes capacidades de direccionamiento.

    Direccionamiento de 8086/8088. Los registros de los procesadores 8086/8088 proporcio-nan 16 bits. Ya que una direccin de segmento est en el lmite de un prrafo, los 4 bits de la extrema derecha de su direccin son cero. Como ya vimos, una direccin es almacenada en un registro de segmento, y la computadora asume los cuatro ltimos bits de la derecha como ceros (un dgito hexadecimal), como nnnn[0] hex. Ahora, FFFF[0]H permite direccionar hasta 1,048,560 bytes. Si tiene duda, decodifique cada F hex como el 1111 binario, considere los cuatro ltimos bits de la derecha como ceros y sume los valores de los bits a 1.

    Direccionamiento 80286. En modo real, el procesador 80286 maneja el direccionamiento de la misma manera que lo hace el 8086. En modo protegido, el procesador utiliza 24 bits para direccionamiento, de manera que FFFFF[0] permite direccionar hasta 16 millones de bytes. Los registros de segmento actan como seleccionadores para accesar una direccin de segmento de 24 bits de la memoria y sumar este valor a un desplazamiento de direccin de 16 bits:

    Registro de segmento: 16 bits [0000]

    Direccin del segmento: 24 bits

  • Registros 13

    Direccionamiento 80386/486/586. En modo real, estos procesadores manejan el direc-cionamiento de forma muy parecida a como lo hace un 8086. En modo protegido, los procesadores utilizan 48 bits para el direccionamiento, lo que permite direcciones de segmento de hasta cuatro mil millones de bytes. Los registros de segmento de 16 bits actan como seleccionadores para el acceso a direcciones de segmento de 32 bits de la memoria y para agregar este valor a un despla-zamiento de direccin de 32 bits:

    Registro de segmento: 16 bits [0000]

    Direccin del segmento: 32 bits

    REGISTROS

    Los registros del procesador se emplean para controlar instrucciones en ejecucin, manejar direccionamiento de memoria y proporcionar capacidad aritmtica. Los registros son direccionables por medio de un nombre. Los bits, por convencin, se numeran de derecha a izquierda, como en:

    ... 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

    Registros de segmento Un registro de segmento tiene 16 bits de longitud y facilita un rea de memoria para direccionamiento conocida como el segmento actual. Como hemos dicho, un segmento se alinea en un lmite de prrafo y su direccin en un registro de segmento supone cuatro bits 0 a su derecha.

    Registro CS. El DOS almacena la direccin inicial del segmento de cdigo de un progra-ma en el registro CS. Esta direccin de segmento, ms un valor de desplazamiento en el registro de apuntador de instruccin (IP), indica la direccin de una instruccin que es buscada para su ejecucin. Para propsitos de programacin normal, no se necesita referenciar el registro CS.

    Registro DS. La direccin inicial de un segmento de datos de programa es almacenada en el registro DS. En trminos sencillos, esta direccin, ms un valor de desplazamiento en una instruccin, genera una referencia a la localidad de un byte especfico en el segmento de datos.

    Registro SS. El registro SS permite la colocacin en memoria de una pila, para almacena-miento temporal de direcciones y datos. El DOS almacena la direccin de inicio del segmento de pila de un programa en el registro SS. Esta direccin de segmento, ms un valor de desplazamien-to en el registro del apuntador de la pila (SP), indica la palabra actual en la pila que est siendo direccionada. Para propsitos de programacin normal, no se necesita referenciar el registro SS.

    Registro ES. Algunas operaciones con cadenas de caracteres (datos de caracteres) utilizan el registro extra de segmento para manejar el direccionamiento de memoria. En este contexto, el registro ES est asociado con el registro DI (ndice). Un programa que requiere el uso del registro ES puede inicializarlo con una direccin de segmento apropiada.

    Registros FS y GS. Son registros extra de segmento en los procesadores 80386 y poste-riores.

  • Introduccin al hardware de la PC Captulo 1

    Registro de apuntador de instrucciones

    El registro apuntador de instrucciones (IP) de 16 bis contiene el desplazamiento de direccin de la siguiente instruccin que se ejecuta. El IP est asociado con el registro CS en el sentido de que el IP indica la instruccin actual dentro del segmento de cdigo que se est ejecutando actualmente. Por lo comn, usted no refiere el registro IP en un programa, pero, para probar un programa, s puede cambiar su valor por medio del programa DEBUG del DOS. Los procesadores 80386 y posteriores tienen un IP ampliado de 32 bits, llamado EIP.

    En el ejemplo siguiente, el registro CS contiene 25A4[0]H y el IP contiene 412H. Para encontrar la siguiente instruccin que ser ejecutada, el procesador combina las direcciones en el CS y el IP:

    Segmento de direccin en el registro CS: 25A40H Desplazamiento de direccin en el registro IP: + 412H Direccin de la siguiente instruccin: 25E52H

    Registros apuntadores

    Los registros SP (apuntador de la pila) y BP (apuntador base) estn asociados con el registro SS y permiten al sistema accesar datos en el segmento de la pila.

    Registro SP. El apuntador de la pila de 16 bits est asociado con el registro SS y propor-ciona un valor de desplazamiento que se refiere a la palabra actual que est siendo procesada en la pila. Los procesadores 80386 y posteriores tienen un apuntador de pila de 32 bits, el registro ESP. El sistema maneja de manera automtica estos registros.

    En el ejemplo siguiente, el registro SS contiene la direccin de segmento 27B3[0]H y el SP, el desplazamiento 312H. Para encontrar la palabra actual que est siendo procesada en la pila, la computadora combina las direcciones en el SS y el SP:

    Direccin de segmento en el registro SS: 27B30H Desplazamiento en el registro SP: + 312H Direccin en la pila: 27E42H

    27B3[0]H 312H Direccin del segmento SS Desplazamiento del SP

    Registro BP. El BP de 16 bits facilita la referencia de parmetros, los cuales son datos y direcciones transmitidos va la pila. Los procesadores 80386 y posteriores tienen un BP ampliado de 32 bits llamado el registro EBP.

    Registros de propsito general

    Los registros de propsito general AX, BX, CX y DX son los caballos de batalla del sistema. Son nicos en el sentido de que se puede direccionarlos como una palabra o como una parte de un byte. El ltimo byte de la izquierda es la parte "alta", y el ltimo byte de la derecha es la parte "baja". Por ejemplo, el registro CX consta de una parte CH (alta) y una parte CL (baja), y usted puede referirse a cualquier parte por su nombre. Las instrucciones siguientes mueven ceros a los regis-tros CX, CH y CL, respectivamente.

  • Registros 15

    MOV CX,00

    MOV CH,00

    MOV CL,00

    Los procesadores 80386 y posteriores permiten el uso de todos los registros de propsito general, ms sus versiones ampliadas de 32 bits: EAX, EBX, ECX y EDX.

    Registro AX. El registro AX, el acumulador principal, es utilizado para operaciones que implican entrada/salida y la mayor parte de la aritmtica. Por ejemplo, las instrucciones para multiplicar, dividir y traducir suponen el uso del AX. Tambin, algunas operaciones generan cdigo ms eficiente si se refieren al AX en lugar de a los otros registros.

    AX: AH AL

    EAX:

    Registro BX. El BX es conocido como el registro base ya que es el nico registro de propsito general que puede ser un ndice para direccionamiento indexado. Tambin es comn emplear el BX para clculos.

    BX: BH BL

    EBX:

    Registro CX. El CX es conocido como el registro contador. Puede contener un valor para controlar el nmero de veces que un ciclo se repite o un valor para corrimiento de bits, hacia la derecha o hacia la izquierda. El CX tambin es usado para muchos clculos.

    CX: CH CL

    ECX:

    Registro DX. El DX es conocido como el registro de datos. Algunas operaciones de entra-da/salida requieren su uso, y las operaciones de multiplicacin y divisin con cifras grandes suponen al DX y al AX trabajando juntos.

    DX: DH DL

    EDX:

    Puede usar los registros de propsito general para suma y resta de cifras de 8, 16 o 32 bits.

    Registros ndice

    Los registros SI y DI estn disponibles para direccionamiento indexado y para sumas y restas.

  • Introduccin a l h a r d w a r e de la PC Captulo 1

    Registro SI. El registro ndice fuente de 16 bits es requerido por algunas operaciones con cadenas (de caracteres). En este contexto, el SI est asociado con el registro DS. Los procesadores 80386 y posteriores permiten el uso de un registro ampliado de 32 bits, el ESI.

    Registro DI. El registro ndice destino tambin es requerido por algunas operaciones con cadenas de caracteres. En este contexto, el DI est asociado con el registro ES. Los procesadores 80386 y posteriores permiten el uso de un registro ampliado de 32 bits, el EDI.

    Registro de banderas

    De los 16 bits del registro de banderas, nueve son comunes a toda la familia de procesadores 8086, y sirven para indicar el estado actual de la mquina y el resultado del procesamiento. Muchas instrucciones que piden comparaciones y aritmtica cambian el estado de las banderas, algunas de cuyas instrucciones pueden realizar pruebas para determinar la accin subsecuente.

    En resumen, los bits de las banderas comunes son como sigue:

    OF (overflow, desbordamiento). Indica desbordamiento de un bit de orden alto (ms a la izquierda) despus de una operacin aritmtica.

    DF (direccin). Designa la direccin hacia la izquierda o hacia la derecha para mover o comparar cadenas de caracteres.

    IF (interrupcin). Indica que una interrupcin externa, como la entrada desde el teclado, sea procesada o ignorada.

    TF (trampa). Permite la operacin del procesador en modo de un paso. Los programas depuradores, como DEBUG, activan esta bandera de manera que usted pueda avanzar en la ejecucin de una sola instruccin a un tiempo, para examinar el efecto de esa instruccin sobre los registros y la memoria.

    SF (signo). Contiene el signo resultante de una operacin aritmtica (0 = positivo y 1 = negativo).

    ZF (cero). Indica el resultado de una operacin aritmtica o de comparacin (0 = resul-tado diferente de cero y 1 = resultado igual a cero).

    AF (acarreo auxiliar). Contiene un acarreo externo del bit 3 en un dato de ocho bits, para aritmtica especializada.

    PF (paridad). Indica paridad par o impar de una operacin en datos de ocho bits de bajo orden (ms a la derecha).

    CF (acarreo). Contiene el acarreo de orden ms alto (ms a la izquierda) despus de una operacin aritmtica; tambin lleva el contenido del ltimo bit en una operacin de corrimiento o de rotacin.

    Las banderas estn en el registro de banderas en las siguientes posiciones:

    Nm. de bit: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

    Bandera: O D I T S Z A P C

  • Puntos clave 17

    Las banderas ms importantes para la programacin en ensamblador son O, S, Z y C, para operaciones de comparacin y aritmticas, y D para operaciones de cadenas de caracteres. Los procesadores 80286 y posteriores tienen algunas banderas usadas para propsitos internos, en especial las que afectan al modo protegido. Los procesadores 80386 y posteriores tienen un regis-tro extendido de banderas conocido como Eflags. El captulo 8 contiene detalles adicionales acer-ca del registro de banderas.

    PUNTOS CLAVE

    La computadora distingue entre bits 0 (apagado) y 1 (encendido), y realiza aritmtica slo en formato binario.

    El valor de un nmero binario se determina por la ubicacin de sus bits. As, 1011 binario es igual a 23 + 22 + 0 + 2 o , o 13.

    Un nmero binario negativo se representa en notacin de complemento a dos: se invierten los bits de su representacin positiva y se suma 1.

    Un solo carcter de memoria es un byte; comprende ocho bits de datos y un bit de paridad. Dos bytes adyacentes comprenden una palabra, y cuatro bytes adyacentes, una palabra doble.

    El valor de K es igual a 2 1 0 , o 1,024 bytes. El formato hexadecimal es una notacin abreviada para representar grupos de cuatro bits.

    Los dgitos hexadecimales 0-9 y A-F representan los nmeros binarios desde 0000 hasta 1111.

    La representacin de datos de caracteres es realizado en el formato ASCII. El corazn de la PC es el microprocesador. El procesador almacena datos numricos en

    palabras de memoria en secuencia inversa de bytes. Los dos tipos de memoria son ROM y RAM. Un programa en lenguaje ensamblador consiste en uno o ms segmentos: un segmento de la

    pila para mantener las direcciones de regreso, un segmento de datos para definir reas de datos y de trabajo y un segmento de cdigo para instrucciones ejecutables. Las localidades en un segmento son expresadas como un desplazamiento relativo a la direccin inicial del segmento.

    Los registros de CS, DS y SS permiten el direccionamiento de los segmentos de cdigo, datos y de la pila, respectivamente.

    El registro IP contiene la direccin de desplazamiento de la siguiente instruccin que es ejecutada.

    Los registros de apuntador SP y BP estn asociados con el registro SS y permiten al sistema accesar datos en el segmento de la pila.

    Los registros de propsito general AX, BX, CX y DX son los caballos de batalla del sistema. El ltimo byte a la izquierda es la parte "alta", y el ltimo byte a la derecha es la parte "baja". El AX (acumulador principal) se emplea para entrada/salida y para la mayor parte de la aritmtica. El BX (registro base) puede ser usado como un ndice en direccionamiento extendido. El CX es conocido como el registro contador y el DX como el registro de datos.

    Los registros SI y DI estn disponibles para direccionamiento extendido y para sumas y restas. Estos registros tambin se necesitan para algunas operaciones con cadenas de caracteres (carcter).

  • 18 Introduccin a l h a r d w a r e d e l a P C Captulo 1

    El registro de banderas indica el estado actual de la computadora y los resultados de la ejecucin de las instrucciones.

    PREGUNTAS

    1-1. Determine la configuracin binaria en bits de los siguientes nmeros: (a) 6; (b) 14; (c) 22; (d) 28; (e) 30. 1-2. Sume los siguientes nmeros binarios:

    (a) 00010101 (b) 00111101 (c) 00011101 (d) 01010111 00001101 00101010 00000011 00111101

    1-3. Halle el complemento a dos de los siguientes nmeros binarios: (a) 00010110; (b) 00111101; (c) 00111100.

    1-4. Encuentre el valor positivo (absoluto) de los siguientes nmeros binarios negativos: (a) 11001000; (b) 10111101; (c) 11111110; (d) 11111111.

    1-5. Determine la representacin hexadecimal de los valores siguientes: (a) cdigo ASCII de la letra Q; (b) cdigo ASCII del nmero 7; (c) 01011101 binario; (d) 01110111 binario.

    1-6. Sume los nmeros hexadecimales siguientes: (a) 23 A6 (b) 51FD (c) 7779 (d) EABE (e) FBAC

    +0022 +0003 +0887 +26C4 +0CBE

    1-7. Determine la representacin hexadecimal de los nmeros decimales siguientes. Consulte el apndice A para ver el mtodo de conversin. Tambin debe verificar su resultado al convertir el hexadecimal a binario y al sumar los bits de 1. (a) 19; (b) 33; (c) 89; (d) 255; (e) 4,095; (f) 63,398.

    1-8. Proporcione la configuracin ASCII, en bits, de los siguientes caracteres de un byte. Utilice el apndice B como gua: (a) P; (b) p; (c) #; (d) 5.

    1-9. Cul es objetivo del procesador? 1-10. Cules son las dos clases principales de memoria en la PC y cules, sus principales usos? 1-11. Muestre cmo el sistema almacena 012345 hex como un valor en la memoria. 1-12. Explique lo siguiente: (a) segmento; (b) desplazamiento (offset); (c) lmite de direccin. 1-13. Cules son: (a) las tres clases de segmentos; (b) su tamao mximo; y (c) el lmite de direccin en el

    que ellos inician? 1-14. Seale el objetivo de cada uno de los tres registros de segmentos. 1-15. Explique qu registros se utilizan para los siguientes propsitos: (a) sumar y restar; (b) contar los

    ciclos; (c) multiplicar y dividir; (d) segmentos de direccionamiento; (e) indicacin de un resultado igual a cero; (f) desplazamiento de direccin de una instruccin que se va a ejecutar.

    1-16. Muestre el registro EAX y el tamao y posicin de AH, AL y AX en l. 1-17. Codifique las instrucciones en lenguaje de ensamblador para mover el nmero 25 a los registros

    siguientes: (a) CH; (b) CL; (c) CX; (d) ECX.

  • CAPTULO 2

    Requerimientos de software de la PC

    OBJETIVO

    Expl icar e l ambiente general de software pa ra la P C .

    INTRODUCCIN En este captulo describimos el ambiente de software de la PC: las funciones del DOS y sus componentes principales. Examinamos el proceso de arranque (cmo es que el sistema se autocarga cuando usted enciende su computadora) y consideramos cmo el sistema carga un programa para ejecutarlo, cmo utiliza la pila y cmo una instruccin en el segmento de cdigo direcciona datos en el segmento de datos.

    El captulo se completa con la explicacin bsica del software y hardware de la PC y nos permite continuar con el captulo 3, en donde cargamos programas clave en la memoria y los ejecutamos paso a paso.

    CARACTERSTICAS DEL SISTEMA OPERATIVO El DOS es un sistema operativo que proporciona acceso general e independiente de los dis-positivos a los recursos de la computadora. Los dispositivos que permite incluyen teclados, panta-llas y unidades de disco. Por "independencia de dispositivos" debe entender que no es preciso dirigirse especficamente a los dispositivos, ya que el DOS y sus controladores de dispositivos pueden manejar las operaciones a nivel de dispositivo.

    19

  • 2 0 Requerimientos de software de la PC Captulo 2

    Entre las funciones del DOS que nos conciernen en este libro, estn las siguientes:

    Administracin de archivos. El DOS mantiene los directorios y archivos en los discos de sistema. Los programas crean y actualizan archivos, pero el DOS tiene la responsabilidad de administrar sus ubicaciones en el disco.

    Entrada/salida (E/S). Los programas solicitan datos de entrada al DOS o entregan informacin al DOS por medio de interrupciones. El DOS releva al programador de codificar a nivel de E/S.

    Carga de programas. Un usuario o programa solicita la ejecucin de un programa; el DOS maneja los pasos necesarios para tener acceso al programa desde el disco, colocarlo en la memoria e inicializarlo para su ejecucin.

    Administracin de la memoria. Cuando el DOS carga un programa para su ejecucin, asigna suficiente espacio en memoria para el cdigo del programa y sus datos. Los programas pueden procesar datos dentro de su rea de memoria, liberar memoria que no necesiten y solicitar memoria adicional.

    Manejo de interrupciones. El DOS permite a los usuarios instalar programas residentes en memoria que se adhieren al sistema de interrupciones para realizar funciones especiales.

    Organizacin del DOS

    Los tres componentes principales del DOS son IO.SYS, MSDOS.SYS y COMMAND.COM. El IO.SYS realiza las funciones de inicializacin en el momento del arranque y tambin

    contiene importantes funciones de E/S y controladores de dispositivos que dan el soporte de E/S bsico en el BIOS de ROM. Este componente est almacenado en disco como un archivo de sistema oculto y es conocido como IBMBI0.COM en el PC-DOS.

    El MSDOS.SYS acta como el ncleo (kernel) del DOS y se ocupa de la administracin de archivos, de memoria y de entrada/salida. Este componente est almacenado en disco como un archivo de sistema y en el PC-DOS se conoce como IBMD0S.COM.

    C 0 M M A N D . C O M es un procesador de comandos o shell que acta como la interfaz entre el usuario y el sistema operativo. Muestra la indicacin del DOS, monitorea el teclado y procesa los comandos del usuario, como borrado de un archivo o carga de un programa para su ejecucin.

    EL P R O C E S O DE ARRANQUE Encender la computadora provoca una "inicializacin" (algunos le llaman "arranque en fro"). El procesador introduce un estado de restauracin, limpia todas las localidades de memoria (es decir, coloca cero en todas ellas), realiza una verificacin de paridad de la memoria y asigna al registro CS la direccin del segmento FFFF[0]H y al registro IP el desplazamiento cero. Por tanto, la primera instruccin a ejecutarse est en la direccin formada por la pareja CS:IP, que es FFFFOH, la cual es el punto de entrada al BIOS en ROM.

    La rutina de BIOS que inicia en FFFFOH verifica los diferentes puertos para identificarlos e inicializa los dispositivos que estn conectados a la computadora. Despus el BIOS establece dos reas de datos:

    1. Una tabla de servicios de interrupcin, que inicia en memoria baja en la localidad O y contiene las direcciones de las interrupciones que ocurren.

    2. Un rea de datos de BIOS que inicia en la localidad 40[0], que est estrechamente relacionada con los dispositivos conectados.

  • Programa cargador del sistema 21

    G40K

    OK

    Parte transitoria del COMMAND.COM (programas que se estn ejecutando pueden borrarla)

    Disponible para uso de programas

    Parte residente del C0MMAND.COM (reside de manera permanente)

    Archivos de sistema 10.SYS y MSD0S.SYS

    rea de datos del BIOS Tabla de servicios de interrupciones

    Figura 2-1 Mapa de la memoria convencional

    A continuacin el BIOS determina si est presente un disco que contenga los archivos de sistema del DOS y, en caso de que as sea, accesa el cargador de arranque desde ese disco. Este programa carga los archivos de sistema 10.SYS y MSDOS.SYS desde el disco hacia la memoria y transfiere el control al punto de entrada del IO.SYS, el cual contiene los controladores de dispositivos y otro cdigo especfico del hardware. El IO.SYS se reubica l mismo en memoria y transfiere el control al MSDOS.SYS. Este mdulo inicializa las tablas internas del DOS y la porcin del DOS de la tabla de interrupciones. Tambin lee el archivo CONFIG.SYS y ejecuta sus comandos. Finalmente, el MSDOS.SYS pasa el control al C0MMAND.COM, el cual procesa el archivo AUTOEXEC.BAT, muestra su indicacin y monitorea las entradas dadas desde el teclado.

    En este punto, la memoria convencional hasta los 640K aparece como se muestra en la figura 2-1 . Por medio de un administrador de memoria, parte del DOS puede ser reubicado en la me-moria alta.

    INTERFAZ DOS-BIOS

    El BIOS contiene un conjunto de rutinas en ROM para dar soporte a los dispositivos. El BIOS prueba e inicializa los dispositivos conectados y proporciona los servicios que son usados para la lectura y escritura desde los dispositivos. Una tarea del DOS es hacer interfaz con el BIOS cuando exista una necesidad de accesar estas facilidades.

    Cuando un programa usuario solicita un servicio del DOS, ste podra transferir la solicitud al BIOS, el cual a su vez accesa el dispositivo solicitado. Sin embargo, algunas veces un programa hace la peticin directamente al BIOS, especficamente para servicios del teclado y de la pantalla. Y en otras ocasiones -aunque es raro y no recomendable- un programa puede pasar por alto tanto al DOS como al BIOS para accesar un dispositivo directamente. La figura 2-2 muestra estas trayectorias alternas.

    PROGRAMA CARGADOR DEL SISTEMA

    El DOS da soporte a dos tipos de programas ejecutables: .COM y .EXE. Un programa .COM consta de un segmento que contiene cdigo, datos y la pila. Si se necesita un pequeo programa de utilera o un programa residente en memoria (un programa que es instalado permanentemente y est disponible mientras otros programas estn ejecutndose), se escribe un programa .COM. Un programa .EXE consta de segmentos de cdigo, datos y de la pila separados y es el mtodo usado por la mayora de los programas serios. Este libro usa ambos tipos de programas.

  • 2 2 Requerimientos de software de la PC Captulo 2

    P r o g r a m a s d e u s u a r i o s

    DOS

    B I O S

    H a r d w a r e / D i s p o s i t i v o s Figura 2-2 Interfaz DOS-BIOS

    Cuando usted le solicita al DOS cargar un programa .EXE desde el disco a la memoria para su ejecucin, el cargador realiza las siguientes operaciones:

    1. Accesa el programa .EXE desde el disco. 2. Construye un prefijo de segmento de programa (PSP) de 256 bytes (100H) en un lmite de

    prrafo en memoria interna disponible. 3. Almacena el programa en memoria inmediatamente despus del PSP. 4. Carga la direccin del PSP en los registros DS y ES. 5. Carga la direccin del segmento de cdigo en el CS y establece el IP al desplazamiento de

    la primer instruccin (por lo comn cero) en el segmento de cdigo. 6. Carga la direccin de la pila en el SS y establece el SP al tamao de la pila. 7. Transfiere el control al programa para ejecucin, iniciando (por lo comn) con la primer

    instruccin en el segmento de cdigo.

    En esta forma, el cargador DOS inicializa correctamente los registros CS:IP y SS:SP. Pero note que el programa cargador almacena la direccin del PSP tanto en el registro DS como en el ES, aunque su programa normalmente necesita la direccin del segmento de datos en estos regis-tros. Como consecuencia, sus programas tienen que inicializar el DS con la direccin del segmen-to de datos, como se ver en el captulo 4.

    Ahora examinaremos la pila y despus los segmentos de cdigo y datos.

    LA PILA (STACK) Los programas .COM y .EXE, requieren un rea en el programa reservada como una pila (stack). El propsito de la pila es mantener un espacio para el almacenamiento temporal de direcciones y datos.

    El DOS define de manera automtica la pila para un programa .COM, mientras que para un programa .EXE usted debe definir en forma explcita la pila. Cada elemento de dato en la pila es una palabra (dos bytes). El registro SS, como es inicializado por el DOS, contiene la direccin del inicio de la pila. Inicialmente, el SP contiene el tamao de la pila, un valor que apunta al byte que est pasando el final de la pila. La pila difiere de otros segmentos en su mtodo de almacenar los datos: empieza en la localidad ms alta y almacena los datos hacia abajo por la memoria.

  • La pila (stack) 23

    SS SP direccin del segmento de la pila tope de la pila

    La instruccin PUSH (entre otras) disminuye el SP en 2 hacia abajo, hacia la siguiente palabra almacenada de la pila y coloca (o empuja, push) un valor ah. La instruccin POP (entre otras) regresa el valor de la pila e incrementa el SP en 2 hacia arriba, hacia la siguiente palabra almacenada.

    El ejemplo siguiente ilustra cmo meter el contenido de los registros AX y BX a la pila y la subsecuente extraccin de ellos. Suponga que el AX contiene 015AH, el BX contiene 03D2H y el SP contiene 28H (aqu no nos concierne la direccin en el SS).

    1. Al comienzo, la pila est vaca y se ve as:

    SS direccin del segmento de la pila

    I SP = 28

    tope de la pila

    PUSH AX: disminuye el SP en 2 (a 26H) y almacena el contenido del AX, 015AH, en la pila. Observe que la operacin invierte la secuencia de bytes almacenados, de modo que 015A se convierte en 5A01:

    5A01

    I SS

    direccin del segmento de la pila SP = 26

    tope de la pila

    3. PUSH BX: disminuye el SP en 2 (a 24H) y almacena el contenido del BX, 03D2H, en la pila:

    D203 5A01

    SS direccin del segmento de la pila

    I SP = 24

    tope de la pila

    4. POP BX: regresa la palabra que se encuentra en la pila, en donde apunta el SP, y la enva al registro BX e incrementa el SP en 2 (a 26H). El BX ahora contiene 03D2H, con los bytes correctamente invertidos:

    D203 5A01

    SS direccin del segmento de la pila

    SP = 26 tope de la pila

  • 24 Requerimientos de software de la PC Captulo 2

    POP AX: regresa la palabra que se encuentra en la pila, en donde apunta el SP, y la enva al registro AX e incrementa el SP en 2 (a 28H). El AX ahora contiene 015AH, con los bytes correctamente invertidos:

    D203 5A01

    I SS

    direccin del segmento de la pila

    I SP = 28

    tope de la pila

    Note que las instrucciones POP son codificadas en secuencia inversa a las instrucciones PUSH. As, en el ejemplo se guardaron AX y BX, pero se sacaron el BX y AX, en ese orden. Adems, los valores sacados de la pila an estn all, aunque el SP ya no apunta a ellos.

    Siempre debe asegurarse que su programa coordine los valores que guarda en la pila con los valores que saca de ella. Como ste es un requisito directo, un error puede causar que un progra-ma no funcione. Tambin, para un programa .EXE usted tiene que definir una pila que sea suficientemente grande para contener todos los valores que podran ser guardados en ella.

    Otras instrucciones relacionadas con los valores que guarda y saca de la pila son:

    PUSHF y POPF: Guarda y restablece el estado de los banderas. PUSHA y POPA (para el 80286 y posteriores): Guarda y restaura el contenido de todos los

    registros de propsito general.

    D I R E C C I O N A M I E N T O DE P R O G R A M A S

    Normalmente, los programadores escriben en cdigo simblico y utilizan ensamblador para tradu-cirlo a cdigo de mquina. Para ejecutar un programa, el DOS carga slo cdigo de mquina en la memoria. Cada instruccin consta de al menos una operacin, como mover, sumar o regresar. Dependiendo de la operacin, una instruccin tambin puede tener uno o ms operandos que referencian los datos que la operacin procesa.

    Como se estudi en el captulo 1, el registro CS proporciona la direccin de inicio de un segmento de cdigo de programa y el registro DS ofrece la direccin de inicio del segmento de datos. El segmento de cdigo contiene instrucciones que sern ejecutadas, mientras que el seg-mento de datos contiene los datos que las instrucciones referencian. El registro IP indica la direc-cin del desplazamiento de la instruccin actual, en el segmento de cdigo, que es ejecutada. Un operando de la instruccin indica una direccin de desplazamiento en el segmento de datos que es referenciada.

    Considere un ejemplo en el que el DOS ha determinado que se carga un programa .EXE en memoria, iniciando en la localidad 04AF0H. El DOS, de acuerdo con esto, asigna el registro CS la direccin del segmento 04AF[0]H y al DS con, digamos, la direccin de segmento 04B1[0]H. El programa ya ha iniciado su ejecucin, y el IP actualmente contiene el desplazamiento 0023H. La pareja CS:IP determina la direccin de la siguiente instruccin a ser ejecutada, como sigue:

    Direccin del segmento CS: Desplazamiento IP: Direccin de la instruccin:

    4AF0H +0013H

    4B03H

  • Direccionamiento de programas 25

    Digamos que la instruccin que inicia en 04B03H copia los contenidos de un byte en memoria al registro AL; el byte est en el desplazamiento 0012H en el segmento de datos. Aqu estn tanto el cdigo de mquina como el cdigo simblico para esta operacin:

    A01200 MOV AL, [0012] I

    Localidad 04B03H

    La localidad de memoria 04B03H contiene el primer byte (A0) de la instruccin que el procesador accesa. El segundo y tercer bytes contienen el valor del desplazamiento, en secuencia invertida de bytes (0012 se convierte en 1200). Para accesar el elemento de dato, el procesador determina su localidad de la direccin del segmento en el registro DS ms el desplazamiento (0012H) en el operando de la instruccin. Ya que el DS contiene 04B1[0]H, la localidad actual del elemento de dato referenciado es:

    Direccin del segmento DS: 4B10H Desplazamiento del segmento: +0012H Direccin del dato: 4B22H

    Hagamos que la localidad 04B22H contenga 1BH. Entonces el procesador extrae el 1BH de la localidad 04B22H y la copia en el registro AL, como se muestra en la figura 2-3.

    Cuando el procesador busca cada byte de la instruccin, incrementa el registro IP de manera que ste contenga el desplazamiento (0016H) para la siguiente instruccin. El procesador ahora est preparado para ejecutar la siguiente instruccin, la cual se deriva otra vez de la direccin del segmento en el CS (04AF0H) ms el desplazamiento actual en el IP (0016H) -de hecho, 04B06H.

    Una instruccin tambin puede accesar ms de un byte a la vez. Por ejemplo, supongamos que una instruccin es almacenar los contenidos del registro AX (0567H) en dos bytes adyacentes en el segmento de datos empezando en el desplazamiento 0012H. El cdigo simblico es MOV [0012],AX. El operando [0012] entre corchetes (un operador de ndice) indica una localidad de memoria para distinguirlo del simple nmero 12. El procesador carga los dos bytes en el AX en secuencia inversa de bytes como

    Contenido de los bytes: 67 05 I I

    Desplazamiento en el segmento de datos: 0012 0013

    Otra instruccin, MOV AX,[0012], puede recuperar subsecuentemente estos bytes para copiarlos de la memoria de regreso al AX. La operacin invierte (y corrige) los bytes en el AX como 05 67.

    A 0 1 2 0 0 - , / I

    Desplazamiento 0013 j Segmento del cd igo I

    T

    I Desplazamiento 0012

    Segmento de da tos

    I I B

    Figura 2-3 Segmentos y desplazamientos

  • 2 6 R e q u e r i m i e n t o s d e s o f t w a r e d e l a P C Captulo 2

    REFERENCIAS A MEMORIA Y A REGISTROS

    Una caracterstica para obtener claridad en las instrucciones es el uso de nombres de operandos, de nombres entre corchetes y de nmeros. En los ejemplos siguientes, WORDA est definida como una palabra (dos bytes) en memoria:

    W O R D A ;Define u n a p a l a b r a

    MOV A X , B X /Mueve los c o n t e n i d o s de BX a AX

    MOV AX, W O R D A /Mueve los c o n t e n i d o s de W O R D A a AX

    MOV AX, 2 5 /Mueve el v a l o r 25 a AX

    MOV AX, [BX] /Mueve los c o n t e n i d o s de la l o c a l i d a d e s p e c i f i c a d a p o r BX

    Los corchetes en el cuarto ejemplo definen un operador de ndice que significa: utilizar una direccin de desplazamiento en el BX (combinada con la direccin del segmento en el DS, como DS:BX) para localizar una palabra en memoria y mover su contenido al AX. Comprese el efecto de esta instruccin con aquella del primer ejemplo, la cual simplemente mueve los contenidos del BX al AX.

    PUNTOS CLAVE

    Los tres componentes principales del DOS son IO.SYS, MSDOS.SYS y COMMAND.COM.

    Al encender la computadora se provoca una inicializacin, tambin llamada "arranque en fro". El procesador introduce un estado de restauracin, limpia todas las localidades de memoria ponindolas en cero, realiza una verificacin de la paridad de la memoria y establece los registros CS e IP al punto de entrada del BIOS en ROM.

    Los dos tipos de programas del DOS son .COM y .EXE.

    Cuando usted solicita al DOS cargar un programa .EXE para su ejecucin, el DOS construye un PSP de 256 bytes (100H) en un lmite de prrafo en memoria y almacena el programa inmediatamente despus del PSP. Despus carga la direccin del PSP en los registros DS y ES, carga la direccin del segmento de cdigo en el CS, establece el IP al desplazamiento de la primera instruccin en el segmento de cdigo, carga la direccin de la pila en el SS y establece el tamao de la pila. Finalmente, el cargador transfiere el control al programa por ejecutarse.

    El propsito de la pila es proporcionar un espacio para el almacenamiento temporal de direcciones y datos. Cada dato en la pila es una palabra (dos bytes).

    El DOS define la pila para un programa .COM, mientras que para un programa .EXE se debe definir de manera explcita la pila.

    Cuando el procesador busca cada byte de una instruccin, incrementa el registro IP de manera que el IP contenga el desplazamiento para la siguiente instruccin.

  • Preguntas 27

    PREGUNTAS

    2-1. Cules son las cinco funciones principales del DOS? 2-2. Cules son los tres componentes principales del DOS y cul es el propsito de cada uno de ellos? 2-3. Qu pasos realiza el sistema en una inicializacin (arranque en fro)? 2-4. (a) Qu rea de datos construye el DOS y almacena en frente de un mdulo ejecutable, cuando el

    mdulo es cargado para su ejecucin? (b) Cul es el tamao de esta rea de datos? 2-5. El DOS realiza ciertas operaciones cuando carga un programa .EXE para su ejecucin. Qu valores

    inicializa el DOS (a) en los registros CS e IP? (b) en los registros SS y SP? (c) en los registros DS y ES?

    2-6. Cul es el objetivo de la pila? 2-7. De qu forma se define la pila para (a) un programa .COM y (b) un programa .EXE? (Esto es,

    quin o qu define la pila?) 2-8. (a) Cul es el tamao de cada entrada de la pila? (b) En dnde se encuentra inicialmente la parte

    superior de la pila y cmo es direccionada? 2-9. Durante la ejecucin de un programa, el CS contiene 5A2B[0], el SS contiene 5B53[0], el IP contiene

    52H y el SP contiene 48H. (Los valores se muestran en secuencia normal, no en secuencia invertida de bytes.) Calcule las direcciones de (a) la instruccin a ejecutarse y (b) la parte superior de la pila (localidad actual).

    2-10. El DS contiene 5B24[0] y una instruccin que mueve datos de la memoria al AL es A03A01 (donde A0 significa "mover"). Calcule la direccin de memoria referenciada.

  • CAPTULO 3

    Ejecucin de instrucciones

    OBJETIVO

    D a r a conocer c m o introducir y ejecutar p rogramas en la m e -mor ia .

    INTRODUCCIN Este captulo utiliza un programa del DOS llamado DEBUG, que permite visualizar la memoria, introducir programas en ella y rastrear su ejecucin. El texto explica cmo se pueden introducir estos programas directamente en la memoria en un segmento de cdigo y da una explicacin de cada paso ejecutado. Algunos le