Académique Documents
Professionnel Documents
Culture Documents
Y PROGRAMACIN
PARA
IBM PC Y COMPATIBLES
Tercera edicin
Peter Abel
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
EDICIN
EN
INGLS
PRE-PRESS/MANUFACTURING BUYER:
ACQUISITIONS EDITOR:
EDITORIAL7PRODUCTION SUPERVISIN
A N D INTERIOR DESIGN:
COPY EDITOR;
EDITORIAL ASSISTANT:
SUPLEMENT EDITOR:
ABEL:
LENGUAJE
ENSAMBLADOR
PROGRAMACIN
BILL SCAZZERO
MARCIA HORTON
RICHARD DeLORENZO
BRIAN BAKER
DOLORES MARS
ALICE DWORKIN
PARA
IBM
PC
COMPATIBLES
(3a.
ed.)
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
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
REQUERIMIENTOS DE SOFTWARE DE LA PC
Introduccin 19
Caractersticas del sistema operativo
El proceso de arranque 20
Interfaz DOS-BIOS 21
Programa cargador del sistema 21
19
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
Introduccin 72
Cmo preparar un programa para su ejecucin
Cmo ensamblar un programa fuente 73
73
UN PROGRAMA
Contenido
vii
88
ESCRITURADEPROGRAMAS.COM
106
Introduccin 106
Diferencias entre programas .COM y .EXE
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
88
113
106
112
viii
Contenido
La instruccin C M P 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
136
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
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
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
153
165
Contenido
ix
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
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
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
217
Contenido
Divisin 232
Divisin por medio de corrimientos 236
Cambio (inversin) del signo 237
Procesadores numricos de datos (coprocesadores)
Puntos clave 239
Preguntas 239
237
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
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
Contenido
xi
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
PARA SOPORTE DE DISCOS Y ARCHIVOS
DEL
DOS
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
Introduccin 364
Caracteres comunes de control para impresora 365
DOS 21H, funcin 40H: Imprimir caracteres 365
364
OTRAS
FACILIDADES
DE
Introduccin 377
Caractersticas del ratn 377
Funciones del ratn 378
Operaciones comunes del ratn
Programa para el ratn 385
Puertos 388
Generacin de sonidos 390
Puntos clave 391
Preguntas 392
ENTRADA/SALIDA
379
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
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
SUBPROGRAMAS
Introduccin 411
Segmentos 412
Llamadas intrasegmento 413
Llamadas intersegmento 414
Atributos EXTRN y PUBLIC 415
Atributos EXTERN y PUBLIC para una etiqueta
Uso de PUBLIC en el segmento de cdigo 419
Directivas simplificadas de segmento 421
Datos comunes en subprogramas 423
417
398
Contenido
xiii
Parte G
429
437
454
Captulos de referencia
469
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
Introduccin 480
Interrupciones del DOS 481
Servicio de la INT 21H del DOS
Puntos clave 486
Preguntas 486
27 OPERADORES Y DIRECTIVAS
Introduccin 487
Especificadores de tipo
487
480
481
487
Operadores 488
Directivas 494
28
EL CONJUNTO DE INSTRUCCIONES DE LA PC
Introduccin 514
Notacin de registros 515
Byte del modo de direccionamiento
Instrucciones de dos bytes 517
Instrucciones de tres bytes 517
Instrucciones de cuatro bytes 517
Conjunto de instrucciones 518
515
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
NDICE
PREGUNTAS
SELECCIONADAS
Prefacio
xvi
Prefacio
Prefacio
xvii
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
Prefacio
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.
Introduccin al hardware de la PC
OBJETIVO
E x p l i c a r las caractersticas bsicas del h a r d w a r e de la m i c r o c o m p u t a d o r a y la o r g a n i z a c i n de p r o g r a m a s .
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 captulo 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 instrucciones 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 archivos 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
Introduccin al hardware de la PC
Captulo 1
BITS Y B Y T E S
La unidad ms pequea de informacin en la computadora es el bit. Un bit puede estar no magnetizado, 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:
bits de datos
paridad
Los ocho bits de datos proporcionan la base para la aritmtica binaria y para representar caracteres 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 izquierda, como se muestra aqu para la letra A (ya no nos preocuparemos por el bit de paridad):
Nmero de bit:
6
1
5
0
4
0
3
0
2
0
1
0
0
1
Nmeros binarios
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
0
14
1
13
0
12
1
11
0
9
0
10
0
7
0
8
0
5
0
6
1
4
0
3
0
2
0
0
1
2 0
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:
128
64
32
16
Valor de la posicin:
El primer bit de la derecha toma el valor 1 (2);. el que sigue a la izquierda toma el valor 2 (2 ); el
siguiente el valor 4 (2 ), y as sucesivamente. En este caso el valor del nmero binario es 1 + 2 +
4 + ... + 128 = 255 (o 2 - 1).
En forma similar, el valor del nmero binario 01000001 se calcula como 1 ms 64, o 65:
2
128
64
32
16
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 d e l a P C
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, da valores hasta 65,535, y para 32 bits, 2 - 1, proporciona valores hasta 4,294,967,295.
1 6
32
Aritmtica binaria
La microcomputadora realiza aritmtica slo en formato binario. En consecuencia, el programador 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
0
+1
1
+1
10
1
+1
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
65
+42
107
Binario
01000001
+00101010
01101011
Verifique que la suma binaria 01101011 realmente es 107. Otro ejemplo: sume los valores decimales 60 y 53:
Decimal
Binario
60
+ 53
00111100
+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 embargo, 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
Nmero + 6 5 :
Invertir los bits:
Sumar 1:
Nmero-65:
01000001
10111110
1
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 determinar el valor absoluto de un nmero negativo binario, simplemente repita la operacin anterior, esto es, invierta los bits y sume 1:
Nmero-65:
Invertir los bits:
Sumar 1:
Nmero + 6 5 :
10111111
01000000
1_
01000001
01000001
+10111111
(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 complemento a dos es 11010110:
65
+ (-42)
23
01000001
+11010110
(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
+(-1)
Resultado:
00000001
11111111
(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
+2
+1
0
-1
-2
-3
00000011
00000010
00000001
00000000
11111111
11111110
11111101
Introduccin a l h a r d w a r e d e l a P C
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 binario, en memoria (una palabra doble). Aunque un byte puede tener cualquiera de las 256 combinaciones 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
11
12
14
Decimal:
Puesto que los nmeros 11, 12 y 14 necesitan 2 dgitos, se extiende el sistema de numeracin 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.
Binario
Decimal
Hexadecimal
Binario
Decimal
Hexadecimal
')
0000
0001
0010
0011
0100
0101
0110
0111
0
1
2
3
4
5
6
7
Figura 1-1
0
1
2
3
4
5
6
7
1000
1001
1010
1011
1100
1101
1110
1111
8
9
10
11
12
13
14
15
8
9
A
B
C
D
E
F
El procesador
6
+4
5
+8
F
+1
F
+F
10
+ 30
FF
+ 1
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 adoptado el cdigo ASCII (American Standard Code for Information Interchange). Un cdigo uniforme 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 smbolos 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 instrucciones adicionales.
Introduccin a l h a r d w a r e d e l a P C
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 desempeo. Puede correr en modo real o en modo protegido para multitareas.
Pentium (o P 5 ) . 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 instrucciones, mientras que la BIU enva instrucciones y datos a la EU. La EU contiene una unidad aritmtico-lgica (ALU), una unidad de control (CU) y varios registros. Estos elementos ejecutan instrucciones 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.
BH
BL
CH
CL
DL
DH
AL
SP
BP
SI
DI
Unidad
de control
del bus
ALU: Unidad
aritmtico-lgica
CU: Unidad
de control
Cola de
instrucciones
Registro
de banderas
Apuntador
de instrucciones
Figura 1-2
del bus
Memoria interna
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, iniciando 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. Cuando 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
768K
C0000
640K
A0000
640
cero
K memoria
(RAM)
00000
Figura 1-3
memoria
superior
memoria
convencional
Introduccin a l h a r d w a r e d e l a P C
10
Captulo 1
R A M . Un programador est preocupado principalmente con la RAM, que sera mejor llamada "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 C 0 M M A N D . C O M
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 C 0 M M A N D . C O M 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, requiere 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), 0 1 . 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,
byte menos significativo
localidad 5613,
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 programe 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 DIRECCIONAMIENTO
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.
11
Segmentos y direccionamiento
Un segmento en modo real puede ser de hasta 64K. Se puede tener cualquier nmero de segmentos; 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 programa. 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 temporalmente 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
Reubicable
en memoria
Segmento de cdigo
Introduccin a l h a r d w a r e d e l a P C
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 desplazamiento 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 desplazamiento de 0032H bytes dentro del segmento de datos.
I
direccin de segmento 045F0H
I
desplazamiento 32H
Por tanto, la localidad real de memoria del byte referido por la instruccin es 04622H:
Direccin del segmento DS:
Desplazamiento:
Direccin real:
045F0H
+0032H
04622H
Note que un programa tiene uno o ms segmentos, los cuales pueden iniciar casi en cualquier 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 proporcionan 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:
Direccin del segmento:
16 bits [0000]
24 bits
Registros
13
Direccionamiento 80386/486/586. En modo real, estos procesadores manejan el direccionamiento 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 desplazamiento de direccin de 32 bits:
16 bits [0000]
Registro de 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
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 programa 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 almacenamiento 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 desplazamiento 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.
riores.
Introduccin al hardware de la PC
Captulo 1
27B3[0]H
Direccin del segmento SS
27B30H
+ 312H
27E42H
312H
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 registros CX, CH y CL, respectivamente.
15
Registros
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:
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 entrada/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 d e l a P C
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).
negativo).
ZF (cero). Indica el resultado de una operacin aritmtica o de comparacin (0 = resultado diferente de cero y 1 = resultado igual a cero).
AF (acarreo auxiliar).
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:
Bandera:
15 14 13 12
11
10
4
A
0
C
Puntos clave
17
Introduccin a l h a r d w a r e d e l a P C
18
Captulo 1
CAPTULO 2
Requerimientos de software de la PC
OBJETIVO
E x p l i c a r e l a m b i e n t e g e n e r a l d e software p a r a l a 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 dispositivos a los recursos de la computadora. Los dispositivos que permite incluyen teclados, pantallas 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
Requerimientos de software de la PC
20
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 D O S
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 I B M D 0 S . C O M .
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 PROCESO 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.
21
10.SYS y MSD0S.SYS
Figura 2-1
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 C 0 M M A N D . C O M , 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 memoria 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.
Requerimientos de software de la PC
22
Programas
de
Captulo 2
usuarios
DOS
BIOS
Hardware/Dispositivos
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 registros. Como consecuencia, sus programas tienen que inicializar el DS con la direccin del segmento de datos, como se ver en el captulo 4.
Ahora examinaremos la pila y despus los segmentos de cdigo y datos.
LA P I L A (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
direccin del segmento de la pila
SP
tope de la pila
I
SS
SP = 28
tope de la pila
5A01
I
SS
direccin del segmento de la pila
SP = 26
tope de la pila
5A01
I
SS
direccin del segmento de la pila
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
SS
direccin del segmento de la pila
5A01
SP = 26
tope de la pila
Requerimientos de software de la PC
24
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
SS
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 programa 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.
DIRECCIONAMIENTO DE PROGRAMAS
Normalmente, los programadores escriben en cdigo simblico y utilizan ensamblador para traducirlo 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 segmento de datos contiene los datos que las instrucciones referencian. El registro IP indica la direccin 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:
Desplazamiento del segmento:
Direccin del dato:
4B10H
+0012H
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) - d e 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:
Desplazamiento en el segmento de datos:
67 05
I I
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.
A01200-,
/
Desplazamiento 0013
I
j
I IB
I
Desplazamiento 0012
Segmento de datos
Figura 2-3
Segmentos y desplazamientos
R e q u e r i m i e n t o s de s o f t w a r e de la PC
26
Captulo 2
;Define
MOV
AX,BX
MOV
AX,
WORDA
MOV
AX,
25
MOV
AX,
[BX]
/Mueve
/Mueve
una
los
los
/Mueve
el
/Mueve
los
por
palabra
contenidos
de
BX
contenidos
de
WORDA
valor
25
contenidos
AX
a
AX
AX
de
la
localidad
especificada
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.
27
Preguntas
PREGUNTAS
2-1.
2-2.
2-3.
2-4.
2-5.
2-6.
2-7.
2-8.
2-9.
2-10.
CAPTULO 3
Ejecucin de instrucciones
OBJETIVO
D a r a c o n o c e r c m o introducir y ejecutar p r o g r a m a s en la m e moria.
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 lectores pueden tener acceso a depuradores sofisticados, como
CODEVIEW o TurboDebugger; sin embargo, usaremos DEBUG, ya que es sencillo de usar y
est disponible en cualquier parte.
En los ejercicios iniciales se inspeccionan los contenidos de reas particulares de la memoria. El primer programa de ejemplo utiliza datos "inmediatos" definidos dentro de las instrucciones para cargar datos en registros y realizar aritmtica. El segundo programa de ejemplo utiliza
datos definidos de forma separada en el segmento de datos. El rastreo de cmo se ejecutan estas
instrucciones da una idea de la operacin de una computadora y la funcin de los registros.
Usted puede empezar sin el conocimiento previo de un lenguaje ensamblador o de uno de
programacin. Todo lo que necesita es una IBM PC o compatible y un disco que contenga el
sistema operativo DOS. No obstante, asumimos que est familiarizado con el arranque de la
computadora, manejo de discos flexibles y la seleccin de discos y archivos.
28
29
El programa DEBUG
EL PROGRAMA DEBUG
El DOS viene con un programa llamado DEBUG que es utilizado para probar y depurar programas ejecutables. Una caracterstica de DEBUG es que despliega todo el cdigo del programa y los
datos en formato hexadecimal, y cualquier dato que se introduzca a la memoria tambin est en
formato hexadecimal. Otra caracterstica es que DEBUG permite ejecutar un programa en modo
de paso sencillo (un paso a la vez), de manera que se pueda ver el efecto de cada instruccin sobre
las localidades de memoria y los registros.
Comandos de DEBUG
DEBUG proporciona un conjunto de comandos que permiten realizar diferentes operaciones tiles. Los comandos que nos interesan en este momento son los siguientes:
A
D
E
G
N
P
Q
R
T
U
W
(comando en maysculas,
DDS:200
(comando en maysculas,
dds:200
(comando en minsculas,
Note que especifica segmentos y desplazamientos con dos puntos (:), en la forma
segmento:desplazamiento. Adems, DEBUG supone que todos los nmeros estn en formato
hexadecimal.
El despliegue de DEBUG
El despliegue de DEBUG consiste en tres partes. A la izquierda est la direccin hexadecimal del
ltimo byte de la izquierda que se despliega en la forma segmento desplazamiento. El rea amplia
del centro es la representacin hexadecimal del rea desplegada. A la derecha est la representacin en ASCII de los bytes que contienen caracteres desplegables, los cuales pueden ayudarlo a
interpretar el rea hexadecimal. En forma de diagrama tenemos:
Ejecucin de i n s t r u c c i o n e s
30
Direccin
|<
Representacin
hexadecimal
Captulo 3
>|<ASCII>|
xxxx:xxlO
xx
xx-xx
xx x
xxxx: xx2 0
xx
xx-xx
xxx
xxxx:xx30
xx
xx-xx
xxx
Cada lnea despliega 16 bytes de memoria. La direccin de la izquierda se refiere slo al ltimo
byte de la izquierda, en la forma segmento desplazamiento; puede contar atravesando la lnea para
determinar la posicin de cada byte. El rea de representacin hexadecimal muestra dos caracteres hexadecimales por cada byte, seguidos por un espacio en blanco por legibilidad. Adems, un
guin separa a los segundos ocho bytes de los primeros ocho, otra vez por legibilidad. As, si
usted necesita localizar el byte en el desplazamiento x x l 3 H , inicie con xxlOH y cuente tres bytes
sucesivos a la derecha.
Este libro hace un uso considerable de DEBUG y explica en detalle sus comandos conforme
se necesitan. El apndice E proporciona una descripcin completa de los comandos de DEBUG.
Inicio con DEBUG
Para empezar con DEBUG, coloque el sistema en el directorio del disco duro que contenga
DEBUG o bien inserte un disco flexible con el DOS que contenga el DEBUG en la unidad por
omisin. Para iniciar el programa, teclee la palabra DEBUG y presione la tecla Enter. DEBUG
debe cargarse del disco a la memoria. Cuando el indicador de DEBUG, un guin (-), aparezca en
la pantalla, DEBUG est listo para recibir sus comandos (esto es un guin, aunque parezca el
cursor). Ahora usemos DEBUG para curiosear por la memoria.
40:10
[y p r e s i o n e
la
tecla
Enter]
63
44
En este ejemplo, los dos bytes en la palabra del estado del equipo contienen los valores hexadecimales
63 y 44. Invierta los bytes (44 63) y convirtalos a binario:
Bit:
15
Binario:
0
14
13
12
1
0
0
11
0
31
10
9
1 0
7
0 0
5
1
4
1
3
0
2
0
0
1 1
DISPOSITIVO
15,14
11-9
7,6
5,4
1
0
[y presione Enter]
xx xx . . -
Los primeros dos bytes mostrados en el desplazamiento 0013H son los kilobytes de memoria en
hexadecimal, con los bytes en secuencia inversa. Aqu estn dos ejemplos que muestran hexadecimales en orden inverso, hexadecimales corregidos y el equivalente en decimal:
HEXADECIMAL INVERSO
HEXADECIMAL CORREGIDO
DECIMAL (K)
00 02
80 02
02 00
02 80
512
640
[y presione Enter]
La pantalla debe mostrar un nmero de serie de siete dgitos seguido, en mquinas convencionales, de una nota de derechos reservados. El nmero de serie se muestra como nmero hexadecimal,
mientras que la nota de derechos reservados es ms reconocible en el rea ASCII a la derecha. La
Ejecucin de instrucciones
32
Captulo 3
nota de derechos reservados puede continuar pasando sobre lo que ya est mostrado; para verla,
basta con presionar D, seguida de la tecla Enter.
Verificacin de la fecha en el ROM BIOS
La fecha de fabricacin de su ROM BIOS inicia en la localidad FFFF5H, registrada como mm/
dd/aa. Para verla, teclee
D
FFFF:5
[y p r e s i o n e
Enter]
El conocimiento de esta fecha puede ser til para determinar la edad y modelo de la computadora.
Verificacin de la identificacin del modelo
Inmediatamente despus de la fecha de fabricacin del ROM BIOS est la identificacin del
modelo en la localidad FFFFEH, o FFFF:E. Aqu estn varias identificaciones de modelos:
CDIGO
MODELO
F8
F9
FA
FB
FC
FE
FF
PS/2 modelos 70 y 80
PC convertible
PS/2 modelo 30
PC-XT (1986)
PC-AT (1984), PC-XT modelo 286, PS/2 modelos 50 y 60, etctera
PC-XT (1982), porttil (1982)
Primera IBM PC
Ahora que ya sabe cmo usar el comando para desplegar informacin, puede ver el contenido de cualquier localidad de almacenamiento. Tambin puede avanzar por la memoria con slo
presionar D de forma repetida: DEBUG muestra de manera sucesiva ocho lneas, continuando a
partir de la ltima operacin D.
Cuando haya terminado de curiosear, introduzca Q (por Quit), para salir de DEBUG o
contine con el ejercicio siguiente.
33
CDIGO
SIMBLICO
EXPLICACIN
B82301
MOV AX,0123
052S00
ADD AX,0025
8BD8
MOV BX, AX
Mover el contenido de AX a BX
03D8
ADD BX, AX
Sumar el contenido de AX a BX
8BCB
MOV CX, BX
Mover el contenido de BX a CX
2BC8
SUB CX, AX
2BC0
SUB AX, AX
Restar AX de AX
90
NOP
No operacin
(limpiar A X ) .
(no hacer n a d a ) .
Puede haber notado que las instrucciones de mquina pueden tener uno, dos o tres bytes de
longitud. El primer byte es la operacin real y cualesquiera otros bytes, si estn presentes, son
operandos: referencia a un valor inmediato, un registro o una localidad de memoria. La ejecucin
del programa empieza con la primera instruccin de mquina y avanza por cada instruccin, una
despus de otra. Al llegar a este punto no esperamos que tenga mucho sentido el cdigo de
mquina. Por ejemplo, en un caso el cdigo de mquina (el primer byte) para mover es B8 hex y
en otro caso el cdigo para mover es 8B hex.
Cmo introducir instrucciones de programa
Iniciamos este ejercicio como lo hicimos con el anterior: teclee el comando DEBUG y presione
Enter. Cuando DEBUG est cargado por completo, despliega su indicacin (-). Para introducir
este programa directamente en memoria, slo teclee la parte de lenguaje de mquina, pero no el
cdigo simblico o la explicacin. Teclee el siguiente comando E (Enter), incluso los espacios en
blanco en dnde se indican:
E CS:1000 B8 23 01 05 25 00
[presione Enter]
CS:100 indica la direccin de memoria inicial en la que los datos se almacenarn -100H (256)
bytes siguiendo al inicio del segmento de cdigo (la direccin de inicio usual para el cdigo de
mquina con DEBUG). El comando E hace que DEBUG almacene cada par de dgitos hexadecimales
en un byte de memoria, desde CS: 100 hasta CS: 105.
El siguiente comando E almacena seis bytes, empezando en CS: 106 a 107, 108, 109, 10A y
10B:
E CS:106 8B D8 03 D8 8B CB
El ltimo comando E almacena cinco bytes, iniciando en CS:10C a 10D, 10E, 10F y 110:
E CS:10C 2B C8 2B C0 90
Si teclea un comando de manera incorrecta, slo reptalo con los valores correctos.
Ejecucin de i n s t r u c c i o n e s
Captulo 3
-E C S : 1 0 0 B8 23 01 05 25 00
-E CS:106 8B D8 03 D8 8B CB
-E C S : 1 0 C 2B C8 2B CO 90
-R
AX=0000
BX=0000
CX=0000
DX=0000
SP=FFEE
BP=0000
SI=0000
DI=0000
D S = 2 1 C 1 E S = 2 1 C 1 S S = 2 1 C 1 C S = 2 1 C 1 IP = 0 1 0 0 N V U P El P L N Z N A PO N C
21C1:0100 B82301
MOV
AX,0123
-T
AX=0123
BX=0000
DS=21C1
ES=21C1
21C1:0103 052500
-T
CX=0000
DX=0000
SP=FFEE
SS=21C1
CS=21C1
IP=0103
ADD
AX.0025
BP=0000
SI=0000
DI=0000
NV UP El PL NZ NA PO NC
AX=0148
BX=0000
DS=21C1
ES=21C1
21C1:0106 8BD8
-T
CX=0000
DX=0000
SP=FFEE
SS=21C1
CS=21C1
IP=0106
MOV
BX,AX
BP=0000
SI=0000
DI=0000
NV UP El PL NZ NA PE NC
AX=0148
BX=0148
DS=21C1
ES=21C1
21C1:0108 03D8
-T
CX=0000
DX=0000
SP=FFEE
SS=21C1
CS=21C1
IP=0108
ADD
BX,AX
BP=0000
SI=0000
DI=0000
NV UP El PL NZ NA PE NC
AX=0148
BX=0290
DS=21C1
ES=21C1
21C1:010A 8BCB
-T
CX=0000
DX=0000
SP=FFEE
SS=21C1
CS=21C1
IP=010A
MOV
CX,BX
BP=0000
SI=0000
DI=0000
NV UP El PL NZ AC PE NC
AX=0148
BX=0290
DS=21C1
ES=21C1
21C1:010C 2BC8
-T
CX=0290
DX=0000
SP=FFEE
SS=21C1
CS=21C1
IP=010C
SUB
CX,AX
BP=0000
SI=0000
DI=0000
NV UP El PL NZ AC PE NC
AX=0148
BX=0290
DS=21C1
ES=21C1
21C1:010E 2BC0
-T
CX=0148
DX=0000
SP=FFEE
SS=21C1
CS=21C1
IP=010E
SUB
AX,AX
BP=0000
SI=0000
DI=0000
NV UP El PL NZ AC PE NC
AX=0000
BX=0290
DS=21C1
ES=21C1
21C1:0110 90
CX=0148
DX=0000
SS=21C1
CS=21C1
NOP
BP=0000
SI=0000
DI=0000
NV UP El PL ZR NA PE NC
Figura 3-1
SP=FFEE
IP=0110
. . .
36
A causa de las diferencias entre las distintas versiones del DOS, el contenido de algunos
registros en su pantalla pueden diferir de los que muestra en la figura 3-1. El registro IP muestra
I P = 0 1 0 0 , indicando que la ejecucin de instrucciones inicia 100H bytes despus del inicio del
segmento de cdigo (por esto se us E CS:100 para introducir el inicio del programa).
El registro de banderas en la figura 3-1 muestra la siguiente configuracin:
NV UP El
PL N Z NA PO NC
Esta configuracin significa no desbordamiento, direccin hacia arriba (o hacia la derecha), interrupcin habilitada, signo positivo, no cero, no acarreo auxiliar, paridad impar y no acarreo,
respectivamente. En este momento, ninguno de estos valores es importante para nosotros.
El comando R tambin muestra en el desplazamiento 0100H la primera instruccin que es
ejecutada. Note que en la figura el registro CS contiene 21C1. Ya que es seguro que su direccin
de segmento CS, difiera de sta, la mostraremos como xxxx para las instrucciones:
xxxx:0100
xxxx indica el inicio del segmento de cdigo como xxxx[0]. El valor xxxx:0100 significa
desplazarse 100H bytes despus de la direccin del segmento CS xxxx[0].
B82301 es el cdigo de mquina que usted introdujo en CS:100.
MOV AX,0123 es la instruccin simblica en ensamblador para el cdigo de mquina. Esta
instruccin significa, en realidad, mover el valor inmediato 0123H al registro AX. DEBUG
ha "desensamblado" las instrucciones de mquina de manera que usted pueda interpretarlas
de manera ms fcil. En captulos posteriores, codificar exclusivamente instrucciones en
cdigo ensamblador.
En este momento, la instruccin MOV no ha sido ejecutada. Para ese propsito, teclee T
(trace, rastrear) y presione la tecla Enter. El cdigo de mquina es B8 (mover al registro AX)
seguido por 2301. La operacin mueve el 23 a la mitad baja (AL) del registro AX y el 01 a la
mitad alta (AH) del registro AX:
AX:
AH
AL
01
23
DEBUG muestra los resultados en los registros. El contenido del registro IP es 0103H, que indica
la ubicacin del desplazamiento en el segmento de cdigo de la siguiente instruccin que ser
ejecutada, a saber:
xxxx:0103
Para ejecutar esta instruccin, introduzca otra T. La instruccin ADD suma 25H a la mitad baja
(AL) del registro AX y 00H a la mitad alta (AH), en realidad suma 0025H al AX. Ahora AX
contiene 0148H y el IP contiene 016H para la siguiente instruccin que ser ejecutada:
xxxx:0106
Teclee otro comando T. La instruccin MOV mueve el contenido del registro AX al registro BX.
Note que despus de mover BX contiene 0148H. AX an contiene 0148H, ya que MOV copia en
lugar de realmente mover los datos de una localidad a otra.
Ejecucin de i n s t r u c c i o n e s
Captulo 3
Ahora teclee de manera sucesiva comandos T para pasar por el resto de las instrucciones.
La instruccin ADD suma el contenido de AX a BX, dando 0290H en BX. Despus el programa
mueve (copia) el contenido de BX a CX, resta AX de CX y resta AX de l mismo. Despus de la
ltima operacin, la bandera de cero se cambia de NZ (no cero) a ZR (cero), para indicar que el
resultado de la ltima operacin fue cero (restar AX de l mismo lo deja en cero).
Si quiere volver a ejecutar estas instrucciones, inicie el registro IP con 100H y rastree otra
vez. Introduzca R IP, introduzca 100 y despus R y el nmero requerido de comandos T, todos
seguidos por la tecla Enter.
Cmo mostrar el contenido de memoria
Aunque tambin puede presionar T para la ltima instruccin, NOP (no operacin), esta instruccin no realiza cosa alguna. En lugar de eso, para ver el programa en lenguaje de mquina en el
segmento de cdigo, requiere un despliegue como:
D
CS:100
Ahora DEBUG muestra 16 bytes (32 dgitos hexadecimales) de datos en cada lnea. A la derecha
est la representacin ASCII (si es imprimible) de cada byte (pareja de dgitos hexadecimales). En
el caso de cdigo de mquina, la representacin ASCII carece de significado y puede ser ignorada. Secciones posteriores estudian con mayor detalle el lado correcto del despliegue.
La primera lnea del despliegue inicia en el desplazamiento 100H del segmento de cdigo y
representa el contenido de las localidades CS:100 hasta CS:10F. La segunda lnea representa el
contenido de CS:110 hasta CS:11F. Aunque su programa termina en CS:110, el comando D en
forma automtica muestra ocho lneas desde CS:100 hasta CS:170.
La figura 3-2 muestra los resultados del comando D CS:100. Esperemos que el cdigo de
mquina desde CS:100 hasta 110 sea idntico al que muestre su pantalla; los bytes que siguen
pueden contener algo. Tambin, la figura (3-1) muestra que los registros DS, ES, SS y CS todos
contienen la misma direccin. Esto es porque DEBUG trata el rea de programa como un segmento, con cdigo y datos (si existen) en el mismo segmento, aunque usted debe mantenerlos separados.
Introduzca Q (Quit) para terminar la sesin con DEBUG, o contine con el ejercicio siguiente.
-D CS:100
21C1:0100
2101:0110
2101:0120
21C1:0130
21C1:0140
21C1:0150
21C1:0160
21C1:0170
B 8 23
90 3
B 8 01
E 8 88
F F 74
75 3 2
50 8B
C D 8B
01
8D
00
15
3A
Al
76
E5
05
46
50
8B
89
16
28
30
25
14
FF
E5
46
12
FF
E4
00
50
76
FF
06
2D
74
3D
8B
51
32
36
E8
01
3A
0D
Figura 3-2
D852FF182200A300-
03
FF
76
12
CE
8B
16
74
D8
76
30
FF
8B
1E
12
0A
8B
28
FF
36
E5
18
89
83
CB
E8
76
16
30
12
1E
06
2B
74
2E
12
E4
83
18
16
C8
00
FF
8B
3D
DB
12
12
2B
8B
76
76
0A
00
E8
01
CO
E5
28
28
00
53
FA
83
.#. .%
+ . +.
...F.PQR.v(.t
. . . P . v 2 . v O . v . '.v\
6. . . 6 . . v (
. t : . F 0 .
U 2 . .
. -
P.v(.t:
...0.-..t
37
CONTENIDO HEXADECIMAL
0200H
2301H
0202H
2500H
0204H
0000H
0206H
2A2A2AH
Recuerde que un dgito hexadecimal ocupa medio byte, as que, por ejemplo, 23H (el primer byte)
es almacenado en el desplazamiento 0200H del rea de datos y 01H (el segundo byte) es almacenado en el desplazamiento 0201H. A continuacin estn las instrucciones en lenguaje de mquina
que procesan estos datos:
INSTRUCCIN
EXPLICACIN
A10002
03060202
A30402
90
No operacin.
Puede haber notado que las dos instrucciones para mover tienen diferentes cdigos de mquina:
Al y A 3 . El cdigo real de mquina es dependiente de los registros a los que est referenciando,
Ejecucin de instrucciones
Captulo 3
DS:0200
23
01
25
00
DS:0206
2A
2A
2A
00
00
[presione
[presione
Enter]
Enter]
Ahora utilice el comando E para teclear las instrucciones, otra vez iniciando en CS: 100:
E
CS:100
Al
00
02
03
CS:107
A3
A4
02
90
06
02
02
[presione
[presione
Enter]
Enter]
El primes comando E almacena las tres palabras (seis bytes) en el inicio del rea de datos,
DS:0200. Note que tiene que introducir estas palabras con los bytes en orden inverso, de manera
que 0123 es 2301 y 0025 es 2500. Cuando la instruccin MOV accesa de manera secuencial estas
palabras y las carga en un registro, "deshace la inversin", es decir, vuelve a invertir el orden de
los bytes, de modo que 2301 se convierte en 0123 y 2500 en 0025.
El segundo comando E almacena tres asteriscos (***), definidos como 2A2A2A, de modo
que usted pueda verlos ms tarde utilizando el comando D (Display, mostrar). De lo contrario,
estos asteriscos no sirven para algn propsito particular en el segmento de datos.
La figura 3-3 muestra todos los pasos en el programa, incluyendo los comandos E. Su
pantalla debe mostrar resultados parecidos, aunque las direcciones en el CS y DS tal vez puedan
diferir. Para examinar los datos almacenados (en DS:200H a 208H) y las instrucciones (en CS: 100H
a 10AH), teclee los siguientes comandos D:
Para ver
los
Para ver
el
datos:
DS:200,208
[presione
Enter]
cdigo:
CS:100,10A
[presione
Enter]
Verifique que los contenidos de ambas reas (distintas a las direcciones de segmento) sean idnticas a las que se muestran en la figura 3-3.
Cmo ejecutar instrucciones de programa
Puede ejecutar las instrucciones mostradas en la forma que ya se dijo. Presione R para ver el
contenido de los registros y de las banderas y para mostrar la primera instruccin. Los registros contienen los mismos valores que al inicio del primer ejemplo. La primera instruccin mostrada es:
xxxx:0100
A10002
MOV AX,
[0200]
CS:0100 hace referencia a su primera instruccin, A10002. DEBUG interpreta esta instruccin como un MOV y determina que la referencia es a la primera localidad [0200H] en el rea de
datos. Los corchetes son para indicarle que esta referencia es a una direccin de memoria y no es
39
-E DS:200 23 01 25 00 00 00
-E DS:206 2A 2A 2A
-E CS:100 Al 00 02 03 06 02 02
-E CS:107 A3 04 02 90
-D DS:200,208
21C1:0200
23 01 25 00 00 00 2A 2A -2A
-D CS:100,10A
21C1:0100
Al 00 02 03 06 02 02 A3 -04 02 90
-R
AX=0000
BX=0000
DS=21C1
ES=21C1
21C1:0100 A10002
-T
#.%...***
CX=0000
DX=0000 SP=FFEE
SS=21C1
CS=21C1 IP=0100
MOV
AX, [0200]
SI=0000
DI=0000
BP=0000
NV UP El PL NZ NA PO NC
DS:0200=0123
AX=0123
BX=0000 CX=0000
DX=0000 SP=FFEE
DS=21C1
ES=21C1 SS=21C1
CS=21C1 IP=0103
21C1:0103 03060202
ADD
AX, [0202]
-T
SI=0000
DI=0000
BP=0000
NV UP El PL NZ NA PO NC
DS:0202=0025
AX=0148
BX=0000
DS=21C1
ES=21C1
21C1:0107 A30402
-T
CX=0000
DX=0000 SP=FFEE
IP=0107
SS=21C1
CS=21C1
MOV
[0204] ,AX
SI=0000
DI=0000
BP=0000
NV UP El PL NZ NA PE NC
DS:0204=0000
AX=0148
BX=0000 CX=0000
DX=0000 SP=FFEE
DS=21C1
ES=21C1 SS=21C1
IP=010A
CS=21C1
21C1:010A 90
NOP
-D DS:0200,0208
21C1:0000
23 01 25 00 48 01 2A 2A -2A
-Q
SI=0000
DI=0000
BP=0000
NV UP El PL NZ NA PE NC
Figura 3-3
#.%.H.***
un valor inmediato. (Un valor inmediato para mover 0200H al registro AX aparecera como MOV
AX,0200.)
Ahora teclee el comando T (trace, rastrear). La instruccin MOV AX,[0200] mueve el contenido de la palabra en el desplazamiento 0200H al registro AX. El contenido es 2301H, el cual
aparece en orden inverso en el AX como 0123H.
Ingrese otro comando T para provocar la ejecucin de la siguiente instruccin, ADD. La
operacin suma el contenido de la palabra de memoria en DS con desplazamiento 0202 al registro
AX. El resultado en el AX ahora es la suma de 0123H y 0025H, o 0148H.
La siguiente instruccin es MOV [0204],AX. Teclee un comando T para ejecutarla. La
instruccin mueve el contenido del registro AX a la palabra de memoria en DS con desplazamiento 0204H. Para ver los contenidos cambiados de los datos desde 200H hasta 208H, teclee
D DS : 200 , 208 [Enter]
23
01
I
Desplazamiento:
200
25
!
201
00
48
I I
202
203
01
I
204
2A
2A
2A
207
208
I I I
205
206
El valor 0148H es movido del registro AX al rea de datos con desplazamientos 204H y 205H y
es invertido como 4801H. El lado izquierdo de la pantalla muestra los cdigos reales de mquina
40
Ejecucin de instrucciones
Captulo 3
como aparece en memoria. El lado derecho slo ayuda a localizar los caracteres de manera ms
sencilla. Advierta que estos valores hexadecimales son representados a la derecha de la pantalla
por sus equivalentes ASCII. As 23H genera un smbolo de nmero (#) y 25H genera un smbolo
de por ciento (%) mientras que los tres bytes con 2AH generan asteriscos (*).
Ya que no hay ms instrucciones por ejecutar, introduzca Q (quit) para terminar la sesin
con DEBUG o contine con el siguiente ejercicio (y recuerde restablecer el IP a 100).
100
[Enter]
DEBUG muestra el valor del segmento de cdigo y el desplazamiento como xxxx:0100. Teclee
cada instruccin, seguida por Enter. Intente ingresar el programa siguiente:
MOV
AL, 25
[Enter]
MOV
B L , 32
[Enter]
ADD
AL, BL
[Enter]
NOP
[Enter,
Cuando haya tecleado el programa, presione otra vez Enter para salirse del comando A. Esto es,
un Enter extra, que le indica a DEBUG que ya no tiene ms instrucciones simblicas por ingresar.
Al terminar, DEBUG debe mostrar lo siguiente:
xxxx: 0100
MOV
AL, 25
xxxx:0102
MOV
BL,32
xxxx:0104
ADD
AL, BL
xxxx:0106
NOP
Puede ver que DEBUG ha determinado la localidad de inicio de cada instruccin. Pero antes de
ejecutar el programa, usemos el comando U (Unassemble, desensamblar) de DEBUG para examinar el lenguaje de mquina generado.
41
[Enter]
La pantalla debe mostrar columnas para la localidad, el cdigo de mquina y el cdigo simblico:
xxxx: 0100
B025
MOV
AL, 25
xxxx: 0102
B332
MOV
BL,32
xxxx: 0104
00D8
ADD
AL, BL
xxxx: 0106
90
NOP
Ahora rastree la ejecucin del programa; el cdigo de mquina es lo que en realidad se ejecuta.
Empiece por introducir R para desplegar los registros y la primer instruccin, y despus T de
manera sucesiva para rastrear las instrucciones subsecuentes. Cuando llegue a NOP de la localidad 106H, contine con el ejercicio siguiente o presione Q para salir de la ejecucin.
Ahora puede ver cmo ingresar un programa en cualquiera de los dos, lenguaje de mquina
o lenguaje ensamblador. Sin embargo, DEBUG est proyectado para lo que su nombre implica
depurar (debug) programas y la mayora de los esfuerzos que involucrarn el uso de lenguaje
ensamblador convencional no estn asociados con DEBUG.
AH,30
INT
21
NOP
Ejecucin de instrucciones
Captulo 3
Para rastrear la ejecucin de las instrucciones, primero ingrese R para ver los registros y T para
rastrear MOV. En lugar de rastrear la instruccin INT, ingrese P (Proceed, proceder) para ejecutar toda la rutina del DOS. El proceso termina con la instruccin NOP. Ahora puede ver en el AL
el nmero principal de la versin del DOS, como X en DOS X.20, y en el AH el nmero secundario de la versin, como 14H (o 20) en DOS X.20.
Presione Q para salir o contine con el ejercicio siguiente (y restablezca el IP a 100).
Cmo obtener la fecha actual
Ahora que ya sabe cmo accesar el nmero de versin del DOS, puede utilizar un enfoque semejante para accesar la fecha actual. La instruccin para este propsito es INT 21H del DOS,
funcin 2AH. Una vez ms, ingrese el comando A 100 de DEBUG y despus el programa siguiente de ensamblador:
MOV
AH.2A
INT
21
NOP
Ingrese R para mostrar los registros y R para ejecutar MOV. Despus ingrese P para proceder con
la rutina de interrupcin; la operacin se detiene en la instruccin NOP. Los registros muestran
esta informacin:
AL:
CX:
DH:
DL:
12
NOP
Ingrese R para mostrar los registros y la primera instruccin. La instruccin, INT 12H, transfiere
el control a una rutina en el BIOS que entrega el tamao de la memoria al AX. Presione T (y
Enter) de forma repetida para ver cada instruccin del BIOS que se ejecuta (s, estamos violando
una regla contra el rastreo de una interrupcin, pero esta vez todo funciona bien).
Las instrucciones reales en su BIOS pueden diferir de stas, dependiendo de la versin
instalada (los comentarios a la derecha son del autor):
43
STI
PUSH
DS
MOV
AX,0040
;Segmento 4 0 [0]H
MOV
DS, AX
; ms
MOV
AX,[0013]
POP
DS
IRET
desplazamiento
0013H
, Restaura la direccin en el DS
, Regresa de la interrupcin
MOV AL, 25
xxxx: 0102
MOV BL, 32
xxxx:0104
ADD AL, BL
xxxx:0106
NOP
Puesto que la ltima instruccin, NOP, es de un byte, el tamao del programa es de 7 bytes,
desde 100H hasta 106H, inclusive.
Primero utilice R BX para mostrar el BX, e ingrese 0 para limpiarlo.
Ahora use R CX para mostrar el registro CX. DEBUG responde con CX 0000 (valor
cero) y usted contesta con el tamao del programa, 7.
Grabe el programa revisado: W [Enter].
Ejecucin de instrucciones
44
Captulo 3
La razn para limpiar el BX es porque la longitud del programa est en la pareja BX:CX,
aunque el CX es adecuado para nuestros propsitos.
DEBUG muestra un mensaje "Writing nnnn bytes" (Se escribieron nnnn bytes). Si el nmero es cero, se ha equivocado al introducir la longitud del programa; intntelo otra vez. Tenga
cuidado en el tamao del programa, ya que la ltima instruccin puede ser mayor de un byte.
MOV
AX, [ H A ]
103
ADD
AX,[11C]
107
ADD
AX,25
10A
MOV
10D
MOV
WORD
PTR
[120] ,25
113
MOV
BYTE
PTR
[122] ,30
118
NOP
119
NOP
H A
DB
14 23
11C
DB
05
00
H E
DB
00
00
120
DB
00 00
[ H E ] ,AX
00
45
Preguntas
11 A: Define los valores de byte 14H y 23H. DB significa "definir byte(s)" y le permite definir
datos que sus instrucciones (como la que est en 100) estn referenciando
11C, 11E y 120:
Para ejecutar este programa, primero teclee A 100 [Enter], y despus teclee cada instruccin simblica (pero no la localidad). Al terminar, teclee un Enter adicional para salir del comando A. Empiece por introducir R para mostrar los registros y la primera instruccin; despus
ingrese de manera sucesiva comandos T. Salga de la ejecucin cuando llegue a NOP en 118.
Teclee D 110 para mostrar los contenidos cambiados de AX (233E) y de las localidades 11EH11FH (3E23), 120H-121H (2500) y 122H (30).
PUNTOS CLAVE
El programa DEBUG es til para probar y depurar programas escritos en lenguaje de mquina
y en lenguaje ensamblador.
DEBUG proporciona un conjunto de comandos que permiten realizar diferentes operaciones
tiles, como desplegar, introducir y rastrear.
Como DEBUG no distingue entre letras minsculas y maysculas, puede introducir los
comandos de cualquier forma.
DEBUG supone que todos los nmeros estn en formato hexadecimal.
Si usted introduce un valor incorrecto en el segmento de datos o en el segmento de cdigo,
vuelva a introducir el comando E para corregirlo.
Para reasumir la ejecucin en la primera instruccin, asigne al registro de apuntador de
instruccin (IP) un 0100. Teclee el comando R (registro), seguido por el registro designado,
como R IP [Enter], DEBUG muestra el contenido de IP y espera otra entrada. Teclee el
valor 0100 (seguido por Enter).
PREGUNTAS
3-1. Cul es el propsito de cada uno de los siguientes comandos de DEBUG? (a) A; (b) D; (c) E; (d) P;
(e) Q; (f) R; (g) T; (h) U.
3-2. Proporcione los comandos de DEBUG para las siguientes necesidades.
(a) Muestre la memoria iniciando en el desplazamiento 264H en el segmento de datos.
(b) Muestre la memoria iniciando en la localidad 410H. (Nota: Separe esta direccin en los valores
de su segmento y del desplazamiento.)
(c) Ingrese el valor hexadecimal A8B364 en el segmento de datos iniciando en la localidad 200H.
(d) Muestre el contenido de (i) todos los registros y (ii) slo del registro IP.
(e) Desensamble el cdigo de mquina que se encuentra en las localidades desde la 100H hasta
11EH.
3-3. Proporcione instrucciones en cdigo de mquina para las siguientes operaciones: (a) Mover el valor
4629 hexadecimal al registro AX; (b) sumar el valor hexadecimal 036A al registro AX.
Ejecucin de instrucciones
Captulo 3
01
05 25
00
El valor 45 hexadecimal supuestamente era 54. Codifique otro comando E para corregir slo el byte
que est incorrecto; esto es, cambie el 45 por el 54 de forma directa.
3-5. Suponga que ha utilizado DEBUG para introducir el comando E siguiente:
E C S : 1 0 0 B8
04 30
05
00
30
90
(a) Cules son las tres instrucciones simblicas representadas aqu? (El primer programa en este
captulo da una pista.)
(b) Al ejecutar este programa, usted descubre que el registro AX termina con 6004 en lugar del
esperado 0460. Cul es el error y cmo lo corregira?
(c) Habiendo corregido las instrucciones, usted ahora vuelve a ejecutar el programa desde la primera
instruccin. Cules son los dos comandos de DEBUG que se requieren?
3-6. Considere el programa en lenguaje de mquina
B 0 25 DO E 0 B3
15 F 6 E3
90
C d i g o de m q u i n a
(en
100H) :
Datos
(en
200H):
A0
25
00
15
02
DO
00
E0
F6
26
01
02
A3
02
02
90
00
3-8. Para la pregunta 3-7, codifique los comandos que graben el programa en disco con el nombre
TRIAL.COM.
3-9. Utilice el comando A de DEBUG para introducir las siguientes instrucciones:
MOV
BX,25
ADD
BX,30
47
Preguntas
SHL
BX,01
SUB
BX,22
NOP
Desensamble las instrucciones y rastree su ejecucin hasta NOP y revise el valor en el BX despus de
cada instruccin.
3-10. Cul es el propsito de la instruccin INT?
CAPTULO 4
Requerimientos de lenguaje
ensamblador
OBJETIVO
C u b r i r los r e q u e r i m i e n t o s bsicos p a r a codificar u n p r o g r a m a e n
lenguaje e n s a m b l a d o r y definir los e l e m e n t o s de d a t o s .
INTRODUCCIN
El captulo 3 mostr cmo usar DEBUG para teclear y ejecutar programas en lenguaje de mquina. Sin duda usted fue muy consciente de la dificultad de descifrar el cdigo de mquina, aun para
un programa pequeo. Probablemente ningn programa se codifica ms en serio en lenguaje de
mquina que los programas ms pequeos. Un nivel ms alto de codificacin es el nivel ensamblador,
en el que un programador utiliza instrucciones simblicas en lugar de instrucciones de mquina y
nombres descriptivos para los elementos de datos y para las localidades de memoria. Usted escribe un programa en ensamblador de acuerdo con un conjunto estricto de reglas que despus utiliza
el programa traductor de ensamblador para convertir el programa en ensamblador en cdigo de
mquina.
En este captulo explicamos los requisitos bsicos para desarrollar un programa en
ensamblador: el uso de comentarios, el formato general de codificacin, las directivas de impresin del listado de un programa y las directivas para definir segmentos y procedimientos. Tambin
cubrimos la organizacin general de un programa, incluyendo la inicializacin y la terminacin de
su ejecucin. Por ltimo, tratamos los requisitos para definir elementos de datos.
48
49
ENSAMBLADORES Y COMPILADORES
Primero identificamos dos clases de lenguajes de programacin: de alto nivel y de bajo nivel. Los
programadores que escriben en un lenguaje de alto nivel, como C y Pascal, codifican comandos
poderosos, cada uno de los cuales puede generar muchas instrucciones en lenguaje de mquina.
Por otro lado, los programadores que escriben en un lenguaje ensamblador de bajo nivel codifican
instrucciones simblicas, cada una de las cuales genera una instruccin en lenguaje de mquina. A
pesar del hecho de que codificar en un lenguaje de alto nivel es ms productivo, algunas ventajas
de codificar en lenguaje ensamblador son:
Proporciona ms control sobre el manejo particular de los requerimientos de hardware.
Genera mdulos ejecutables ms pequeos y ms compactos.
Con mayor probabilidad tiene una ejecucin ms rpida.
Una prctica comn es combinar los beneficios de ambos niveles de programacin: codificar el grueso de un proyecto en un lenguaje de alto nivel y los mdulos crticos (aquellos que
provocan notables retardos) en lenguaje ensamblador.
Sin importar el lenguaje de programacin que utilice, de todos modos es un lenguaje simblico que tiene que traducirse a una forma que la computadora pueda ejecutar. Un lenguaje de alto
nivel utiliza un compilador para traducir el cdigo fuente a lenguaje de mquina (tcnicamente,
cdigo objeto). Un lenguaje de bajo nivel utiliza un ensamblador para realizar la traduccin. Un
programa enlazador para ambos niveles, alto y bajo, completa el proceso al convertir el cdigo
objeto en lenguaje ejecutable de mquina.
2.
A D D AX,BX
50
Captulo A
PALABRAS RESERVADAS
Ciertas palabras en lenguaje ensamblador estn reservadas para sus propsitos propios, y son
usadas slo bajo condiciones especiales. Por categoras, las palabras reservadas incluyen
instrucciones, como MOV y ADD, que son operaciones que la computadora puede ejecutar;
directivas, como END o SEGMENT, que se emplean para proporcionar comandos al
ensamblador;
operadores, como FAR y SIZE, que se utilizan en expresiones; y
smbolos predefinidos, como Data y @Model, que regresan informacin a su programa.
El uso de una palabra reservada para un propsito equivocado provoca que el ensamblador
genere un mensaje de error. El apndice C muestra una lista de las palabras reservadas del
lenguaje ensamblador.
IDENTIFIC ADORES
Un identificador es un nombre que se aplica a elementos en el programa. Los dos tipos de identificadores son: nombre, que se refiere a la direccin de un elemento de dato, y etiqueta, que se
refiere a la direccin de una instruccin. Las mismas reglas se aplican tanto para los, nombres
como para las etiquetas. Un identificador puede utilizar los siguientes caracteres:
Letras del alfabeto:
desde la A hasta la Z
Dgitos:
Caracteres especiales
El primer carcter de un identificador debe ser una letra o un carcter especial, excepto el punto.
Ya que el ensamblador utiliza algunos smbolos especiales en palabras que inician con el smbolo
@, debe evitar usarlo en sus definiciones.
El ensamblador trata las letras maysculas y minsculas como iguales. La longitud mxima
de un identificador es de 31 caracteres (247 desde el MASM 6.0). Ejemplos de nombres vlidos
son COUNT, PAGE25 y $E10. Se recomienda que los nombres sean descriptivos y con significado. Los nombres de registros, como AX, DI y AL, estn reservados para hacer referencia a esos
mismos registros. En consecuencia, en una instruccin tal como:
ADD
AX,BX
51
Instrucciones
el ensamblador sabe de forma automtica que AX y BX se refieren a los registros. Sin embargo,
en una instruccin como:
MOV
REGSAVE,AX
el ensamblador puede reconocer el nombre REGSAVE slo si se define en algn lugar del
programa.
INSTRUCCIONES
Un programa en lenguaje ensamblador consiste en un conjunto de enunciados. Los dos tipos de
enunciados son:
1.
2.
instrucciones, tal como MOV y ADD, que el ensamblador traduce a cdigo objeto; y
directivas, que indican al ensamblador que realice una accin especfica, como definir un
elemento de dato.
A continuacin est el formato general de un enunciado, en donde los corchetes indican una
entrada opcional:
[identificador]
operacin
[operando(s)]
[;comentario]
Un identificador (si existe), una operacin y un operando (si existe) estn separados por al
menos un espacio en blanco o un carcter de tabulador. Existe un mximo de 132 caracteres en
una lnea (512 desde el MASM 6.0), aunque la mayora de los programadores prefiere permanecer en los 80 caracteres ya que es el nmero mximo que cabe en la pantalla. A continuacin se
presentan dos ejemplos de enunciados:
IDENTIFICADOR
Directiva:
COUNT
Instruccin:
OPERACIN
OPERANDO
COMENTARIO
DB
/Nombre,
operacin,
MOV
AX, 0
,-Operacin,
operando
dos operandos
52
Captulo 4
Operando
El operando (si existe) proporciona informacin para la operacin que acta sobre l. Para un
elemento de datos, el operando identifica su valor inicial. Por ejemplo, en la definicin siguiente
de un elemento de datos llamado COUNTER, la operacin DB significa "definir byte", y el
operando inicializa su contenido con un valor cero:
NOMBRE
OPERACIN
OPERANDO
COUNTER
DB
COMENTARIO
,-Define
un
byte
(DB)
con
el
valor
cero
Para una instruccin, un operando indica en dnde realizar la accin. Un operando de una
instruccin puede tener una, dos o tal vez ninguna entrada. Aqu estn tres ejemplos:
OPERACIN
OPERANDO
RET
COMENTARIO
OPERANDO
/Regresa
Ninguno
INC
CX
/Incrementa
el
ADD
AX.12
/Suma
registro AX
12
al
registro
CX
Uno
Dos
DIRECTIVAS
El lenguaje ensamblador permite usar diferentes enunciados que permiten controlar la manera en
que un programa ensambla y lista. Estos enunciados, llamados directivas, actan slo durante el
ensamblado de un programa y no generan cdigo ejecutable de mquina. Las directivas ms
comunes son explicadas en las siguientes secciones. El captulo 27 trata con detalle todas las
directivas; en cualquier momento usted puede utilizar ese captulo como referencia.
Directivas p a r a listar: P A G E y T I T L E
Las directivas PAGE y TITLE ayudan a controlar el formato de un listado de un programa en
ensamblador. ste es su nico fin, y no tienen efecto sobre la ejecucin subsecuente del programa.
P A G E . Al inicio de un programa, la directiva PAGE designa el nmero mximo de lneas
para listar en una pgina y el nmero mximo de caracteres en una lnea. Su formato general es
PAGE
[ l o n g i t u d ] [, a n c h o ]
El ejemplo siguiente proporciona 60 lneas por pgina y 132 caracteres por lnea:
PAGE
SO,132
El nmero de lneas por pgina puede variar desde 10 hasta 255, mientras que el nmero de
caracteres por lnea desde 60 hasta 132. La omisin de un enunciado PAGE causa que el ensamblador
tome PAGE 50,80.
Suponga que el nmero de lneas para PAGE se defini como 60. Entonces, cuando el
programa ensamblado haya listado 60 lneas avanza las formas al inicio de la siguiente pgina e
incrementa en uno el contador de pginas. Tambin puede usted querer forzar un salto de pgina
53
Directivas
en una lnea especfica en el listado del programa, como al final de un segmento. En la lnea
requerida, slo codifique PAGE sin operandos. Al encontrar PAGE el ensamblador salta la pgina
de manera automtica y reasume la impresin en la parte superior (al inicio) de la siguiente pgina.
TITLE. Se puede emplear la directiva TITLE para hacer que un ttulo para un programa
se imprima en la lnea 2 de cada pgina en el listado del programa. Puede codificar TITLE de una
vez, al inicio del programa. Su formato general es
TITLE
texto
Para el operando texto, una tcnica recomendada es utilizar el nombre del programa como
se registra en el disco. Por ejemplo, si a su programa le puso por nombre ASMSORT, codifique
el nombre ms un comentario descriptivo opcional, hasta 60 caracteres, como esto:
TITLE A S M S O R T Programa en ensamblador para ordenar los nombres de
los clientes
Directiva SEGMENT
Un programa ensamblado en formato .EXE consiste en uno o ms segmentos. Un segmento de
pila define el almacn de la pila, un segmento de datos define los elementos de da os y un segmento de cdigo proporciona un cdigo ejecutable. Las directivas para definir un segmento, SEGMENT
y ENDS, tienen el formato siguiente:
r
NOMBRE
OPERACIN
OPERANDO
nombre
SEGMENT
[opciones]
nombre
ENDS
COMENTARIO
;Inicia el
;Fin del
segmento
segmento
El enunciado SEGMENT define el inicio de un segmento. El nombre del segmento debe estar
presente, ser nico y cumplir las convenciones para nombres del lenguaje. El enunciado ENDS
indica el final del segmento y contiene el mismo nombre del enunciado SEGMENT. El tamao
mximo de un segmento es 64K. El operando de un enunciado SEGMENT puede tener tres tipos
de opciones: alineacin, combinar y clase, codificadas en este formato:
nombre
SEGMENT
alineacin
combinar
'clase'
Tipo alineacin. La entrada alineacin indica el lmite en el que inicia el segmento. Para
el requerimiento tpico, PARA, alinea el segmento con el lmite de un prrafo, de manera que la
direccin inicial es divisible entre 16, o 10H. En ausencia de un operando hace que el ensamblador
por omisin tome PARA.
Tipo combinar. La entrada combinar indica si se combina el segmento con otros segmentos cuando son enlazados despus de ensamblar (se explica posteriormente en "Cmo enlazar el
programa"). Los tipos combinar son STACK, COMMON, PUBLIC y la expresin AT. Por
ejemplo, el segmento de la pila por lo comn es definido como
nombre
SEGMENT
PARA
STACK
Captulo 4
SEGMENT
PARA
STACK
<Stack'
La parte del programa en la figura 4-1 ilustra enunciados SEGMENT con varias opciones.
Directiva P R O C
El segmento de cdigo contiene el cdigo ejecutable de un programa. Tambin tiene uno o ms
procedimientos, definidos con la directiva PROC. Un segmento que tiene slo un procedimiento
puede aparecer como sigue:
NOMBRE
OPERACIN
OPERANDO
nomsegmto
SEGMENT
PARA
nomproc
PROC
FAR
COMENTARIO
Un
procedimiento
dentro
del
nomproc
ENDP
nomsegmto
ENDS
de
segmento
cdigo
El nombre del procedimiento debe estar presente, ser nico y seguir las reglas para la formacin
de nombres del lenguaje. El operando FAR en este caso est relacionado con la ejecucin del
programa. Cuando usted solicita la ejecucin de un programa, el cargador de programas del DOS
utiliza este nombre de procedimiento como el punto de entrada para la primera instruccin a
ejecutar.
La directiva E N D P indica el fin de un procedimiento y contiene el mismo nombre que el
enunciado PROC para permitir que el ensamblador relacione a los dos. Ya que los procedimientos
deben estar por completo dentro de un segmento, ENDP define el final de un procedimiento antes
que ENDS defina el final de un segmento.
El segmento de cdigo puede contener cualquier nmero de procedimientos usados como
subrutinas, cada uno de los cuales va con su caracterstico conjunto de enunciados PROC y
E N D P . Cada PROC adicional por lo comn se codifica con (o por omisin) el operando NEAR;
el captulo 7 analiza esta situacin.
Directiva A S S U M E
Un programa utiliza al registro SS para direccionar la pila, al registro DS para direccionar el
segmento de datos y al registro CS para direccionar el segmento de cdigo. Para este fin, usted
tiene que indicar al ensamblador el propsito de cada segmento en el programa. La directiva para
este propsito es ASSUME, codificada en el segmento de cdigo como sigue:
55
OPERANDO
SS:nompila,DS: nomsegdatos,CS:nomsegcdigo,
. .
SS:nompila significa que el ensamblador asocia el nombre del segmento de la pila con el registro
SS, y de manera similar con los otros operandos mostrados. Los operandos pueden aparecer en
cualquier o r d e n . A S S U M E tambin puede contener una entrada para el E S , tal como
ES:nomsegdatos; si su programa no utiliza el registro ES, puede omitir su referencia o codificar
ES:NOTHING (desde el MASM 6.0, el ensamblador de forma automtica genera un ASSUME
para el segmento de cdigo).
Al igual que otras directivas, ASSUME es slo un mensaje que ayuda al ensamblador a
convertir cdigo simblico a cdigo de mquina; an puede tener que codificar instrucciones que
fsicamente cargan direcciones en registros de segmentos en el momento de la ejecucin.
Directiva END
Como ya se mencion, la directiva ENDS finaliza un segmento y la directiva ENDP finaliza un
procedimiento. Una directiva END finaliza todo el programa. Su formato general es:
OPERACIN
OPERANDO
END
[nomproc]
El operando puede estar en blanco si el programa no es para ejecutarse; por ejemplo, usted puede
ensamblar slo las definiciones de datos o puede querer enlazar el programa con otro mdulo
(principal). En la mayora de los programas, el operando contiene el nombre del primero o nico
PROC designado como FAR, donde inicia la ejecucin del programa.
EXPLICACIN
1
2
3
La directiva PAGE para este listado establece 60 lneas y 132 columnas por pgina.
La directiva TITLE identifica el nombre del programa P04ASM 1.
Las lneas 3, 7 y 11 son comentarios que clarifican la declaracin de los segmentos
definidos.
Estos enunciados definen el segmento de la pila, STACKSG (pero no su contenido,
en este ejemplo).
Estos enunciados definen el segmento de datos, DATASG (pero no su contenido).
Estos enunciados definen el segmento de cdigo, CODESG.
Estos enunciados definen el segmento de cdigo del nico procedimiento, llamado
BEGIN. Este procedimiento ilustra los requisitos comunes de inicializacin y de
salida para un programa .EXE. Los dos requisitos para inicializar son (1) avisar al
4-6
8-10
12-21
13-20
1
2
3
PAGE
TITLE
60,132
P04ASM1
PARA
STACK
PARA
'Data'
Estructura
de
un
programa
. EXE
STACKSG
SEGMENT
6
7
STACKSG
ENDS
8
g
DATASG
SEGMENT
10
11
12
13
14
15
16
17
18
19
20
21
22
DATASG
ENDS
CODESG
BEGIN
SEGMENT
PROC
ASSUME
MOV
MOV
MOV
INT
ENDP
ENDS
END
AX,4C00H
21H
BEGIN
CODESG
de
datos
;Peticin
;Salida
DOS
15,16
'Stack'
BEGIN
Figura 4-1
14
Captulo 4
SS:STACKSG,DS:DATASG,CS;CODESG
AX,DATASG
MOV
DS,AX
;Obtiene
/Almacena
la
la
direccin
direccin
del
en
segmento
de
datos
DS
57
18,19
22
La secuencia en la que define los segmentos por lo regular no es importante. La figura 4-1
los define como sigue:
STACKSG
SEGMENT
PARA
STACK
DATASG
SEGMENT
PARA
'Data'
CODESG
SEGMENT
PARA
'Code'
'Stack'
Tenga esto en mente: el programa en la figura est codificado en lenguaje simblico. Para
ejecutarlo, usted tiene que usar un programa ensamblador y un enlazador para traducirlo a cdigo
ejecutable de mquina. En ese caso, se convertira en un programa .EXE.
Como se dijo en el captulo 2, cuando el DOS carga un programa .EXE del disco a la memoria para su ejecucin construye un PSP de 256 bytes (100H) en un lmite de prrafo en memoria
interna disponible y almacena el programa inmediatamente despus del lmite. Despus, el DOS
carga la direccin del segmento de cdigo en el CS;
carga la direccin de la pila en el SS; y
carga la direccin del PSP en los registros DS y ES.
El cargador del DOS inicializa los registros CS:IP y SS:IP, pero no los registros DS y ES.
Sin embargo, por lo comn su programa necesita la direccin del segmento de datos en el DS (y
con frecuencia tambin en el ES). Como consecuencia, tiene que inicializar el DS con la direccin
del segmento de datos, como se muestra con las dos instrucciones MOV en la figura 4-1.
Ahora, aunque en este momento esta inicializacin no sea clara, am'mese: cada programa
.EXE tiene virtualmente los mismos pasos de inicializacin que usted puede duplicar cada vez que
codifique un programa en ensamblador.
AH,4CH
;Solicitud de
terminacin
MOV
AL,retcode
INT
21H
; Salir al DOS
58
R e q u e r i m i e n t o s de lenguaje e n s a m b l a d o r
Captulo 4
El cdigo de regreso para una terminacin normal de un programa por lo comn es 0 (cero).
Tambin puede codificar dos MOV como un enunciado (como se muestra en la figura 4-1):
MOV
AX,4C00H
;Peticin
de
terminacin
normal
La funcin 4CH del DOS ha sustituido las operaciones originales de terminacin INT 20H
e INT 21H, funcin OOH.
EJEMPLO DE UN PROGRAMA FUENTE
La figura 4-2 combina la informacin precedente en un programa fuente en ensamblador, sencillo
pero completo, que suma dos elementos de datos en el registro AX.
STACKSG contiene una entrada, DW (definir palabra), que define 32 palabras inicializadas
a cero, un tamao adecuado para la mayora de los programas.
DATASG define tres palabras de datos llamadas FLDA, FLDB y FLDC.
CODESG contiene las instrucciones ejecutables para el programa, aunque el primer enunciado, ASSUME, no genera cdigo ejecutable.
La directiva ASSUME realiza estas operaciones:
Asigna STACKSG al registro SS, de forma que el sistema utilice la direccin en el registro
SS para direccionamiento de STACKSG.
Asigna DATASG al registro DS, de modo que el sistema utilice la direccin en el registro
DS para direccionamiento de DATASG.
Asigna CODESG al registro CS, de modo que el sistema utilice la direccin en el registro
CS para direccionamiento de CODESG.
TITLE
STACKSG
page 60,132
P 0 4 A S M 1 (EXE)
Operaciones
de
mover y
sumar
SEGMENT
DW
ENDS
PARA STACK
32 DUP(O)
STACKSG
DATASG
FLDA
FLDB
FLDC
DATASG
SEGMENT
DW
DW
DW
ENDS
PARA
250
125
?
CODESG
BEGIN
SEGMENT
PROC
ASSUME
MOV
MOV
PARA 'Code'
FAR
SS:STACKSG,DS:DATASG,CS:CODESG
AX,DATASG
;Se a s i g n a d i r e c c i n
DS,AX
;
en r e g i s t r o DS
MOV
ADD
MOV
MOV
INT
ENDP
ENDS
END
AX,FLDA
AX,FLDB
FLDC, AX
AX,4C00H
21H
BEGIN
CODESG
F i g u r a 4-2
BEGIN
'Stack'
'Data'
,-Mover 0 2 5 0 a A X
;Sumar 0125 a AX
Almacenar suma en
, S a l i d a a D O S
;Fin
,-Fin
;Fin
de
de
de
de
DATASG
FLDC
procedimiento
segmento
programa
59
Cuando se carga un programa desde el disco a la memoria para su ejecucin, el cargador del
sistema establece las direcciones reales en los registros CS y SS pero, como se mostr por las dos
primeras instrucciones MOV, usted tiene que inicializar el registro DS (y ES).
En el captulo 5 revisaremos el ensamble, enlace y ejecucin de este programa.
SEGMENT
DWORD
USE3 2
La inicializacin del registro del segmento de datos podra parecerse a esto, ya que en estos
procesadores el registro DS an tiene un tamao de 16 bits:
MOV
EAX,DATASEG
MOV
DS,AX
segmento de datos
Las instrucciones STI, CLI, IN y OUT, disponibles en modo real, no estn permitidas en
modo protegido.
modelo de memoria
El modelo de memoria puede ser TINY, SMALL, MDIUM, COMPACT o LARGE (otro modelo, HUGE, no necesitamos tratarlo aqu). Los requisitos para cada modelo son:
MODELO
TINY
SMALL
MDIUM
Ms de 1
Ms de 1
Ms de 1
Ms de 1
COMPACT
LARGE
Puede utilizar cualquiera de estos modelos para un programa autnomo (esto es, un programa que
no est enlazado con algn otro). El modelo TINY est destinado para uso exclusivo de progra-
Captulo 4
mas .COM, los cuales tienen sus datos, cdigo y pila en un segmento. El modelo SMALL exige
que el cdigo quepa en un segmento de 64K y los datos en otro segmento de 64K; este modelo es
adecuado para la mayor parte de los ejemplos de este libro. La directiva .MODEL genera de
forma automtica el enunciado ASSUME necesario.
Los formatos generales (incluyendo el punto inicial) para las directivas que define los segmentos de la pila, de datos y de cdigo son:
.STACK
[tamao]
.DATA
.CODE
[nombre]
Cada una de estas directivas hacen que el ensamblador genere el enunciado SEGMENT necesario
y su correspondiente ENDS. Los nombres por omisin de los segmentos (que usted no tiene que
definir) son STACK, DATA y TEXT (para el segmento de cdigo). El carcter de subrayado al
inicio de DATA y TEXT es intencional. Cuando el formato codificado lo indica, puede no hacer
caso al nombre por omisin del segmento de cdigo. El tamao, por omisin, de la pila es de
1,024 bytes, el cual tambin puede pasarse por alto. Se utilizan estas directivas para identificar en
dnde, en el programa, estn ubicados los tres segmentos. Sin embargo, note que las instrucciones
que ahora usa para inicializar la direccin del segmento de datos en el DS son:
MOV
MOV
AX,datos
DS,AX
La figura 4-2 dio un ejemplo de un programa que utiliza segmentos definidos de modo convencional. La figura 4-3 proporciona el mismo ejemplo, pero esta vez usando las directivas simplifica-
TITLE
page
50,132
P 0 4 A S M 2 (EXE)
FLDA
FLDB
FLDC
.MODEL
. STACK
.DATA
DW
DW
DW
BEGIN
.CODE
PROC
BEGIN
Operaciones
SMALL
G4
de
mover
sumar
;Se
;Se
define la pila
definen los datos
;Se
define
250
125
?
el
segmento
MOV
MOV
FAR
AX,@data
DS,AX
;Se a s i g n a l a d i r e c c i n
;
en el r e g i s t r o DS
MOV
ADD
MOV
AX,FLDA
AX,FLDB
FLDC,AX
; M o v e r 02 5 0 a AX
;Sumar 0 1 2 5 a AX
,-Almacenar s u m a e n
MOV
INT
ENDP
END
AX,4C00H
21H
,-Salida
Figura 4-3
BEGIN
de
de
cdigo
DATASG
FLDC
DOS
;Fin
de
procedimiento
;Fin
de
programa
61
Definicin de datos
DEFINICIN DE DATOS
Como ya se estudi, el propsito del segmento de datos en un programa .EXE es definir constantes, reas de trabajo y reas de entrada/salida. El ensamblador permite la definicin de elementos
de varias longitudes de acuerdo con el conjunto de directivas que defina datos. Por ejemplo, DB
define un byte y DW define una palabra. Un elemento de datos puede contener un valor indefinido
(esto es, no inicializado) o una constante, definida como una cadena de caracteres o como un valor
numrico. A continuacin est el formato general para la definicin de datos:
[nombre]
Dn
expresin
Nombre. Un programa que hace referencia a un elemento de dato lo hace por medio de un
nombre. Por otro lado, el nombre de un elemento es opcional, indicado por los corchetes. La
seccin anterior "Instrucciones", proporciona las reglas para la formacin de los nombres.
Directivas. Las directivas que definen elementos de datos son DB (byte), DW (palabra),
DD (palabra doble), DF (palabra larga), DQ (palabra cudruple) y DT (diez bytes), cada una
indica de manera explcita la longitud del elemento definido.
Expresin. La expresin es un operando que puede contener un signo de interrogacin
para indicar un elemento no utilizado, como
FLDl
DB
;Elemento no
inicializado
En este caso, cuando su programa inicie la ejecucin el valor inicial de F L D l no es conocido por
usted. En la prctica, lo normal antes de usar este elemento es mover algn valor a l (lo que sea,
pero debe ser apropiado al tamao definido).
Tambin puede utilizar el operando para definir una constante, como
FLD2
DB
25
;Elemento
inicializado
R e q u e r i m i e n t o s de l e n g u a j e e n s a m b l a d o r
Captulo '
Puede usar con libertad este valor inicializado en su programa y aun puede cambiar el contenido
de FLD2.
Una expresin puede contener varios valores constantes separados por comas y limitados
slo por la longitud de la lnea, como sigue:
FLD3
DB
11,
12,
13,
14,
15,
16,
El ensamblador define estas constantes en bytes contiguos. Una referencia a FLD3 es a la primera
constante de un byte, 11 (puede pensar en el primer byte como F L D 3 + 0 ) , y una referencia a
FLD3 + 1 es a la segunda constante, 12. Por ejemplo, la instruccin
MOV
AL,FLD3+3
carga el valor 14 (OEH) en el registro AL. Tambin la expresin permite duplicacin de constantes en un enunciado de la forma general
[nombre]
Dn
contador
de
repeticiones
DUP
(expresin)
no
inicializadas
10
DUP(?)
DB
DUP(14)
Cinco
DB
D U P (4
Doce
Diez
D U P (8) )
palabras,
palabras
con
0E0E0E0E0E
hexadecimal
El tercer ejemplo genera cuatro copias del dgito 8 (8888) y duplica l valor tres veces, produciendo en total doce 8.
Una expresin puede definir e inicializar una cadena de caracteres o una constante numrica.
Cadenas de caracteres
Las cadenas de caracteres son usadas para datos descriptivos como nombres de personas y ttulos
de pginas. La cadena est definida dentro de apstrofos, como ' P C , o dentro de comillas, como
" P C " . El ensamblador traduce las cadenas de caracteres en cdigo objeto en formato ASCII
normal.
Extraamente, DB es el nico formato que define una cadena de caracteres que excede a dos
caracteres y los almacena en la secuencia normal de izquierda a derecha. En consecuencia, DB es
el formato convencional para la definicin de datos de caracteres de cualquier longitud. Un ejemplo es
DB
'Cadena
de
caracteres'
El ensamblador almacena los caracteres en formato ASCII, sin apstrofos. Si la cadena debe
contener un apstrofo o una comilla, usted puede definirlo en una de las forma siguientes:
DB
"Honest
Ed's
PC
Emporium"
/Comillas
una
DB
'Honest
Ed''s
PC
Emporium'
/Una
dos
para
comilla
comilla
comillas
la
para
para
cadena,
el
apstrofo
la
seguidas
cadena,
para
el
apstrofo
63
Constantes numricas
Las constantes numricas son usadas para definir valores aritmticos y direcciones de memoria. Las
constantes no estn definidas entre comillas, pero van seguidas por un especificador de base
opcional, tal como H en el valor hexadecimal 12H. Para la mayora de las directivas de definicin
de datos, el ensamblador convierte constantes numricas definidas a hexadecimal y almacena los
bytes generados en cdigo objeto en orden inverso de derecha a izquierda. A continuacin estn
los diferentes formatos numricos.
Decimal. El formato decimal permite definir con los dgitos decimales 0 a 9, seguidos de
manera opcional por el especificador de base D, tal como 125 o 125D. Aunque el ensamblador
permite que usted defina valores en formato decimal, como una conveniencia al codificar, l
convierte sus valores decimales a cdigo objeto binario y los representa en hexadecimal. Por
ejemplo, una definicin del decimal 125 se convierte en 7D hexadecimal.
Hexadecimal. El formato hexadecimal permite definir con los dgitos hexadecimales 0 a F,
seguidos por el especificador de base H, que se puede usar para definir valores binarios. Ya que
el ensamblador espera que una referencia que empiece con una letra es un nombre simblico, el
primer dgito de una constante hexadecimal debe ser 0 a 9. Ejemplos son 2EH y O F D 8 H , que el
ensamblador almacena como 2E y D80F, respectivamente. Note que los bytes en el segundo
ejemplo son almacenados en orden inverso.
Binario. El formato binario permite definir con los dgitos binarios 0 y 1, seguidos por el
especificador de base B. El uso normal del formato binario es para distinguir valores en las
instrucciones de manejo de bits AND, OR, XOR y TEST.
Ya que el ensamblador convierte todos los valores numricos a binario (y los representa en
hexadecimal), las definiciones de 12, C hex y 1100 binario generan el mismo valor: 00001100
binario o 0C hex, dependiendo de cmo vea el contenido del byte.
Cmo las letras D y B actan tanto como especificadores de base como dgitos hexadecimales,
pueden causar alguna confusin. Como solucin, MASM 6.0 introdujo el uso de la T (por ten,
diez) y la Y (por binary, binario) como especificadores de base para decimal y binario, respectivamente.
Real. El ensamblador convierte un valor real dado una constante decimal o hexadecimal
seguida por el especificador de base R en formato de punto flotante para uso con un coprocesador
matemtico.
Asegrese de distinguir entre el uso de las constantes numricas y de caracteres. Una constante de carcter definida como DB ' 1 2 ' genera dos caracteres ASCII, representados como 3132
hex. Una constante numrica definida como 12 genera un nmero binario, representado como
0C hex.
DIRECTIVAS PARA LA DEFINICIN DE DATOS
Las directivas convencionales usadas para definir datos, junto con los nombres introducidos por
MASM 6.0, son:
DESCRIPCIN
Definir
byte(s)
DIRECTIVAS
DIRECTIVAS
CONVENCIONALES
MASM 6.0
DB
BYTE
DW
WORD
doble
DD
DWORD
larga
DF
FWORD
cudruple
DQ
QWORD
DT
TBYTE
Captulo 4
El texto utiliza las directivas convencionales porque su uso es aceptado de manera general.
El programa ensamblado de la figura 4-4 proporciona ejemplos de las directivas que definen
cadenas de caracteres y constantes numricas, con el cdigo objeto generado a la izquierda, el cual
TITLE
0000
0001
0002
0003
0004
000E
001F
0024
00
20
20
59
OOOAt
50 65
61 6 C
70 7 5
33 3 2
01 4A
65 6 2
00
72
20
74
36
61
03
73
43
65
35
6E
4D
6F
6F
72
34
02
61
6E
6D
46
72
p a g e 6 0,132
P 0 4 D E F I N (EXE)
Define data
.MODEL
SMALL
.DATA
Se d e f i n e n B y t e s - D B :
FLD1DB
FLD2DB
FLD3DB
FLD4DB
FLD5DB
FLD6DB
DB
DB
DB
DB
DB
DB
FLD7DB
FLD8DB
DB
DB
Se
0030
0032
0034
0036
0040
004A
004E
0052
005A
005E
0062
006A
0072
007A
0084
008E
FFF0
0059
001F R
0003 0004 0007
0008 0009
0005[ 0000 ]
00000000
00007F3C
O0OOOOOE
00000001
00000031
00005043
0000000000000000
474D00000OOO00O0
3C7FOOOOOOOOOOO0
000000000000000000
00
563412000000000000
00
435000000000000000
00
Figura 4-4
?
32
20H
01011001B
10 DUP(0)
'Personal
items
/No se i n i c i a
/Constante decimal
;Constante hexadecimal
;Constante binaria
/Diez ceros
Computer
;Cadena de caracteres
1
'32654'
/Nmeros como caracteres
0 1 , ' J a n ' , 0 2 , ' F e b ' , 0 3 , 'Mar '
,-Tabla d e m e s e s
definen Words
DW:
FLD1DW
FLD2DW
FLD3DW
FLD4DW
DW
DW
DW
DW
0FFF0H
01011001B
FLD7DB
3,4,7,8,9
FLD5DW
DW
Se
definen
FLD1DD
FLD2DD
FLD3DD
FLD4DD
DD
DD
DD
DD
?
32572
14,49
FLD3DB
FLD5DD
DD
'PC
Se
FLD1DQ
FLD2DQ
FLD3DQ
DQ
DQ
DQ
Se
FLD1DT
DT
/No
FLD2DT
DT
/Constante
decimal
FLD3DT
DT
/Cadena
caracteres
Constante hexadecimal
Constante binaria
Constante de direccin
Tabla de cinco
constantes
Cinco ceros
DUP(0)
definen
Double
Words
DD:
;No se i n i c i a
/Valor decimal
;Dos c o n s t a n t e s
FLD2DB
/Diferencia
;
entre direcciones
,-Cadena d e c a r a c t e r e s
Quad
Words
DQ:
No se inicia
Constante hexadecimal
Constante decimal
se
inician
de
65
Length
GROUP
0098
0000
Align
Combine
Class
WORD
WORD
PUBLIC
PUBLIC
'DATA'
' CODE'
Type
L BYTE
L DWORD
L QWORD
L TBYTE
L WORD
L BYTE
L DWORD
L QWORD
L TBYTE
L WORD
L BYTE
L DWORD
L QWORD
L TBYTE
L WORD
L BYTE
L DWORD
L WORD
L BYTE
L DWORD
L WORD
L BYTE
L BYTE
L BYTE
Valu
0000
004A
0062
0 07A
003 0
0001
004E
006A
0084
0032
0002
0052
0072
008E
0 034
0 0 03
00 5A
00 3 6
0004
005E
0040
O00E
001F
0024
Attr
_DATA
_DATA
JDATA
_DATA
_DATA
_DATA
_DATA
_DATA
_DATA
_DATA
_DATA
_DATA
_DATA
_DATA
_DATA
_DATA
_DATA
_DATA
_DATA
JDATA
_DATA
_DATA
_DATA
DATA
Symbols:
a m e
FLD1DB
FLD1DD
FLD1DQ
FLD1DT
FLD1DW
FLD2DB
FLD2DD
FLD2DQ
FLD2DT
FLD2DW
FLD3DB
FLD3DD
FLD3DQ
FLD3DT
FLD3DW
FLD4DB
FLD4DD
FLD4DW
FLD5DB
FLD5DD
FLD5DW
FLD6DB .
FLD7DB
FLD8DB
. '
Length = 000A
Length = 0005
0 Warning Errors
0 Severe
Errors
Figura 4-4
(continuacin)
lo exhortamos a examinar. Note que el cdigo objeto para valores no inicializados aparece como
ceros hexadecimales. Ya que este programa consiste slo en un segmento de datos, no es adecuado para ejecucin.
Definir byte: DB o BYTE
De las directivas que definen elementos de datos, una de las ms tiles es DB (definir byte).
Una expresin numrica DB (o BYTE) puede definir una o ms constantes de un byte. El
mximo de un byte significa dos dgitos hexadecimales. Con el bit de ms a la izquierda actuando
como el de signo, el nmero hexadecimal ms grande positivo de un byte es 7F; todos los nmeros "superiores", del 80 al FF (en donde el bit de signo es 1), representan valores negativos. En
trminos de nmeros decimales, estos lmites son + 1 2 7 y - 1 2 8 . El ensamblador convierte constantes numricas en cdigo objeto binario (representado en hexadecimal). En la figura 4-4, constantes
DB numricas son FLD2DB, FLD3DB, FLD4DB y FLD5DB.
Una expresin de carcter DB puede contener una cadena de cualquier longitud, hasta el final
de la lnea. Por ejemplo, vea FLD6DB y FLD7DB en la figura. El cdigo objeto muestra el
carcter ASCII para cada byte en orden normal de izquierda a derecha; 20H representa un carcter
espacio en blanco.
FLD8DB muestra una mezcla de constantes numricas y de cadenas de caracteres adecuada
para definir una tabla.
R e q u e r i m i e n t o s de l e n g u a j e e n s a m b l a d o r
Captulo 4
67
palabras es 7 seguido de 15
hexadecimal 1 seguido de 15
El ensamblador maneja
hace DD y DW para valores
valores numricos.
0F07
0F07
0F07
0F07
0F07
0F07
0F07
0F07
n
u
0F07
0F07
0F07
0F07
0F07
0F07
OF07
0F07
0000
0010
0020
0030
0040
0050
0060
0070
00
72
32
F0
00
00
00
00
20
73
36
FF
00
00
00
00
20
6F
35
59
00
0E
00
3C
59
6E
34
00
00
00
00
7F
00
61
01
1F
00
00
00
00
00
6C
4A
00
00
00
00
00
00
20
61
03
00
31
00
00
00-00
43-6F
6E-02
00-04
00-00
00-00
00-00
00-00
00
6D
46
00
00
00
00
00
00
70
65
07
00
01
47
00
00
75
62
00
00
00
4D
00
00
74
03
08
00
00
00
00
00
65
4D
00
00
00
00
00
50
72
61
09
3C
43
00
00
65
33
72
00
7F
50
00
00
Y
Pe
rsonal Computer3
2654.Jan.Feb.Mar
. .Y
0080
0090
00A0
00B0
00
00
50
01
06
8B
C3
6C
00
00
FF
B8
8B
16
90
83
00
00
76
FF
1E
10
B8
C4
00
00
04
FF
A4
3C
05
06
56
00
E8
50
43
89
00
FF
34
00
F5
2B
FF
87
50
76
12
00
5D
CO
06
8A
B8
04
00-00
00-72
83-C4
50-FF
A4-43
32-89
CC-07
8D-46
00
03
06
76
DI
97
50
80
00
E9
0B
04
E3
8C
8D
50
00
6B
DO
E8
DI
32
46
E8
00
01
74
DE
E3
5E
80
98
00
2B
03
5D
Al
8B
50
0D
43
CO
E9
83
0E
E5
E8
83
50
50
57
C4
3C
5D
23
C4
. . . . V4 CP
r..k. + .P
P.v...]
t. .W
....P+.P.v...]..
. . . .C. . .C
<
...<...2...2"..]
P...P.F.P.#
1....v..F.P
ooco
OOD0
00E0
00F0
<
- Representacin
Figura 4-5
hexadecimal
>
<
CP
GM....
ASCII
>
68
Captulo 4
desplazamientos 0000 hasta 0097. Esperamos que difieran la direccin de su segmento (0F07 en la
figura) y los datos despus del desplazamiento 0097.
Usted dio la instruccin DS: 100 para el despliegue porque el cargador estableci DS con la
direccin del PSP, y el segmento de datos para este programa es 100 bytes despus de esa direccin. Luego, cuando use DEBUG para programas .EXE que inicializan el DS con la direccin del
segmento de datos, usar DS:0 para desplegarlo.
LA DIRECTIVA EQU
La directiva EQU no define elementos de datos. En lugar de eso, define un valor que el ensamblador
puede usar para sustituir en otras instrucciones. Considere el enunciado EQU siguiente, codificado en el segmento de datos:
TIMES
EQU
10
El nombre, en este caso TIMES, puede ser cualquier nombre aceptable por el ensamblador. Ahora, siempre que en una instruccin o en otra directiva aparezca la palabra TIMES, el ensamblador la sustituye por el valor 10. Por ejemplo, el ensamblador convierte la directiva
FIELDA
DB
TIMES
DUP(?)
a su valor equivalente
FIELDA
DB
10
DUP(?)
Una instruccin tambin puede tener un operando con EQU, como en el siguiente:
COUNTR
EQU
05
MOV
CX,COUNTR
El ensamblador reemplaza COUNTR en el operando MOV con el valor 05, haciendo del operando un valor inmediato, como si estuviera codificado
MOV
CX,05
;E1
ensamblador
sustituye
05
La ventaja de EQU es que muchos enunciados pueden utilizar valores definidos por COUNTR.
Si el valor ha sido cambiado, slo necesita cambiar el enunciado EQU. No necesita decirse que
puede usar un valor igualado (con EQU) slo en donde una sustitucin tenga sentido para el ensamblador. Tambin puede igualar (con EQU) nombres simblicos, como en el siguiente cdigo:
TOTALPAY
TP
MFY
EQU
DW
TOTALPAY
EQU
MUL
El primer EQU hace equivalente (iguala) el alias TP al elemento definido TOTALPAY. Para
cualquier instruccin que tenga el operando TP, el ensamblador lo reemplaza con la direccin de
69
Puntos clave
TEXTEQU
<TEXTO>
PUNTOS CLAVE
Un comentario est precedido por punto y coma (;).
Las palabras reservadas en lenguaje ensamblador son usadas para propsitos especiales,
bajo condiciones especiales.
Un identificador es un nombre que se aplica a elementos en sus programas. Los dos tipos de
identificadores son nombres, que se refieren a direcciones de datos, y etiquetas, que se
refieren a la direccin de una instruccin.
Una operacin es usada, por lo comn, para definir reas de datos y codificar instrucciones.
Un operando proporciona informacin para la informacin que acta sobre l.
Un programa consiste en uno o ms segmentos, cada uno de los cuales empieza en un lmite
de prrafo.
La directiva ENDS finaliza cada segmento, ENDP termina cada procedimiento y END
termina un programa.
La directiva ASSUME asocia los registros de segmentos CS, DS y SS con sus nombres de
segmento apropiados. '
Los programas .EXE (pero no los .COM) deben proporcionar al menos 32 palabras para el
direccionamiento de la pila.
Para un programa .EXE, por lo general se inicializa el registro DS con la direccin del
segmento de datos.
Para las directivas simplificadas de segmentos, antes de definir algn segmento, se inicializa
el modelo de memoria. Las opciones son SMALL (un segmento de cdigo y un segmento de
datos), MDIUM (cualquier nmero de segmentos de cdigo y un segmento de datos),
C O M P A C T (un segmento de cdigo y cualquier nmero de segmentos de datos) y LARGE
(cualquier nmero de segmentos de datos y de cdigo).
INT 21H, funcin 4CH, es la instruccin estndar para la salida de programas.
Los nombres de los elementos de datos deben ser nicos y descriptivos. Por ejemplo, un
elemento para el salario de un empleado podra ser S A L E M P .
DB es el formato preferido para la definicin de cadenas de caracteres, ya que permite
cadenas de ms de dos bytes de longitud y las convierte a la secuencia normal de izquierda
a derecha.
Constantes decimales y binarias (hexadecimales) generan diferentes valores. Considere el
efecto de sumar el 25 decimal en contra de sumar 25 hex:
ADD
AX,25
ADD AX,2 5H
; Suma 25
,- Suma 37
70
Capitulo 4
DW, DD y DQ almacenan valores numricos en cdigo objeto, con los bytes en orden
inverso.
Los elementos DB son usados para procesar la mitad de registros (AL, BL, etc.). DW para
registros completos (AX, BX, etc.), y DD para registros extendidos (EAX, EBX, etc.).
Elementos numricos ms largos necesitan de manejo especial.
PREGUNTAS
4-1. Seale las diferencias entre un compilador y un ensamblador.
4-2. Qu es una palabra reservada en un lenguaje ensamblador? D dos ejemplos.
4-3. Cules son los dos tipos de identificadores?
4-4. Determine cules de los nombres siguientes son vlidos: (a) P C A T ; (b) $50; (c) @$_Z; (d) 34B7;
(e) AX.
4-5. Cules son las diferencias entre una directiva y una instruccin?
4-6. Qu comandos hacen que el ensamblador (a) imprima un encabezado en la parte superior de una
pgina en el listado de un programa y (b) salte a una nueva pgina?
4-7. Cul es el objetivo de cada uno de los tres segmentos descritos en este captulo?
4-8. El formato de la directiva SEGMENT es
nombre
SEGMENT
alineacin
combinar
'clase'
71
Preguntas
CAPTULO 5
OBJETIVO
Analizar los pasos para ensamblar, enlazar y ejecutar un programa en lenguaje ensamblador.
INTRODUCCIN
Este captulo explica el procedimiento para teclear un programa en lenguaje ensamblador y para
ensamblarlo, enlazarlo y ejecutarlo. Las instrucciones simblicas que codifica en lenguaje ensamblador, son conocidas como el programa fuente. Se utiliza el programa ensamblador para traducir
el programa fuente en cdigo de mquina, conocido como el programa objeto. Por ltimo, se
emplea un programa enlazador para completar el direccionamiento de mquina del programa
objeto, generando un mdulo ejecutable.
Las secciones sobre el ensamble explican cmo solicitar la ejecucin del programa ensamblador, el cual provee de diagnsticos (incluyendo mensajes de error) y genera el programa
objeto. Tambin se explican los detalles del listado del ensamblador y, en trminos generales,
cmo el ensamblador procesa un programa fuente.
Las secciones sobre el enlace explican cmo solicitar la ejecucin del programa enlazador de manera que pueda generar un mdulo ejecutable. Tambin son explicados los detalles del
mapa de enlace generado, as como los diagnsticos. Por ltimo, una seccin explica cmo solicitar la ejecucin de un mdulo ejecutable.
72
73
[Enter]
Tal como est, el programa es slo un archivo de texto que no puede ejecutarse: primero
debe ensamblarlo y enlazarlo.
1. El paso de ensamble consiste en la traduccin del cdigo fuente en cdigo objeto y la
generacin de un archivo intermedio .OBJ (objeto), o mdulo (en captulos anteriores ya
ha visto ejemplos de cdigo de mquina y de cdigo fuente). Una de las tareas del
ensamblador es calcular el desplazamiento de cada elemento en el segmento de datos y de
cada instruccin en el segmento de cdigo. El ensamblador tambin crea un encabezado al
frente del mdulo .OBJ generado; parte del encabezado tiene informacin acerca de
direcciones incompletas. El mdulo .OBJ an no est en forma ejecutable.
2. El paso de enlace implica convertir el mdulo .OBJ en un mdulo de cdigo de mquina
.EXE (ejecutable). Una de las tareas del enlazador es combinar los programas ensamblados
en forma separada en un mdulo ejecutable.
3. El ltimo paso es cargar el programa para su ejecucin. Ya que el cargador conoce en
dnde est el programa a punto de ser cargado, puede completar las direcciones indicadas
en el encabezado que estaban incompletas. El cargador desecha el encabezado y crea un
PSP inmediatamente antes del programa cargado en memoria.
La figura 5-1 proporciona un diagrama de los pasos implicados al ensamblar, enlazar y
ejecutar un programa.
CMO ENSAMBLAR UN PROGRAMA FUENTE
El programa ensamblador de Microsoft (hasta la versin 5.x) es MASM.EXE, mientras que el
programa de Borland es TASM.EXE. El ensamblador de Microsoft por lo general utiliza el comando ML, pero tambin acepta MASM por compatibilidad con versiones anteriores.
Puede teclear el comando para ejecutar MASM o TASM en una lnea de comando o por
medio de peticiones. Esta seccin muestra cmo utilizar la lnea de comando; vase en el apndice
D el mtodo con indicacin. El formato general para un comando de lnea para ensamblar un
programa es:
Editor
Editor: Crea
Prog. ASM
Captulo 5
Teclado
Prog.
ASM
Ensambla el
programa fuente,
crea un programa
objeto (.OBJ)
Enlaza el programa
objeto, crea un
programa ejecutable
(.EXE)
Carga y ejecuta
el programa
.EXE
MASM/TASM
[opciones]
f u e n t e [, o b j e t o ]
[, l i s t a d o ]
[, r e f c r u z a d a s ]
75
Refcruzadas genera un archivo de referencias cruzadas con los smbolos usados en el programa,
que puede usar para un listado de referencias cruzadas. Para MASM, la extensin es .CRF
y para TASM la extensin es .XRF. La unidad, subdirectorio y nombre de archivo puede
ser el mismo o diferente del fuente.
El nombre del archivo fuente siempre lo debe introducir, y por lo general solicita un archivo
.OBJ, que es necesario para enlazar un programa en forma ejecutable. Tal vez en algunas ocasiones solicitar archivos .LST, en especial cuando quiera examinar el cdigo de mquina generado.
Un archivo .CRF es til para programas grandes en donde quiera ver qu instrucciones hacen
referencia a qu datos. Tambin la peticin de un .CRF hace que el ensamblador genere nmeros
de lneas para los enunciados en el archivo .LST a las cuales el archivo .CRF se refiera. Secciones
posteriores cubren en detalle los archivos .LST y .CRF.
Ejemplo 1: Especifique el archivo fuente, P05ASM1, en la unidad D y genere archivos objeto,
de listado y de referencias cruzadas. Si el nombre de un archivo es el mismo que el del archivo
fuente, no necesita repetirlo; basta con la especificacin de la unidad para solicitar un archivo:
MASM/TASM
D:PO5ASM1,D:,C:,D:
Ejemplo 2: Slo genere un archivo objeto. En este caso, puede omitir la referencia a los
archivos de listado y de referencias cruzadas: slo introduzca el comando
MASM/TASM A:P0 5ASM1,D:
P05ASM1
(EXE)
Operaciones
1
2
3
4
5
6
7
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
0000
0000
0002
0004
0006
00FA
007D
0000
0000
0000
0000
0003
B8
8E
D8
0005
0008
OOOC
OOOF
0012
0014
0014
Al
03
A3
B8
CD
0000 R
06 0 0 0 2
0004 R
4C00
21
Segments
sumar
1-1
Page
Operaciones
de
mover
sumar
SEGMENT
DW
STACKSG
ENDS
DATASG
FLDA
FLDB
FLDC
DATASG
SEGMENT
DW
DW
DW
ENDS
PARA
250
125
?
CODESG
BEGIN
SEGMENT
PROC
ASSUME
MOV
MOV
PARA 'Code'
FAR
SS : S T A C K S G , DS : D A T A S G , CS : C O D E S G
AX,DATASG
Establecer la direccin de
DS,AX
DATASG en el registro DS
MOV
ADD
MOV
MOV
INT
ENDP
ENDS
END
AX,FLDA
AX, FLDB
FLDC, AX
AX,4C00H
21H
BEGIN
CODESG
and Groups:
a m e
CODF.SG
DATASG
STACKSG
Length
0014
0006
0040
PARA STACK
32 DUP(0)
'Stack'
STACKSG
0020[
0000
]
0040
mover
page 60,132
P 0 5 A S M 1 (EXE)
TITLE
0000
0000
de
Captulo 5
BEGIN
Align
PARA
PARA
PARA
M o v e r 0250 a AX
S u m a r 0125 a AX
Almacenar suma en
Salida a DOS
Fin
Fin
Fin
de
de
de
Combine
NONE
NONE
STACK
FLDC
procedimiento
segmento
programa
Class
CODE'
'DATA'
'STACK'
1
Symbols:
a m e
BEGIN
FLDA
FLDB
FLDC
L
L
. . . L
CPU
FILENAME
VERSIN
0
0
Type
F PROC
WORD
WORD
WORD
TEXT
TEXT
TEXT
Valu
0000
Attr
CODESG
0000
0002
0004
DATASG
DATASG
DATASG
Length
0014
OlOlh
p05asml
510
27 Source
Lines
27 Total
Lines
15 Symbols
Warning Errors
Severe
Errors
Figura 5-2
Para cada uno de los tres segmentos, la directiva SEGMENT avisa al ensamblador alinee el
segmento a una direccin que sea divisible entre 10 hex el enunciado mismo no genera cdigo
de mquina. De forma terica, cada direccin de segmento inicia en la localidad con desplaza-
77
B8
0003
8E D8
SS:STACKSG,DS:DATASG,CS;CODESG
La directiva ASSUME relaciona DATASG con el registro DS. Note que el programa no
requiere el registro ES, pero como prctica usual, algunos programadores lo definen.
ASSUME slo proporciona informacin al ensamblador, lo que no genera cdigo de mquina.
La primera instruccin MOV "almacena" DATASG en el registro AX. Ahora bien, en
realidad una instruccin no puede almacenar un segmento en un registro el ensamblador
slo reconoce un intento de cargar la direccin de DATASG. Observe el cdigo de mquina
a la izquierda: B8
R. Los cuatro guiones significan que en este punto el ensamblador no
puede determinar la direccin de DATASG; el sistema determina esta direccin slo cuando
el programa objeto est enlazado y cargado para su ejecucin. Ya que el cargador del sistema
puede ubicar un programa en cualquier parte de la memoria, el ensamblador deja abierta la
Capitulo 5
direccin e indica este hecho con una R; el programa cargador DOS es para reemplazar (o
reubicar) las direcciones incompletas con las reales.
La segunda instruccin MOV mueve el contenido del registro AX al registro DS. Ya que no
existe una instruccin vlida para mover de forma directa de la memoria al registro DS,
tiene que codificar dos instrucciones para inicializar el DS.
El cargador DOS inicializa de forma automtica el SS y el CS cuando carga un programa
para ejecucin, pero es su responsabilidad inicializar el DS y, si se necesita, el ES.
Para las directivas simplificadas de segmentos, la inicializacin del DS es como sigue:
MOV
MOV
AX,datos
DS, AX
Aunque todo estas acciones parecen ser demasiado complicadas, en este momento en realidad no tiene que entenderlo. Todos los programas en este libro utilizan una definicin e inicializacin
estndar, y usted slo tiene que reproducir el cdigo para cada uno de sus programas. Para este
fin, almacene en disco una estructura de un programa ensamblado, y para cada programa nuevo
que quiera crear, COPIE la estructura del programa en un archivo con su nombre correcto y use
su editor para completar las instrucciones adicionales.
La primera instruccin despus de inicializar el DS es MOV AX,FLDA, que empieza en la
localidad con desplazamiento 0005 y genera el cdigo de mquina Al 0000. El espacio entre Al
(la operacin) y 0000 (el operando) es slo por legibilidad. La instruccin siguiente es ADD
AX,FLDB que empieza en la localidad con desplazamiento 0008 y genera cuatro bytes de cdigo
de mquina. En este ejemplo, la longitud de las instrucciones de mquina son dos, tres y cuatro
bytes.
El ltimo enunciado en el programa, END, contiene el operando BEGIN, que relaciona al
nombre del PROC en el desplazamiento 0000. sta es la localidad en el segmento de cdigo a
donde el cargador de programa transfiere el control para la ejecucin.
A continuacin del listado del programa estn una tabla de segmentos y grupos y una tabla
de smbolos.
Tabla de segmentos y grupos
La primera tabla al final del listado del ensamblador muestra todos los grupos y segmentos definidos. Note que los segmentos no estn listados en el mismo orden en que fueron codificados; el
ensamblador los lista en orden alfabtico por nombre (este programa no tiene grupos, que es un
tema posterior). La tabla proporciona la longitud en bytes de cada segmento, la alineacin (ambos
son prrafos), el tipo combinar y la clase. El ensamblador ha convertido los nombres de clase a
maysculas.
Tabla de smbolos
La segunda tabla proporciona los nombres de los campos de datos en el segmento de datos (FLDA,
FLDB y FLDC) y las etiquetas aplicadas a instrucciones en el segmento de cdigo. Para BEGIN
(la nica entrada en el ejemplo), Type F PROC significa procedimiento lejano. La columna valu
da el desplazamiento para el inicio del segmento de nombres, etiquetas y procedimientos. La
columna encabezada con Attr (atributo) proporciona el segmento en el que el elemento est
definido.
79
El apndice D explica todas las opciones de estas tablas. Para que el ensamblador omita las
tablas, codifique la opcin /N despus del comando MASM, esto es, MASM/N.
En cuanto a las ltimas tres entradas, @CPU identifica al procesador, F I L E N A M E da el
nombre del programa y VERSIN muestra la versin del ensamblador en la forma n.nn.
Puede usar cdigo y datos en enunciados ASSUME y ejecutables, tal como MOV
AX, datos.
05ASM2
0000
0002
0004
(EXE)
Operaciones
OOFA
007D
0000
0000
0000
0003
B8
8E D8
0005
0008
OOOC
Al
03
A3
0000 R
06 0 0 0 2
0004 R
OOOF
0012
0014
B8
CD
4C00
21
sumar
page
60,132
P05ASM2
(EXE)
FLDA
FLDB
FLDC
.MODEL
.STACK
.DATA
DW
DW
DW
BEGIN
and
mover y
TITLE
BEGIN
Segments
de
Captulo 5
Page
Operaciones
SMALL
64
de
l -1
mover
;Se
;Se
define la pila
definen datos
;Se
define
sumar
250
125
.CODE
PROC
MOV
MOV
FAR
AX,@data
DS,AX
MOV
ADD
MOV
AX,FLDA
AX,FLDB
FLDC,AX
,-Mover
0250
AX
;Sumar
012 5
AX
MOV
INT
ENDP
END
AX,4C00H
21H
;Salida
BEGIN
segmento
de
cdigo
;Establecer la direccin
;
D A T A S G en el r e g i s t r o
,-Almacenar
a
suma
en
de
DS
FLDC
DOS
, F i n de p r o c e d i m i e n t o
, F i n de p r o g r a m a
Groups:
a m e
Align
Combine
Class
Length
GROUP
0006
004 0
0014
WORD
PARA
WORD
PUBLIC
STACK
PUBLIC
' DATA
' STACK
'CODE
Type
F PROC
Valu
0000
Attr
_TEXT
Length
FLDA
FLDB
FLDC
L
L
L
0000
0002
0004
DATA
DATA
"DATA
CODE
CODESIZE
CPU
DATAS IZE
@FILEAME
TEXT
TEXT
TEXT
TEXT
TEXT
DGROUP
_DATA
STACK
_TEXT
Symbols:
a m e
,
BEGIN
0
0
Warning
Severe
Figura 5-3
WORD
WORD
WORD
0014
_TEXT
0
OlOlh
0
p05asm2
Errors
Errors
puede completar el cdigo objeto para cada instruccin. Despus produce, si se solicita, los
diferentes archivos objeto (.OBJ), de listado (.LST) y de referencias cruzadas (.REF).
Un problema potencial en la pasada 1 es una referencia hacia adelante: Una instruccin de
salto en el segmento de cdigo puede referenciar a una etiqueta, pero el ensamblador an no ha
encontrado su definicin. M A S M construye el cdigo objeto con base en lo que supone es
la longitud de cada instruccin generada en lenguaje de mquina. Si existen diferencias entre la
pasada 1 y la pasada 2, con respecto a la longitud de una instruccin, MASM enva un mensaje de
81
error "Phase error between passes". Tales errores son relativamente raros, y si aparecen usted
debe buscar su causa y corregirla.
Desde la versin 6.0, MASM hace un manejo ms eficaz de la longitud de las instrucciones,
dando tantas pasadas al archivo como sean necesarias.
archeje,
[,archmapa]
[,archbibl]
Cmo e n s a m b l a r , e n l a z a r y e j e c u t a r u n p r o g r a m a
Capitulo 5
Este ejemplo enlaza el archivo objeto P05ASM1.OBJ que fue generado por un ensamble
anterior. Al enlazador se le pide escribir el archivo .EXE en la unidad D, desplegar el mapa e
ignorar la opcin de biblioteca:
LINK
D:P0 5ASM1,D;,CON
Si el nombre del archivo es el mismo que el del fuente, no necesita repetirlo: basta con la identificacin de la unidad para indicar la peticin del archivo. El apndice D porporciona otras
opciones.
Mapa del enlace para el primer programa
Para el programa P05ASM1, LINK produce este mapa:
START
STOP
LENGTH
AME
CLASS
OOOOOH
0003FH
0040H
STACKSG
STACK
00040H
00045H
0006H
DATASG
DATA
00050H
00063H
0014H
CODESG
CODE
Punto
de entrada
del
programa
en
0005:0000
La pila es el primer segmento e inicia con un desplazamiento de cero bytes desde el inicio
del programa. Como est definida como 32 palabras, es de 64 bytes, como lo indica su
longitud (40H).
El segmento de datos inicia en el siguiente lmite de prrafo, desplazamiento 40H.
El segmento de cdigo inicia en el siguiente lmite de prrafo, desplazamiento 50H. Algunos
ensambladores acomodan los segmentos en orden alfabtico.
El punto de entrada al programa es 0005:0000, que est en la forma "relativa (no absoluta)
segmento desplazamiento", se refiere a la direccin de la primera instruccin ejecutable.
En realidad, la direccin relativa de inicio es en el segmento 5[0], desplazamiento de 0
bytes, que corresponde al lmite del segmento en 50H. El programa cargador utiliza este
valor cuando carga el programa en memoria para ejecucin.
En esta etapa el nico error que puede encontrar es introducir de manera errnea los nombres de los archivos. La solucin es reiniciar el comando de enlace.
Mapa del enlace para el segundo programa
El mapa de enlace para el segundo programa, que utiliza las directivas simplificadas de segmentos, muestra una configuracin un poco diferente a la del programa anterior. Primero, el ensamblador
ha reacomodado de manera fsica los segmentos en orden alfabtico, y segundo, los segmentos
sucesivos estn alineados por lmites de palabras (no de prrafo):
CLASS
START
STOP
LENGTH
AME
OOOOOH
00013H
0014H
_TEXT
CODE
00014H
00019H
0006H
_DATA
DATA
0040H
STACK
00020H
Punto
de
0005FH
entrada
del
programa
en
STACK
0000:0000
83
P05ASM1
Si omite la extensin del archivo, el DOS supone que es .EXE (o .COM). Sin embargo, ya que
este programa no produce resultados visibles, se sugiere que lo ejecute con DEBUG y avance paso
por paso en su ejecucin con comandos de rastreo (T). Teclee lo siguiente, incluyendo la extensin .EXE:
DEBUG
D:P05ASM1.EXE
DEBUG carga el mdulo del programa .EXE y muestra su indicacin (un guin). Para ver
el segmento de la pila, teclee
D SS : 0
La pila contiene slo ceros ya que fue la forma de inicializarla. Para ver el segmento de datos,
teclee
D DS : 0
La operacin muestra tres elementos de datos FA 00 7D 00 00 00, con los bytes de cada palabra
en orden inverso. Para ver el segmento de cdigo, teclee
D CS : 0
Compare el cdigo de mquina mostrado con el del segmento de cdigo en el listado del ensamblado:
B8
8ED8A10000 . . .
En este caso, el listado del ensamblado no muestra de manera precisa el cdigo de mquina, ya
que el ensamblador no conoce la direccin del operando de la primera instruccin. Ahora puede
determinar esta direccin examinando el cdigo desplegado.
Teclee R para ver los registros, y rastree la ejecucin del programa con sucesivos comandos
T. A medida que avance por el programa, fjese en el contenido de los registros. Cuando llegue
a la ltima instruccin, puede utilizar L para volver a cargar y correr el programa o Q para salir
de la sesin con DEBUG.
84
Captulo 5
archivoxref,
archivoref
P04ASM1
Symbol
(EXE)
Operaciones
Cross-Reference
CPU
SVERSION
(#
de
mover
sumar
definition,
modification)
1#
1#
BEGIN
18#
28
30
CODE
CODESG
17#
19
29
DATA
DATASG
11#
15
19
FLDA
FLDB
FLDC
12#
13#
14#
23
24
25 +
STACK
4#
12
Symbols
Figura 5-4
19
85
Diagnstico de errores
Archivos generados
Al ensamblar varios programas puede usar mucho espacio en disco. Es posible, de manera segura,
borrar los archivos .OBJ, .CRF y .LST. Guarde los programas fuente .ASM en caso de cambios
futuros y tambin guarde los archivos .EXE para la ejecucin del programa.
DIAGNSTICO DE ERRORES
El ensamblador proporciona un diagnstico de cualquier error de programacin que viole sus
reglas. El programa en la figura 5-5 es el mismo que el de la figura 5-2, salvo que tiene insertados
varios errores intencionales con fines ilustrativos. El programa fue corrido con MASM; TASM
genera un listado parecido de errores. Aqu estn los errores, como se codificaron:
LNEA
EXPLICACIN
14
19
20
TITLE
0000
0000
STACKSG
0020[
0000
page 60,132
P05ASM3 (EXE)
'Stack'
STACKSG
9 0040
10
11 0000
DATASG
12 0000
00FA
FLDA
13 0002
FLDB
007D
14 0004
FLDC
p05asm3. ASM(11)
error A 2 0 2 7 :
15 0004
DATASG
16
17 0000
CODESG
18 0000
BEGIN
19
20 0000 Al 0000 U
p05asm3. A S M ( 1 7 ) : error A2009:
21 0003
8B DO
22
23
p05asm3. A S M ( 2 0 ) : error A2009:
24 0005
03 06 0002 R
25 0009 A3 0000 U
p05asm3 A S M ( 2 2 ) : error A2009:
26 000C B8 4C00
27 000F CD 21
28 0011
BEGIN
p05asm3 ASM (25) : error A2 006:
29 0011
CODESG
30
Figura 5-5
ENDS
SEGMENT PARA 'Data'
DW
250
DW
125
DW
Operand expected
ENDS
1
86
Captulo 5
DX debe ser codificado como DS, aunque el ensamblador no sabe que ste
es un error.
AS debe se codificado como AX.
FLDD debe se codificado como FLDC.
La correccin de los otros errores har que este diagnstico desaparezca.
El ltimo mensaje de error, "Phase error between passes", ocurre cuando las direcciones
generadas en la pasada 1 difieren de aquellas en la pasada 2 en un ensamblador de dos pasadas.
Para aislar un error desconocido, utilice la opcin /D para que MASM liste un archivo para la
pasada 1 y otro archivo para la pasada 2, y compare los desplazamientos.
PUNTOS CLAVE
MASM y TASM proporcionan una lnea de comando para ensamblar, incluyendo (al menos)
el nombre del programa fuente. MASM tambin proporciona indicaciones para introducir
opciones.
El ensamblador convierte un programa fuente a un archivo .OBJ y genera archivos opcionales
para el listado y las referencias cruzadas.
La tabla de segmentos y grupos que sigue a un listado de ensamblador muestra los segmentos
y grupos definidos en el programa. La tabla de smbolos muestra todos los smbolos (nombres
de datos y etiquetas de instruccin).
El enlazador (LINK o TLINK) convierte un archivo .OBJ en un archivo .EXE. Usted puede
enlazar usando una lnea de comando o por medio de indicaciones (slo LINK).
Las directivas simplificadas de segmentos generan los nombres _DATA para el segmento de
datos, STACK para el segmento de la pila y TEXT para el segmento de cdigo. Tambin
generan varias equivalencias predefinidas.
El programa CREF (o TCREF) produce un til listado de referencias cruzadas.
PREGUNTAS
5-1. Codifique la lnea de comandos para ensamblar el programa fuente llamado DISCOUNT.ASM con
archivos .LST, .OBJ y .CRF. Suponga que el programa fuente y el ensamblador estn en la unidad C.
5-2. Codifique la lnea de comando en LINK o TLINK para enlazar DISCOUNT.OBJ de la pregunta 5-1.
5-3. Codifique los comandos para DISCOUNT.EXE de la pregunta 5-2 para hacer lo siguiente: (a)
ejecucin por medio de DEBUG; (b) ejecucin directa desde el DOS.
5-4. Dar el objetivo de cada uno de los archivos siguientes: (a) archivo .ASM; (b) archivo .CRF; (c)
archivo .LST; (d) archivo .EXE; (e) archivo .OBJ; (f) archivo .MAP.
5-5. Codifique las dos instrucciones para inicializar el registro DS. Suponga que el nombre del segmento
de datos es DATSEG.
5-6. Escriba un programa en ensamblador usando las definiciones convencionales de segmentos para lo
siguiente: (a) Mover el valor inmediato 40 hex al registro AL; (b) recorrer el contenido de AL un bit
hacia la izquierda (cdigo SHL AL,1); (c) mover el valor inmediato 22 hex al BL; (d) multiplicar AL
por BL (cdigo MUL BL). Recuerde las instrucciones necesarias para finalizar la ejecucin de un
programa. El programa no necesita definir o inicializar el segmento de datos. Asegrese de COPIAR
una estructura de programa y utilice su editor para desarrollar el programa. Ensmblelo y enlcelo.
Utilice DEBUG para rastrear y verificar el segmento de cdigo y los registros.
Preguntas
87
5-7. Corrija el programa de la pregunta 5-6 para directivas simplificadas de segmentos. Ensmblelo y
enlcelo, y compare el cdigo objeto, las tablas de smbolos y el mapa de enlace con aquellos del
programa original.
5-8. Agregue un segmento de datos al programa de la pregunta 5-6, para lo siguiente:
Defina un elemento de un byte (DB) llamado FIELDA con 40 hex y otro con nombre FIELDB con
22 hex.
Defina un elemento de dos bytes (DW) con nombre FIELDC sin constante.
Mueva el contenido de FIELDA al registro AL, y recrralo un bit a la izquierda.
Multiplique el AL por FIELDB (cdigo MUL FIELDB).
Mueva el producto en el AX a FIELDC.
Ensamble, enlace y utilice DEBUG para probar el programa.
5-9. Corrija el programa de la pregunta 5-8 para directivas simplificadas de segmentos. Ensmblelo y
enlcelo, y compare el cdigo objeto, las tablas de smbolos y el mapa de enlace con aquellos del
programa original.
CAPTULO 6
Instrucciones y direccionamiento
del procesador
OBJETIVO
Proporcionar los fundamentos del conjunto de instrucciones de lenguaje ensamblador y los requisitos para el direccionamiento de datos.
INTRODUCCIN
Este captulo introduce el conjunto de instrucciones del procesador y enseguida describe los
formatos bsicos de direccionamiento que son usados en el resto del libro. Formalmente, las
instrucciones que se tratan en este captulo son MOV, MOVSX, MOVZX, XCHNG, LEA, INC,
DEC e INT. Tambin se puede definir como un valor inmediato una constante en el operando de
una instruccin.
Por ltimo, el captulo explica la alineacin de direccin y el prefijo que invalida el segmento.
EL CONJUNTO DE INSTRUCCIONES DEL PROCESADOR
La siguiente es una lista de las instrucciones para la familia de procesadores 8086, clasificadas por
categoras. Aunque la lista parece enorme, muchas de las instrucciones rara vez se necesitan.
Aritmticas
ADC: Suma con acarreos
A D D : Suma nmeros binarios
88
DEC: Decrementa en 1
DIV: Divisin sin signo
IDIV: Divide con signo (enteros)
IMUL: Multiplica con signo (enteros)
INC: Incrementa en 1
M U L : Multiplica sin signo
NEG: Negacin
SBB: Resta con el bit prestado
SUB: Resta valores binarios
Conversin ASCII-BCD
AAA: Ajuste ASCII despus de sumar
AAD: Ajuste ASCII antes de dividir
AAM: Ajuste ASCII despus de multiplicar
A AS: Ajuste ASCII despus de restar
DA A: Ajuste decimal despus de sumar
DAS: Ajuste decimal despus de restar
Corrimiento de bit
RCL: Rota a la izquierda a travs del acarreo
RCR: Rota a la derecha a travs del acarreo
ROL: Rota a la izquierda
ROR: Rota a la derecha
SAL: Corrimiento algebraico a la izquierda
SAR: Corrimiento algebraico a la derecha
SHL: Corrimiento lgico a la izquierda
SHR: Corrimiento lgico a la derecha
SHLD/SHRD: Corrimiento en doble precisin (80386 y posteriores)
Comparacin
BSF/BSR: Exploracin de bit (80386 y posteriores)
BT/BTC/BTR/BTS: Prueba bit (80386 y posteriores)
C M P : Compara
C M P S : Compara cadenas de caracteres
TEST: Prueba bits
Transferencia de datos
LDS: Carga el registro del segmento de datos
LEA: Carga una direccin efectiva
89
Captulo 6
92
Captulo 6
operandol,
operando2
DW
MOV
CX,WORDX
MOV
WORDX,
MOV
CL,
AH
BX
,-Registro
en
el
, R e g i s t r o
en el
/Registros
en
primer
operando
segundo operando
ambos
operandos
93
Operandos
DB
ADD
CX,
MOV
SAVE,
12
25
;Suma 12 al CX
;Mueve 2 5 a SAVE
DW 0
BYTE1 DB 0
MOV AX,WORDl
;Carga WORDl en AX
A D D BYTE1,
CL
;Suma CL a BYTE1
MOV B X . D S :
[38B0H]
[2F0H]
Los ltimos dos ejemplos utilizan corchetes como especifi -adores de ndice para indicar una
referencia a memoria (el desplazamiento es combinado con la direccin en el DS). La omisin de
los corchetes, como en M O V BX,38B0H, indica un valor inmediato: note la gran diferencia.
El ltimo ejemplo incrementa el byte en memoria en el desplazamiento 2F0H (el desplazamiento combinado con la direccin DS). Ya que el operando slo indica la localidad inicial de
memoria, aqu necesitamos el modificador BYTE PTR para definir la longitud.
A continuacin, un elemento de dato acta coma una direccin de desplazamiento en un
operando de instruccin:
TABLEX
DB
25
DUP(?)
MOV AL,TABLEX[4]
MOV
AL,TABLEX+4
Captulo 6
El primer MOV usa un especificador de ndice para accesar el cuarto byte de TABLEX. El
segundo MOV usa un operador + para tener exactamente el mismo efecto.
Operandos de memoria indirecta
Direccionamiento indirecto es una tcnica sofisticada que hace uso de las capacidades de la computadora para el direccionamiento de segmento:desplazamiento. Los registros utilizados para este
propsito son BX, DI, SI y BP, codificados con corchetes como un operador de ndice. BX, DI y
SI estn asociados con el registro DS como DS:BX, DS:DI y DS:SI, para procesamiento de datos
en el segmento de datos. El BX, DI y SI estn asociados con el registro DS como DS:BX, DS:DI
y DS:SI para procesamiento de datos en el segmento de datos. El BP est asociado con el registro
SS como SS:BP, para manejo de datos en la pila, lo cual haremos en el captulo 23 cuando
llamemos subprogramas y pasemos parmetros.
Cuando el primer operando contiene una direccin indirecta, el segundo se refiere a un
registro o a un valor inmediato; cuando el segundo operando contiene una direccin indirecta, el
primero se refiere a un registro. Una direccin indirecta tal como [BX] le indica al ensamblador
que la direccin de memoria a usar estar en el registro BX cuando el programa la ejecute posteriormente.
En el ejemplo siguiente, el primer MOV inicializa el BX con la direccin con desplazamiento de D A T A F L D . El segundo MOV utiliza la direccin en el BX para almacenar cero en la
localidad de memoria a la cual apunta, en este caso, DATAFLD:
D A T A F L D DB
MOV
BX,OFFSET
MOV
[BX] ,
DATAFLD
;Carga
BX
,-Mueve
con
a
el
desplazamiento
DATAFLD
El efecto de los dos MOV es el mismo que codificar MOV DATAFLD,0, aunque el uso de
direccionamiento indexado por lo comn no es tan trivial. La siguiente instruccin mueve cero a
la localidad que se encuentra dos bytes despus de DATAFLD:
MOV
[BX+2],0
,-Mueve
DATAFLD+2
BL,
[BX]
SUB
BYTE
MOV
[BP] , A L
PTR
;DS:BX
[DI],
[SI]
,-DS:DI
y DS:SI
;SS:BP
95
La instruccin MOV
TABLEX
DB
25
DUP(?)
MOV
TABLEX [DI],
CL
Indexacin en el 80386 y procesadores posteriores. Estos procesadores permiten una direccin que sea generada a partir de cualquier combinacin de uno o ms registros generales, un
desplazamiento y un factor de escala ( 1 , 2, 4 u 8) asociado con el contenido de uno de los
registros. Por ejemplo, la instruccin
MOV
EBX,
[ECX*2+ESP+4]
mueve una direccin al EBX, la direccin consiste en el contenido de (el ECX por 2) ms el
contenido de (el ESP ms 4).
LA INSTRUCCIN M O V
La instruccin MOV transfiere (esto es, copia) los datos referenciados por la direccin del segundo operando a la direccin del primer operando. El campo que se enva permanece sin cambios.
Los operandos que hacen referencia a memoria o registros deben coincidir en tamao (es decir,
ambos deben ser bytes, ambos deben ser palabras o ambos deben ser palabras dobles). El formato
general para MOV es
[etiqueta:]
MOV
{registro/memoria},{registro/memoria/inmediato}
Aqu estn cuatro ejemplos de operaciones MOV vlidas, por categoras, dados los siguientes elementos de datos:
BYTEVAL
DB
WORDVAL
DW
AX,25
MOV
BYTEVAL,
MOV WORDVAL
,-Inmediato a registro
25
[BX],
25
/Inmediato a memoria,
directo
/Inmediato a memoria,
indirecto
2. Mueve registros
MOV
EAX,ECX
Registro a registro
MOV
DS, AX
MOV
BYTEVAL,
MOV
[SI] , AX
BH
Registro a memoria,
directo
Registro a memoria,
indirecto
96
Captulo 6
BH, BYTEVAL
MOV AX,WORDVAL
/Memoria
registro,
directo
,-Memoria
registro,
indirecto
[BX]
AX,DS
MOV
WORDVAL,
,-Registro
de
segmento
registro
/Registro
de
segmento
memoria
DS
Puede mover a un registro un byte (MOV AH,BYTEVAL), una palabra (MOV AX, WORDVAL)
o una palabra doble (MOV EAX, DWORD VAL). El operando slo afecta la parte del registro
referenciado; por ejemplo, mover un byte al AH no afecta el AL.
Las operaciones MOV que no son permitidas son de memoria a memoria (tenga esto en
mente), inmediato a registro de segmento y de registro de segmento a registro de segmento. Para
manejar estas operaciones, tiene que codificar ms de una instruccin.
[etiqueta]
MOVSX/MOVZX
{registro/memoria},{registro/memoria/inmediato}
MOVSX, para uso con valores aritmticos con signo, mueve un byte o palabra a una palabra
o palabra doble de destino y llena con el bit de signo (el ltimo bit a la izquierda del origen) los
bits de ms a la izquierda del destino. MOVZX, para uso con valores numricos sin signo, mueve
un byte o palabra a una palabra o palabra doble de destino y llena con bits cero los bits de ms a
la izquierda del destino. Como ejemplo, considere mover un byte con 1011 0000 a una palabra; el
resultado en la palabra destino depende de la eleccin de la instruccin:
MOVSX:
1111
1111
1011
0000
MOVZX:
0000
0000
1011
0000
DB
WORDVAL
DW
MOVSX
AX,
BYTEVAL
/Byte
palabra
97
Operandos inmediatos
MOVSX EAX,
WORDVAL
MOVZX WORDVAL,
MOVZX EAX,
AH
WORDVAL
Los captulos 8 y 13 cubren con todo detalle los datos con y sin signo.
OPERANDOS INMEDIATOS
En el ejemplo siguiente de un operando inmediato, la instruccin
MOV
AX,0123H
mueve la constante inmediata 0123H al registro AX. El cdigo de tres bytes para esta instruccin
es B82301, en donde B8 significa "mueve un valor inmediato al registro AX" y los dos bytes
siguientes contienen el valor (2301H, en orden inverso de bytes). Muchas instrucciones estipulan
dos operandos; el primero puede ser un registro o localidad de memoria y el segundo puede ser
una constante inmediata.
El uso de un operando inmediato da procesamiento ms eficiente que definir una constante
numrica en el segmento de datos y referenciarla en el operando del M O V , como en el ejemplo
siguiente:
Segmento de d a t o s :
AMT1
DW
0123H
S e g m e n t o de cdigo:
MOV
AX, AMT1
/Define AMT1
como palabra
/Mueve a AMT1 a AX
AL, 0123H
/ Longitud- no vlida
AX.25H
/Longitud
vlida
el ensamblador expande el operando a dos bytes, 0025H, y almacena el cdigo objeto como
2500H.
El 80386 y procesadores posteriores permiten operandos inmediatos de cuatro bytes (palabra doble), tal como en
MOV
EAX,12345678H
/Mueve palabra
doble
Formatos inmediatos
Una constante inmediata puede estar en cualquier formato definido vlido. Aqu estn algunos
ejemplos:
98
TITLE
FLDA
FLDB
.386
BEGIN
BEGIN
Captulo 6
PAGE
50,132
P06IMMED
(EXE)
Ejemplos de operandos inmediatos
(Coded for a s s e m b l y only, N O T for e x e c u t i o n )
.MODEL SMALL
. S T A C K 64
,-Se d e f i n e l a p i l a
.DATA
;Se d e f i n e n l o s d a t o s
7
DB
?
DW
.CODE
PROC
MOV
ADD
SUB
MOV
ADD
ENDP
END
FAR
AX,275
AX,125
AX,200
EBX, 0
BX,20H
, M o v e r i n m e d i a t o
;Suma inmediata
;Resta inmediata
;Mover inmediato
(80386)
, S u m a i n m e d i a t a ( h e x )
Figura 6-1
Operaciones inmediatas
Hexadecimal:
0123H
Decimal:
291
Binario:
100100011B
(que
el
ensamblador
(que
convierte
convierte
en
en
0123H)
0123H)
MOV, ADD y SUB son tres de las muchas instrucciones que permiten operandos inmediatos. La figura 6-1 da ejemplos de estas instrucciones. La directiva .386 permite al ensamblador
reconocer la referencia al registro EBX. No se necesita un 80386 o procesador posterior para
ensamblar este enunciado, pero s para ejecutarlo. Ya que el ejemplo no tiene la intencin de
ejecutarse, no se define una pila ni se inicializa el registro DS.
Procesar elementos ms largos que la capacidad de un registro exige codificacin adicional,
tratada en captulos posteriores.
LA INSTRUCCIN XCHG
La instruccin XCHG realiza otro tipo de transferencia de datos, pero en lugar de copiar los datos
de una localidad a otra, XCHG intercambia los datos. El formato general para XCHG es
[etiqueta:]
XCHG
{registro/memoria},
{registro/inmediato}
Operaciones vlidas con XCHG implican intercambio de datos entre dos registros y entre un
registro y la memoria. Aqu estn ejemplos:
WORD
DW
XCHG AL,
AH
XCHG
WORDX
AX,
/Intercambia
/Intercambia
los
contenidos
los
contenidos
de
del
los
dos
registros
registro
la
memoria
99
LA INSTRUCCIN LEA
La instruccin LEA es til para inicializar un registro con una direccin de desplazamiento. De
hecho, un nombre ms descriptivo para esta instruccin sera "Load Offset Address, carga una
direccin de desplazamiento". El formato general para LEA es
[etiqueta:]
LEA
{registro/memoria}
D0P
(?)
SAVBYTE DB
LEA BX,
DATABLK
MOV SAVBYTE,
[BX]
OFFSET DATABLK
INC/DEC
{registro/memoria}
Note que esas instrucciones slo necesitan de un operando. Dependiendo del resultado, la operacin apaga o prende las banderas O F , SF y ZF, a las que las instrucciones de salto condicional
pueden verificar para menos, cero o ms.
100
TITLE
NAME1
AME 2
BEGIN
page
60,132
P 0 6 M O V E (EXE)
Operaciones
.MODEL
.STACK
SMALL
64
.DATA
DB
DB
'ABCDEFGHI'
'JKLMNOPQR'
.CODE
PROC
MOV
de
movimiento
Captulo 6
extendidos
FAR
AX,data
DS,AX
ES,AX
Inicia registros
de segmento
CX, 09
SI,NAMEl
DI,NAME2
MOV
MOV
INC
INC
DEC
JNZ
A L , [SI]
[DI] , A L
MOV
INT
AX,4C00H
21H
MOV
MOV
MOV
LEA
LEA
B20:
BEGIN
ENDP
END
SI
DI
CX
B20
Salida
DOS
BEGIN
Figura 6-2
NAMEl:
NAME2:
I
J
I
K
I
L
I
M
I
N
I
O
H
I
Q
I
R
Ya que cada uno de los campos es de nueve bytes, se necesita ms de una instruccin MOV. El
programa contiene varias caractersticas nuevas.
A fin de pasar N A M E l a NAME2, la rutina inicializa el registro CX a 9 (la longitud de los
dos campos) y utiliza los registros ndice SI y DI. Dos instrucciones LEA cargan las direcciones
de desplazamiento de N A M E l y NAME2 en SI y DI como sigue:
LEA
SI,NAMEl
;Carga
LEA
DI,NAME2
de
desplazamientos
NAMEl
y AME2
El programa utiliza las direcciones de los registros SI y DI para mover el primer byte de NAMEl
al primer byte de NAME2. Los corchetes alrededor de SI y DI en los operandos de MOV significan que la instruccin es para usar el desplazamiento en el registro dado, a fin de accesar la
localidad de memoria. As
MOV
AL,
[SI]
significa "Utilice el desplazamiento en SI (NAMEl + 0 ) para mover el byte referenciado al registro A L " . Y la instruccin
101
Alineacin de direcciones
MOV
[DI] , AL
LA INSTRUCCIN INT
En ejecucin, una instruccin INT interrumpe el procesamiento y accesa la tabla de servicios de
interrupcin en memoria baja para determinar la direccin de la rutina solicitada. Despus, la
operacin transfiere al DOS o al BIOS para una accin especificada y regresa a su programa para
continuar el procesamiento. Con ms frecuencia, una interrupcin tiene que realizar los pasos
complejos de una operacin de entrada o salida. Las interrupciones necesitan de un camino que
facilite la salida de un programa y, tras una terminacin exitosa, el regreso al programa. Para este
objetivo, INT realiza lo siguiente:
Decrementa en 2 el apuntador de la pila y mete en la pila el contenido del registro de
banderas.
Limpia (pone a 0) las banderas de interrupcin y de trampa (IF y TF).
Decrementa en 2 el apuntador de la pila y mete en la pila el registro CS.
Decrementa en 2 el apuntador de la pila y mete en la pila el apuntador de instruccin.
Hace que la operacin solicitada sea realizada.
Para regresar de una interrupcin, la rutina emite un IRET (regreso de interrupcin), el cual
saca los registros de la pila y regresa a la instruccin inmediata posterior al INT en su programa.
Ya que el proceso anterior es automtico por completo, sus nicas preocupaciones son
definir una pila suficientemente grande, para las operaciones necesarias de agregar y remover
informacin de ella y utilizar las operaciones INT adecuadas. A partir del captulo 9, haremos uso
considerable de la instruccin INT.
ALINEACIN DE DIRECCIONES
Como el 8086 y el 80286 tienen un bus de datos de 16 bits (una palabra), ejecutan (trabajan) ms
rpido si accesan palabras que empiezan en una direccin (palabra) con nmero par. Considere
una situacin en la que los desplazamientos 0012H y 0013H contienen la palabra 63 A7H. El
102
Captulo 6
XX
I
0012
63
0013
A7
1
0014
XX
0015
En este caso, el procesador tiene que realizar dos accesos. Primero, accesa los bytes en 0012H y
0013H y enva el byte de 0013H (63) al registro AL. Despus accesa los bytes en 0014H y 0015H
y enva el byte de 0014H (A7) al registro AH. Ahora el AX contiene A763H.
Usted no tiene que realizar ninguna programacin especial para localidades pares o impares,
ni tiene que saber si una direccin es par o impar. La operacin de acceso invierte de forma
automtica una palabra de memoria en un registro, de manera que retome su orden correcto.
El 80386 y procesadores posteriores tienen un bus de datos de 32 bits. De acuerdo con esto,
se prefiere la alineacin de elementos referenciados en direcciones que sean divisibles entre cuatro
(una direccin de palabra doble). (Tcnicamente, los procesadores 486 y Pentium prefieren alineacin en un lmite de 16 bytes [prrafo].)
El lenguaje ensamblador tiene una directiva ALIGN que se puede usar para alinear elementos en lmites. Por ejemplo, ALIGN 2 alinea en un lmite de palabra y ALIGN 4 alinea en un
lmite de palabra doble. Tambin, como el inicio del segmento de datos siempre est en un lmite
de prrafo, podra organizar sus primeros datos con valores de palabras dobles, despus con
valores de palabra y por ltimo con valores de byte. Sin embargo, el 80386 y procesadores
posteriores ejecutan a velocidad tan rpida que usted probablemente nunca notar los efectos de
forzar el alineamiento.
103
Puntos clave
[BX]
La codificacin de ES: indica un operador de invalidacin que significa "Reemplace el uso normal
del registro de segmento DS con el de E S " .
El ejemplo siguiente mueve un valor de un byte desde el AL a este otro segmento, en un
desplazamiento formado por el valor en el DI ms 24:
MOV ES:
[DI + 24] , AL
desde AL
[BX]
[BX]
desde AL
PUNTOS CLAVE
Un operando proporciona una fuente de datos para una instruccin. Algunas instrucciones
no necesitan operandos, mientras que otras pueden tener uno o dos operandos.
En donde existan dos operandos, el segundo es el fuente, que contiene ya sea datos inmediatos
o la direccin (de un registro o de memoria) de los datos. El primer operando es el destino,
que contiene datos en un registro o en la memoria que sern procesados.
En formato inmediato, el segundo operando contiene un valor constante o una expresin.
Los operandos inmediatos deben coincidir con el tamao de un registro: una constante de un
byte con un registro de un byte (AL, BH) y una constante de una palabra con un registro de
una palabra (AX, BX).
En formato de memoria directa, uno de los operandos hace referencia a una localidad de
memoria y el otro a un registro.
El direccionamiento indirecto utiliza la capacidad de la computadora para direccionamiento
segmento desplazamiento. Los registros usados son BX, DI, SI y BP, codificados dentro de
corchetes como un operador de ndice. BX, DI y SI estn asociados con el DS como DS:BX,
DS:DI y DS:SI, respectivamente, para procesamiento de datos en el segmento de datos. El
BP est asociado con el SS como SS:BP para manejo de datos en la pila.
Puede combinar los registros en un direccionamiento indirecto como [BX + SI], lo que
significa la direccin en BX ms la direccin en el SI.
104
Captulo 6
AX, 3 2 5 A H
AX, [325AH]
(b) Para el segundo MOV, un operando est entre corchetes. Cul es el nombre de esta caracterstica?
6-3. ( a ) De que manera significativa difieren las siguientes instrucciones en su ejecucin?
MOV
BX,0
MOV
[BX] , 0
(b) Para el segundo MOV, qu tipo de direccionamiento est involucrado con el primer operando?
6-4. Explique la operacin de la instruccin
MOV
CX,
[BX+SI+4]
6-5. El enunciado siguiente tiene un error; esto es, se necesita algo para que el ensamblador lo traduzca:
MOV
[BX] , [SI]
DB
BYTE2
DB
WORD1
DW
(a)
MOV
BYTEl,
(b)
MOV AL,
WORD1
; El
operando
es
correcto
(c)
MOV
034AH
;El
operando
es
correcto
BL,
BYTE2
6-7. Codifique lo siguiente como instrucciones con operandos inmediatos: (a) almacenar 320 en el AX;
(b) comparar FLDB con cero; (c) sumar 40 hex al BX; (d) restar 40 hex del CX; (e) recorrer FLDB
un bit a la izquierda; (f) recorrer el CH un bit a la derecha.
Preguntas
105
6-8. Codificar una instruccin que intercambie los contenidos de una palabra llamada WORDl con el CX.
6-9. Codifique instrucciones para establecer BX con la direccin (desplazamiento) de un elemento llamado
TABLEX.
6-10. En trminos generales, cul es el objetivo de la instruccin INT?
6-11. (a) Cmo afecta la instruccin INT a la pila? (b) Cmo afecta la instruccin IRET a la pila?
6-12. Codifique, ensamble, enlace y utilice DEBUG para probar el programa siguiente:
Defina elementos byte llamados BYTEA y BYTEB (con cualquier valor) y una palabra llamada
WORDC (con cero).
Mueva el contenido de BYTEA al AL.
Sume el contenido de BYTEB al AL.
Mueva el valor inmediato 25H al BL.
Intercambie los contenidos del AL y BL.
Multiplique el contenido de BL por el de AL (MUL BL).
Almacene el producto en AX y envelo a WORDC.
CAPTULO 7
OBJETIVO
Explicar el objetivo y los usos de programas .COM y c m o
preparar un programa en lenguaje ensamblador para ese formato.
INTRODUCCIN
Hasta ahora slo hemos escrito, ensamblado y ejecutado programas .EXE. De forma automtica,
el enlazador genera un formato particular para un programa .EXE y, cuando se almacena en disco,
es precedido por un bloque especial de encabezado que al menos es de 512 bytes (el captulo 24
proporciona detalles de los bloques de encabezado).
Tambin puede generar un programa .COM para ejecucin. Un ejemplo de uso comn de
programa .COM es el C O M M A N D . C O M . Las ventajas de programas .COM estn en que son
ms pequeos que programas .EXE comparables y son ms fciles de adaptar para actuar como
programas residentes en memoria. El formato .COM tiene sus races en los das anteriores al
DOS, cuando el tamao de los programas estaba limitado a 64K.
107
Inicializacin
Cuando el DOS carga un programa .COM para ejecucin, inicializa de forma automtica todos los
registros de segmentos con la direccin del PSP. Ya que los registros CS y DS contendrn la
direccin de segmento inicial correcta, su programa no tiene que cargarlos.
Puesto que el direccionamiento comienza en un desplazamiento de 100H bytes desde el
inicio del PSP, codifique una directiva ORG como ORG 100H inmediatamente despus de
SEGMENT (segmento de cdigo) o el enunciado .CODE. La directiva ORG le indica al ensamblador
que empiece la generacin del cdigo objeto en un desplazamiento de 100H bytes pasando el
inicio del PSP, en donde el programa .COM real inicia.
108
Captulo 7
No
existe
segmento
de
la
pila
(STACK)
Puede ignorar este mensaje, ya que se supone que no debe existir definida una pila. Un programa
con nombre EXE2BIN convierte programas .EXE a programas .COM. (En realidad, convierte
programas .EXE a un archivo .BIN binario; el nombre del programa significa "convierte EXE a
BIN", pero debe poner a su archivo de salida la extensin .COM.) Suponiendo que EXE2BIN est
en la unidad por omisin, y que el archivo enlazado llamado CALC.EXE est en la unidad D,
teclee.
EXE2BIN
D:CALC D:CALC.COM
[ENTER]
Ya que el primer operando del comando siempre se refiere a un archivo .EXE, no codifique la extensin .EXE. El segundo operando puede ser un nombre diferente a C A L C . C O M . Si omite la
extensin, EXE2BIN supone que es BIN, que despus tendra que renombrar como .COM a fin de
ejecutar el programa (alguien, en algn lugar, debi pensar que esta forma era una buena idea).
Conversin con Borland
Con tal de que su programa fuente est codificado de acuerdo con los requisitos .COM, usted
puede convertir en forma directa su programa objeto en programa .COM. Utilice la opcin IT
para TLINK:
TLINK
/T
D:CALC
La pila de .COM
109
BEGIN:
FLDA
FLDB
FLDC
DW
DW
DW
250
125
?
MAIN
PROC
MOV
ADD
MOV
MOV
INT
ENDP
ENDS
END
NEAR
AX,FLDA
AX, FLDB
FLDC,AX
AX,4C00H
21H
TITLE
CODESG
MAIN
CODESG
Figura 7-1
;Definiciones de datos
Mover 0250 a AX
Sumar 012 5 a AX
Almacenar suma en FLDC
Salida a DOS
BEGIN
INT 21H, funcin 4CH, finaliza el procesamiento y sale al DOS. Para este propsito,
tambin puede usar la instruccin RET.
Aqu estn los pasos para convertir el programa para MASM y TASM:
MASM
TASM
MASM D : E X C O M l , D :
TASM
LINK D : E X C O M l , D :
TLINK /T D:EXCOMl,D:
EXE2BIN D:EXCOMl
D:EXCOM,D:
D:EXCOMl.COM
Los programas .EXE y .COM son de 792 bytes y de 24 bytes, respectivamente. La diferencia es en gran parte causada por el bloque de encabezado de 512 bytes almacenado al inicio de los
mdulos .EXE. Teclee DEBUG D:EXCOMl .COM para rastrear la ejecucin del programa .COM
hasta (pero no incluyendo) la ltima instruccin.
Cuando codifique un programa .COM, tambin puede utilizar directivas simplificadas de
segmentos, como se muestra en la figura 7-2. Una vez ms, slo define un segmento de cdigo,
no una pila ni un segmento de datos.
L A PILA D E . C O M
Para un programa .COM, el DOS define de manera automtica una pila y establece la misma
direccin de segmento en los cuatro registros de segmento. Si el segmento de 64K para el programa es suficientemente grande, el DOS establece la pila al final del segmento y carga el registro SP
con FFFEH, la parte superior de la pila (el tope de la pila).
Si el segmento de 64K no contiene espacio suficiente para una pila, el DOS establece la pila
al final de la memoria. En cualquier caso, el DOS mete despus una palabra con cero a la pila, la
cual acta como un desplazamiento para el IP, si usted utiliza RET para terminar la ejecucin del
programa.
Si su programa es grande, o si la memoria est limitada, debe tener cuidado al enviar
palabras a la pila. El comando DIR indica el tamao de un archivo y le dar una idea del espacio
110
BEGIN:
page 6 0
P07COM2
.MODEL
.CODE
ORG
JMP
FLDA
FLDB
FLDC
MAIN
TITLE
MAIN
Figura 7-2
132
Programa
SMALL
.COM
para
mover
sumar
datos
100H
MAIN
, I n i c i o al f i n a l de P S P
,- S a l t o p a s a n d o l o s d a t o s
DW
DW
DW
250
125
,-Definiciones
PROC
MOV
ADD
MOV
MOV
INT
ENDP
END
NEAR
AX, FLDA
AX,FLDB
FLDC,AX
AX,4C00H
21H
de
Captulo 7
datos
,-Mover 0 2 5 0 a A X
/ S u m a r 0 1 2 5 a AX
/Almacenar suma en
/Volver a DOS
FLDC
BEGIN
disponible para una pila. La mayora de los programas ms pequeos en este libro estn en
formato .COM, que deben ser distinguidos con facilidad de los de formato .EXE.
PUNTOS CLAVE
Un programa .COM est restringido a un segmento de 64K.
Un programa .COM es ms pequeo que su programa .EXE contraparte.
Un programa escrito para correr como .COM no define una pila o un segmento de datos ni
inicializa el registro DS.
Un programa escrito para correr como .COM utiliza ORG 100H inmediatamente despus
del enunciado SEGMENT. El enunciado establece la direccin de desplazamiento al inicio
de la ejecucin que sigue al PSP.
Para MASM de Microsoft, el programa EXE2BIN convierte un archivo .EXE a formato .COM.
TLINK de Borland puede convertir un programa objeto directamente a formato .COM.
El DOS define una pila para un programa .COM al final del programa.
111
Preguntas
PREGUNTAS
7-1.
7-2.
7-3.
7-4.
7-5.
CAPITULO 8
OBJETIVO
Cubrir los requisitos para control de programas (ciclos y transferencia de control [saltos]), para comparaciones lgicas, para
operaciones lgicas entre bits y para organizacin del programa.
INTRODUCCIN
Hasta este captulo los programas que hemos examinado han sido ejecutados en forma lineal, esto
es, con una instruccin secuencialmente a continuacin de otra. Sin embargo, rara vez un problema programable es tan sencillo. La mayora de los programas constan de varios ciclos en los que
una serie de pasos se repite hasta alcanzar un requisito especfico y varias pruebas para determinar
qu accin se realiza de entre varias posibles. Una prctica comn es verificar si un programa est
al final de su ejecucin.
Requisitos como stos implican la transferencia de control a la direccin de una instruccin
que no sigue de inmediato de la que se est ejecutando actualmente. Una transferencia de control
puede ser hacia adelante, para ejecutar una serie de pasos nuevos, o hacia atrs, para volver a
ejecutar los mismos pasos.
Ciertas instrucciones pueden transferir el control fuera del flujo secuencial normal aadiendo un valor de desplazamiento al IP. A continuacin estn las instrucciones introducidas en este
captulo, por categoras:
112
113
Etiquetas de instrucciones
OPERACIONES
DE COMPARACIN
OPERACIONES DE
TRANSFERENCIA
OPERACIONES
LGICAS
CORRIMIENTO Y
ROTACIN
CALL
AND
SAR/SHR
SAL/SHL
CMP
TEST
JMP
NOT
Jnnn
OR
RCR/ROR
LOOP
XOR
RCL/ROL
Instrucciones
Corta
Cercana
Lejana
Mismo segmento
-128 a 127
Mismo segmento
-32,768 a 32,767
Otro segmento
s
s
s
N/A
s
s: 80386 y posteriores
no
s
s
no
no
s
JMP
Jnnn
LOOP
CALL
ETIQUETAS DE INSTRUCCIONES
Las instrucciones J M P , Jnnn (salto condicional) y LOOP requieren un operando que se refiere a
la etiqueta de una instruccin. El ejemplo siguiente salta a A90, que es una etiqueta dada a una
instruccin MOV:
A90
JMP
A9 0
MOV.
AH,00
La etiqueta de una instruccin, tal como A90:, terminada con dos puntos (:) para darle el atributo
de cercana esto es, la etiqueta est dentro de un procedimiento en el mismo segmento de cdigo.
Cuidado: Un error comn es la omisin de los dos puntos. Note que una etiqueta de direccin en
un operando de instruccin (como J M P A20) no tiene un carcter de dos puntos.
Tambin puede codificar una etiqueta en una lnea separada como
A90
MOV.
AH,0
114
Captulo 8
LA INSTRUCCIN J M P
Una instruccin usada comnmente para la transferencia de control es la instruccin JMP (jump,
salto, bifurcacin). Un salto es incondicional, ya que la operacin transfiere el control bajo cualquier circunstancia. Tambin, JMP vaca el resultado de la instruccin previamente procesada;
por lo que, un programa con muchas operaciones de salto puede perder velocidad de procesamiento. El formato general para J M P es
[etiqueta:]
JMP
direccin
corta,
cercana
lejana
Una operacin J M P dentro del mismo segmento puede ser corta o cercana (o de manera
tcnica, lejana, si el destino es un procedimiento con el atributo FAR). En su primer paso por un
programa fuente, el ensamblador genera la longitud de cada instruccin. Sin embargo, una instruccin J M P puede ser de dos o tres bytes de longitud. Una operacin J M P a una etiqueta dentro
de - 1 2 8 a + 1 2 7 bytes es un salto corto. El ensamblador genera un byte para la operacin (EB) y
un byte para el operando. El operando acta como un valor de desplazamiento que la computadora
suma al registro IP cuando se ejecuta el programa. Los lmites son de OOH hasta FFH, o de - 1 2 8
hasta + 1 2 7 . El ensamblador ya puede haber encontrado el operando designado (un salto hacia
atrs) dentro de - 1 2 8 bytes, como en
A50 :
JMP
A5 0
En este caso, el ensamblador genera una instruccin de mquina de dos bytes. Una JMP que excede
- 1 2 8 a + 1 2 7 bytes se convierte en un salto cercano, para el que el ensamblador genera un cdigo
de mquina diferente (E9) y un operando de dos bytes (8086/80286) o un operando de cuatro
bytes (80386 y procesadores posteriores). En un salto hacia adelante, el ensamblador an no ha
encontrado el operando designado:
JMP
A90
A90 :
Ya que algunas versiones del ensamblador no saben en este punto si el salto es corto o cercano,
generan de forma automtica una instruccin de tres bytes. Sin embargo, estipulando que en
realidad el salto es corto se puede utilizar el operador SHORT para forzar un salto corto y una
instruccin de dos bytes codificando
JMP
SHIRT
A9 0
A90 :
115
La instruccin JMP
TITLE
0100
0100
0100
0103
0106
0109
0109
010C
010E
0110
0112
MAIN
B8 0001
BB 0001
B9 0001
page 60,132
P08JUMP (COM)
.MODEL SMALL
.CODE
100H
ORG
PROC
NEAR
MOV
AX, 01
MOV
BX, 01
MOV
CX, 01
Iniciacin de AX,
BX y
CX a 01
A20 :
05
03
DI
EB
0001
D8
El
F7
MAIN
ADD
ADD
SHL
JMP
ENDP
END
Figura 8-1
AX, 01
BX,AX
CX, 1
A2 0
Sumar 01 a AX
Sumar AX a BX
Multiplicar por dos a CX
Saltar a la etiqueta A20
MAIN
Suma 1 a AX
Suma AX a BX
Duplica el valor en CX
Al final del ciclo, la instruccin JMP A20 transfiere el control a la instruccin etiquetada con
A20. El efecto de repetir el ciclo hace que AX se incremente como 1 , 2 , 3 , 4 , . . . ; BX aumente de
acuerdo a la suma de los primeros nmeros naturales, obtenindose 1, 3, 6, 10, ...; y CX se
duplique como 1, 2, 4, 8, ... Ya que este ciclo no tiene salida, el procesamiento es infinito por
lo comn no es una buena idea.
En el programa, A20 es -9 bytes desde el JMP. Puede confirmar esta distancia examinando
el cdigo objeto para JMP:EBF7. EB es el cdigo de mquina para un J M P cercano y F7 hex es
la notacin en complemento a dos del - 9 . El IP contiene el desplazamiento (0112H) de la siguiente instruccin a ejecutarse. La operacin J M P suma el F7 (tcnicamente, FFF7, ya que el IP es de
tamao de una palabra) al IP, que contiene el desplazamiento 0112H de la siguiente instruccin
al JMP:
DECIMAL
Apuntador de instruccin:
O p e r a n d o de JMP:
D i r e c c i n de salto:
HEXADECIMAL
274
0112
-9
FFF7
265
(1)0109
(complemento a dos)
116
Captulo 8
LA INSTRUCCIN LOOP
Como se mencion en la figura 8-1, la instruccin JMP provoca un ciclo infinito. Pero es ms
probable que una rutina realice un ciclo un nmero especfico de veces o hasta que se alcance una
condicin particular. La instruccin LOOP, que sirve para este propsito, requiere un valor
inicial en el registro CX. En cada iteracin, LOOP de forma automtica disminuye 1 de CX. Si el
valor en el CX es cero, el control pasa a la instruccin que sigue; si el valor en el CX no es cero,
el control pasa a la direccin del operando. La distancia debe ser un salto corto, desde - 1 2 8 hasta
+ 127 bytes. Para una operacin que exceda este lmite, el ensamblador enva un mensaje como
"salto relativo fuera de rango". El formato general para LOOP es
[etiqueta:]
LOOP
direccin
corta
El programa en la figura 8-2 ilustra el uso de LOOP y realiza la misma operacin que la del
programa de la figura 8-1, salvo que termina despus de 10 vueltas. Una instruccin MOV inicializa
el CX con el valor 10. Como LOOP utiliza el CX, este programa usa ahora DX en lugar de CX
para duplicar el valor inicial de 1. La instruccin LOOP reemplaza JMP A20 y, para un procesamiento ms rpido, INC AX (incrementa el AX en 1) reemplaza ADD A X , 0 1 .
Igual que para J M P , el operando del cdigo de mquina contiene la distancia desde el final
de la instruccin LOOP a la direccin de A20, la cual es sumada al IP.
Como un ejercicio til, modifique su copia de la figura 8-1 con estos cambios y ensamble,
enlace y convierta el programa a .COM. Utilice DEBUG para rastrear a lo largo de los 10 ciclos.
Una vez que CX es reducido a cero, los contenidos de AX, BX y DX son, 000BH, 0042H y
0400H, respectivamente. Presione Q para salir de DEBUG.
Existen dos variaciones de la instruccin LOOP, ambas tambin decrementan el CX en 1.
LOOPE/LOOPZ (repite el ciclo mientras sea igual o repite el ciclo mientras sea cero) contina el
ciclo mientras que el valor en el CX es cero o la condicin de cero est establecida. LOOPNE/
LOOPNZ (repite el ciclo mientras no sea igual o repite el ciclo mientras sea cero) contina el ciclo
mientras el valor en el CX no es cero o la condicin de cero no est establecida.
TITLE
0100
0100
0100
0103
0106
0109
010C
010C
010D
010F
0111
0113
0116
0118
BEGIN
B8
BB
BA
B9
0001
0001
0001
000A
p a g e 6 0,132
P 0 8 L O O P (COM)
.MODEL SMALL
.CODE
ORG
100H
PROC
NEAR
MOV
AX, 01
MOV
BX, 01
MOV
DX, 01
MOV
CX, 10
A20 :
40
03
DI
E2
D8
E2
F9
B8
CD
4C00
21
BEGIN
INC
ADD
SHL
LOOP
AX
BX, A X
DX, 1
A2 0
MOV
INT
ENDP
END
AX,4C00H
21H
Ilustracin
de
LOOP
Iniciar AX,
BX, y
DX con 01
Iniciar
nmero de iteraciones
S u m a r 01 a AX
S u m a r AX a BX
M u l t i p l i c a r p o r dos a DX
D e c r e m e n t a r CX,
iterar si es diferente de
Salida a DOS
BEGIN
Figura 8-2
cero
117
Registro de banderas
Ni LOOP ni sus variantes LOOPxx afectan ninguna bandera en el registro de banderas, que
seran cambiados por otras instrucciones dentro de la rutina del ciclo. Como consecuencia, si la
rutina no tiene instrucciones que afecten la bandera ZF (cero) entonces el uso de LOOPNE/
LOOPNZ sera equivalente a usar LOOP.
REGISTRO DE BANDERAS
El resto del material de este captulo necesita de un conocimiento ms detallado del registro de
banderas. Este registro tiene 16 bits, los cuales varias instrucciones ponen a 1 para indicar el estado
de una operacin. En todos los casos, una bandera permanece en 1 hasta que otra instruccin lo
cambia. El registro de banderas para modo real tiene los siguientes bits usados comnmente:
Bit n o . :
Sealizador:
15
14
13
12
11
10
4
A
1 0
118
Captulo 8
LA INSTRUCCIN C M P
La instruccin C M P por lo comn es utilizada para comparar dos campos de datos, uno o ambos
de los cuales estn contenidos en un registro. El formato general para C M P es
[etiqueta:]
CMP
{registro/memoria},{registro/memoria/inmediato}
El resultado de una operacin C M P afecta las banderas AF, C F , OF, PF, SF y Z F , aunque
no tiene que probar estas banderas de forma individual. El cdigo siguiente prueba el registro BX
por un valor cero:
X
B50:
CMP
BX,0 0
,-Compara
JZ
B50
,-Si
(accin
si
...
es
es
BX
cero
con
salta a
diferente
/Destino
del
cero
de
salto,
B50
cero)
si
BX
es
cero
[etiqueta:]
Jnnn
direccin
corta
119
DEC
CX
JNZ
A20
;Equivalente a LOOP
DEC y JNZ realizan exactamente lo que hace LOOP. DEC decrementa el CX en 1 y pone a 1 o a
0 la bandera de cero (ZF) en el registro de banderas. Despus JNZ prueba la configuracin de la
bandera de cero; si el CX es diferente de cero, el control pasa a A20, y si el CX es cero el control
pasa a la siguiente instruccin hacia abajo. (La operacin de salto tambin brinca la lnea de
espera cola de instruccin de prebsqueda del procesador.) Aunque LOOP tiene usos limitados,
en este ejemplo es ms eficaz que el uso de las instrucciones DEC y JNZ.
Al igual que para J M P y LOOP, el operando en cdigo de mquina contiene la distancia
desde el final de la instruccin JNZ a la direccin de A20, la cual es sumada al apuntador de
instruccin. Para el 8086/286, la distancia debe ser un salto corto, desde - 1 2 8 hasta + 1 2 7 bytes.
Si una operacin excede este lmite, el ensamblador enva un mensaje "salto relativo fuera de rang o " . El 80386 y procesadores posteriores proporcionan desplazamientos de 8 bits (corto) o de 32
bits (cercano) que permiten alcanzar cualquier direccin dentro del segmento.
Datos con signo y sin signo
Distinguir el propsito de los saltos condicionales debe clarificar su uso. El tipo de datos (sin
signo o con signo) sobre los que se realizan las comparaciones o la aritmtica puede determinar
cul es la instruccin a utilizar. Un dato sin signo trata todos los bits como bits de datos; ejemplos
tpicos son las cadenas de caracteres, tal como nombres o direcciones, y valores numricos tal
como nmeros de cliente. Un dato con signo trata el bit de ms a la izquierda como un signo, en
donde 0 es positivo y 1 es negativo. Muchos valores numricos pueden ser positivo o negativo.
En el ejemplo siguiente, el AX contiene 11000110 y el BX contiene 00010110. La siguiente
instruccin
CMP AX,BX
compara el contenido del AX con el contenido del BX. Para datos sin signo, el valor AX es
mayor; sin embargo, para datos con signo el valor AX es menor a causa del signo negativo.
Saltos con base en datos sin signo
Las instrucciones siguientes de salto condicional se aplican a datos sin signo:
SMBOLO
DESCRIPCIN
BANDERA EXAMINADA
JE/JZ
ZF
JNE/JNZ
ZF
JA/JNBE
Bifurca
CF, ZF
JAE/JNB
CF
JB/JNAE
CF
JBE/JNA
CF, AF
120
Captulo 8
Cada una de estas pruebas las puede expresar en uno de dos cdigos simblicos de operacin. Seleccione aquel que sea ms claro y ms descriptivo. Por ejemplo, aunque JB y JNAE
generan el mismo cdigo objeto, la prueba afirmativa JB es ms fcil de entender que la prueba
negativa JNAE.
Saltos con base en datos con signo
Las instrucciones siguientes de salto condicional se aplican a datos con signo:
SMBOLO
DESCRIPCIN
JE/JZ
Salta
si
es
igual
JNE/JNZ
Salta
si
no
es
JG/JNLE
Salta
si
es
mayor
salta
si
JGE/JNL
Salta
si
es
mayor
igual
JL/JNGE
Salta
si
es
menor
salta
si
JLE/JNG
Salta
si
es
menor
igual
igual
salta
o
BANDERA EXAMINADA
si
es
cero
salta
si
no
no
es
salta
no
es
cero
menor
si
es
salta
ZF
no
mayor
si
no
ZF
o igual
ZF,
SF,
es m e n o r
SF,
OF
igual
SF,
OF
es m a y o r
ZF,
SF,
OF
OF
Los saltos para la prueba de igual o cero (JE/JZ) y para la prueba de no igual o cero (JNE/
JNZ) estn incluidos en las listas de datos sin signo y datos con signo, ya que una condicin de
igual o cero ocurre sin importar la presencia de signo.
Pruebas aritmticas especiales
Las siguientes instrucciones de salto condicional tienen usos especiales:
DESCRIPCIN
SMBOLO
BANDERA PROBADA
JS
Salta
si
el
signo
es
negativo
SF
JNS
Salta
si
el
signo
es
positivo
SF
JC
Salta
si
hay
(igual
CF
JNC
Salta
si
no
JO
Salta
si
hay
JNO
Salta
si
no
JP/JPE
Salta
si
hay
JNP/JPO
Salta
si
no
acarreo
hay
que JB)
acarreo
CF
desbordamiento
hay
desbordamiento
paridad
hay
OF
paridad
salta
o
si la
s a l t a si
OF
paridad
la
es par
paridad es
PF
impar
PF
JC y JNC con frecuencia son usados para probar el xito de operaciones en disco. Otro salto
condicional, JCXZ, prueba el contenido del registro CX contra cero. Esta instruccin no necesita
ser colocada inmediatamente despus de una operacin aritmtica o de comparacin. Un uso de
JCXZ podra ser al inicio de un ciclo, para asegurarse de que en realidad CX contiene un valor
diferente de cero.
No espere memorizar todas estas instrucciones; sin embargo, como recordatorio note que
un salto para datos sin signo es igual, superior o inferior, mientras que un salto para datos con
signo es igual, mayor que o menor. Los saltos que prueban las banderas de acarreo, de desbordamiento y de paridad tienen propsitos nicos. El ensamblador traduce el cdigo simblico en
Llamada a procedimientos
121
cdigo objeto, sin importar qu instruccin utilice, pero, por ejemplo JAE y JGE aunque en
apariencia son similares, no prueban las mismas banderas.
El 80386 y procesadores posteriores permiten saltos condicionales lejanos. Puede indicar
un salto corto o lejano, por ejemplo,
JNE
direccin corta
JAE
direccin lejana
(SHORT)
(FAR)
LLAMADA A PROCEDIMIENTOS
Hasta ahora los segmentos de cdigo han consistido slo en un procedimiento, codificado como
BEGIN
PROC
BEGIN
ENDP
FAR
En este caso el operando FAR informa al sistema que la direccin indicada es el punto de entrada para
la ejecucin del programa, mientras que la directiva ENDP define el final del procedimiento. Sin
embargo, un segmento de cdigo puede tener cualquier nmero de procedimientos, todos distinguidos por PROC y ENDP. Un procedimiento llamado (o subrutina) es una seccin de cdigo
que realiza una tarea definida y clara (tal como ubicar el cursor o bien obtener entrada del teclado).
La organizacin de un programa en procedimientos proporciona los beneficios siguientes:
Reduce la cantidad de cdigo, ya que un procedimiento comn puede ser llamado desde
cualquier lugar en el segmento de cdigo.
Fortalece la mejor organizacin del programa.
Facilita la depuracin del programa, ya que los errores pueden ser aislados con mayor
claridad.
Ayuda en el mantenimiento progresivo de programas, ya que los procedimientos son
identificados de forma rpida para su modificacin.
Operaciones C A L L y R E T
La instruccin CALL transfiere el control a un procedimiento llamado, y la instruccin RET
regresa del procedimiento llamado al procedimiento original que hizo la llamada. RET debe ser la
ltima instruccin en un procedimiento llamado. Los formatos generales para CALL y RET son:
[etiqueta:]
CALL
[etiqueta:]
RET
procedimiento
[inmediato]
El cdigo objeto particular que CALL y RET generan depende de si la operacin implica un
procedimiento NEAR (cercano) o un procedimiento FAR (lejano).
L l a m a d a y regreso cercanos. Una llamada (CALL) a un procedimiento dentro del mismo
segmento es cercana y realiza lo siguiente:
122
Capitulo 8
TITLE
0000
0000
0003
0006
0008
0008
0008
OOOB
OOOC
BEGIN
E8
0008
B8
CD
4C00
21
BEGIN
B10
E8
OOOC
C3
OOOC
OOOC
OOOD
page 60,132
P 0 8 C A L L P (EXE)
.MODEL
SMALL
. STACK
64
.DATA
.CODE
PROC
CALL
MOV
INT
ENDP
AX,4C00H
21H
PROC
CALL
NEAR
CO
B10
RET
ENDP
CO
PROC
CO
RET
ENDP
C3
FAR
B10
END
Figura 8-3
Llamada
procedimientos
/Llamada
,-Salida
/Llamada
a
a
B10
DOS
CO
/De r e g r e s o a
/
quien llama
NEAR
/De r e g r e s o a
quien llama
BEGIN
Llamada a procedimientos
123
Las directivas PROC para B10 y CIO tienen el atributo NEAR para indicar que estos procedimientos estn dentro del segmento de cdigo actual. Puesto que la omisin del atributo
hace que el ensamblador por omisin tome NEAR, muchos ejemplos subsiguientes lo omiten.
En el procedimiento BEGIN, la instruccin CALL transfiere el control del programa al
procedimiento B10 e inicia su ejecucin.
En el procedimiento B10, la instruccin CALL transfiere el control al procedimiento CIO e
inicia su ejecucin.
En el procedimiento CIO, la instruccin RET hace que el control regrese a la instruccin
que sigue a CALL CIO.
En el procedimiento B10, la instruccin RET hace que el control regrese la instruccin que
sigue a CALL B10.
Entonces el procedimiento BEGIN reasume el procesamiento desde ese punto.
RET siempre regresa a la rutina que llama. Si B10 no termina con una instruccin RET, las
instrucciones se ejecutaran pasando B10 e iran directamente a CIO. De hecho, si CIO no
contiene un RET el programa ejecutara, pasando el final de CIO, todas las instrucciones (si
hay) que estuvieran ah, con resultados impredecibles.
Tcnicamente, puede transferir el control a un procedimiento cercano por medio de una
instruccin de salto o incluso por cdigo normal en lnea. Pero por claridad y consistencia, utilice
CALL para transferir el control a un procedimiento y utilice RET para terminar la ejecucin de un
procedimiento.
EFECTOS EN LA PILA DE LA EJECUCIN DE PROGRAMAS
Hasta este punto nuestros programas han tenido poca necesidad de meter datos en la pila y, en
consecuencia, hemos definido una pila muy pequea. Sin embargo, una llamada a procedimiento
puede llamar (CALL) a otro procedimiento, el cual a su vez aun puede llamar (CALL) a otro
procedimiento, de manera que la pila debe ser los suficientemente grande para contener las direcciones guardadas. Todo esto llega a ser ms fcil de lo que parece a primera vista, y para la
mayora de nuestros propsitos una definicin de la pila de 32 palabras es suficiente.
CALL y PUSH almacenan una direccin de una palabra o valor en la pila. RET y POP sacan
de la pila y accesan la palabra previamente guardada. Todas estas operaciones cambian la direccin del desplazamiento en el rigistro de SP para la palabra siguiente. A causa de esta caracterstica, las operaciones RET y POP deben coincidir con sus operaciones originales CALL y PUSH.
Como un recordatorio, al cargar un programa .EXE para ejecucin el cargador de sistema
establece los valores siguientes en los registros:
DS y ES: La direccin del PSP, un rea de 256 bytes (100H) que precede un mdulo de
programa ejecutable en memoria.
CS: La direccin del segmento de cdigo el punto de entrada a su programa.
IP: Cero, si la primera instruccin ejecutable est en el inicio del segmento de cdigo.
SS: La direccin del segmento de la pila.
SP: Desplazamiento del tope de la pila. Por ejemplo, para una pila definida como .STACK
64 (64 bytes o 32 palabras), en un inicio SP contiene 64, o 40H.
Rastree el programa sencillo de la figura 8-3 a lo largo de su ejecucin. En la prctica, las
llamadas procedimientos tendran cualquier nmero de instrucciones.
Lgica y c o n t r o l de p r o g r a m a s
124
Captulo 8
La localidad disponible actual para agregar o remover es el tope de la pila. Para este ejemplo, el cargador tendra establecido el SP al tamao de la pila, 64 bytes (40H). El programa
realiza las operaciones siguientes:
CALL B10 disminuye en 2 el SP, de 40H a 3EH. Despus mete el IP (con 0003) en el tope
de la pila en el desplazamiento 3EH. ste es el desplazamiento de la instruccin que sigue
a la instruccin CALL. El procesador utiliza la direccin formada por CS:IP para transferir
el control a B10. Las palabras en memoria contienen bytes en orden inverso; por ejemplo
0003 se convierte en 0300.
Desplazamiento de la pila:
XXXX
i
I
0036
XXXX
I
I
0038
XXXX
i
1
003A
XXXX
1
1
003C
0300
i
SP = 3E00H
1
003E
XXXX
i
1
0036
XXXX
i
1
0038
XXXX
l
1
003A
0B00
i
1
003C
0300
i
SP = 3C00H
1
003E
Para regresar de CO, la instruccin RET remueve el desplazamiento (000B) del tope de la
pila a 3CH, la inserta en el IP e incrementa el SP en 2 a 3EH. Esto provoca un regreso
automtico al desplazamiento 000BH en el procedimiento B10.
XXXX
XXXX
1
0036
1
0038
XXXX
1
1
003A
0B00
1
003C
0300
i
SP = 3E00H
1
003E
El RET al final del procedimiento B10 saca la direccin (0003) del tope de la pila en 3EH
y la enva al IP e incrementa en 2 el SP a 40H. Esto provoca un regreso automtico al
desplazamiento 0003H, en donde el programa termina su ejecucin.
XXXX
1
XXXX
1
0036
0038
XXXX
i
1
003A
0B000
i
1
003C
0300
1
1
003E
Si utiliza DEBUG para ver la pila, puede encontrar datos irrelevantes a la izquierda de un
programa previamente ejecutado.
Operaciones booleanas
125
OPERACIONES BOOLEANAS
La lgica booleana es importante en el diseo de circuitos y tiene un paralelo en la lgica de
programacin. Las instrucciones para lgica booleana son AND, OR, XOR, TEST y NOT, que
pueden usarse para poner bits en 0 o 1 y para manejar datos ASCII con propsitos aritmticos
(captulo 13). El formato general para las operaciones booleanas es
[etiqueta:]
operacin
{registro/memoria},{registro/memoria/inmediato}
Resultado:
AND
OR
XOR
0101
0101
0101
0011
0011
0011
0001
0111
0110
Es til recordar la siguiente regla: el empleo de AND con bits 0 es 0 y el de OR con bits 1
es 1.
Ejemplos de operaciones booleanas
Para los siguientes ejemplos independientes, suponga que el AL contiene 1100 0101 y el BH
contiene 0101 1100:
AL, BH
2 . AND
AL,00H
3.
AND
AL,0FH
4.
OR
BH, AL
5.
OR
CL, CL
,-Pone en uno SF y ZF
6.
XOR
AL, AL
7.
XOR
AL,0FFH
1.
AND
Lgica y c o n t r o l d e p r o g r a m a s
126
Captulo 8
Los ejemplos 2 y 6 muestran formas de limpiar un registro, y ponerlo a cero. El ejemplo 3 pone
a cero los cuatro bits ms a la izquierda de AL. Aunque el uso de C M P puede ser ms claro, puede
utilizar OR para los siguientes fines:
1. OR
CX,CX
Verifica
...
, S a l t a si es c e r o
CX,CX
/Verifica
JZ
2. OR
JS
...
Salta
si
CX
contra
cero
el
signo
de
es
negativo
CX
TEST acta igual que AND, pero slo establece las banderas. Aqu estn algunos ejemplos:
1.
TEST
BL,11110000B
JNZ
2.
TEST
AL,00000001B
TEST
;AL
un
;El
DX,OFFH
JZ
de
los
izquierda
JNZ
3.
;Alguno
es
bits
BL
en
de
ms
la
diferente
de
cero?
contiene
nmero
DX
impar?
contiene
un v a l o r
cero?
La instruccin N O T
La instruccin NOT slo invierte los bits en un byte o palabra en un registro o en memoria: esto
es, convierte los ceros en unos y los unos en ceros. El formato general para NOT es
[etiqueta:]
NOT
{registro/memoria}
Por ejemplo, si el AL contiene 1100 0101, la instruccin NOT AL cambia el AL a 0011 1010 (el
resultado es el mismo de XOR AL,OFFH del anterior ejemplo 7). Las banderas no son afectadas.
NOT no es lo mismo que NEG, que cambia un valor binario de positivo a negativo y viceversa,
inviniendo los bits y sumando 1.
MAYSCULAS
Letra A:
Letra Z:
Bit:
01000001
01011010
76543210
Letra a:
Letra z:
Bit:
01100001
01111010
76543210
Corrimiento de bits
TITLE
127
Cambio de minsculas
a maysculas
BEGIN:
P08CASE (COM)
.MODEL SMALL
.CODE
ORG
100H
JMP
MAIN
TITLEX
DB
MAIN
PROC
LEA
MOV
NEAR
BX.TITLEX+l
CX,26
MOV
CMP
JB
CMP
JA
AND
MOV
AH,[BX]
AH,61H
B3 0
AH, 7AH
B30
AH,11011111B
[BX] , AH
Carcter de TITLEX
Es
letra
minscula
letra?
Si - convertirla
Restaurar en TITLEX
INC
LOOP
MOV
INT
ENDP
END
BX
B20
AX,4C00H
21H
B20 :
B3 0 :
MAIN
carcter
BEGIN
Figura 8-4
El programa .COM de la figura 8-4 convierte el contenido de un dato, TITLEX, de minscula a mayscula, empezando en T I T L E X + 1. El programa inicializa el BX con la direccin de
TITLEX +1 y utiliza la direccin para mover cada carcter al AH, iniciando en TITLEX + 1 . Si el
valor est entre 61H y 7AH, una instruccin AND establece el bit 5 en 0:
AND
AH,11011111B
Todos los dems caracteres distintos de a hasta z permanecen sin cambio. Despus la rutina mueve
el carcter cambiado de regreso a TITLEX, incrementa el BX para el siguiente carcter y repite el
ciclo.
Usado de esta manera, el registro BX funciona como un registro de ndice para las localidades de memoria direccionadas. Para el mismo fin, tambin se puede utilizar SI y DI.
C O R R I M I E N T O D E BITS
Las instrucciones de corrimiento, que son parte de la capacidad lgica de la computadora, pueden
realizar las siguientes acciones:
Hacer referencia a un registro o direccin de memoria.
Recorre bits a la izquierda o a la derecha.
Recorre hasta 8 bits en un byte, 16 bits en una palabra y 32 bits en una palabra doble (80386
y procesadores posteriores).
Corrimiento lgico (sin signo) o aritmtico (con signo).
El segundo operando contiene el valor del corrimiento, que es una constante (un valor
inmediato) o una referencia al registro CL. Para los procesadores 8088/8086, la constante inme-
Lgica y c o n t r o l de p r o g r a m a s
128
Captulo 8
diata slo puede ser 1; un valor de corrimiento mayor que 1 debe estar contenido en el registro Cl.
Procesadores posteriores permiten constantes de corrimiento inmediato hasta de 3 1 . El formato
general para el corrimiento es
[etiqueta:]
(registro/memoria),{CL/inmediato)
>
AL
COMENTARIO
MOV
CL,03
MOV
AL,10110111B
10110111
SHR
AL,01
01011011
Un
SHR
AL,CL
00001011
Tres
AX,03
Vlido
SHR
para
corrimiento
corrimientos
80186
la
derecha
adicionales
procesadores
la
derecha
posteriores
AL
COMENTARIO
CL,03
MOV AL,10110111B
10110111
SAR AL,01
; 11011011
Un
SAR AL,CL
; 11111011
Tres
SAR AX,03
; Para
80186
corrimiento
corrimientos
procesadores
la
a
derecha
la
derecha
posteriores
En especial, los corrimientos a la derecha son tiles para (dividir entre dos) obtener mitades
de valores y son mucho ms rpidas que utilizar una operacin de divisin. En los ejemplos de
corrimientos de tres bits a la derecha, el primer corrimiento de un bit a la derecha en realidad
divide entre dos, y el segundo y tercer corrimientos a la derecha en realidad dividen entre 8.
129
<-
<
Las siguientes instrucciones relacionadas ilustran SHL para datos sin signo:
INSTRUCCIN
MOV
AL
COMENTARIO
CL,03
MOV A L , 1 0 1 1 0 1 1 1 B
; 10110111
SHL A L , 0 1
; 01101110
Un corrimiento a la izquierda
SHL A L , C L
; 01110000
Tres
SHL AX,03
corrimientos ms
posteriores
El primer SHL desplaza el contenido del AL un bit hacia la izquierda. El bit desplazado de ms a
la izquierda ahora se encuentra en la bandera de acarreo, y el ltimo bit a la derecha del AL se
llena con cero. El segundo SHL desplaza tres bits ms el AL. La bandera de acarreo contiene en
forma sucesiva 0, 1 y 1, y se rellena con tres ceros a la derecha del AL.
Los corrimientos a la izquierda llenan con cero el bit de ms a la derecha. Como resultado
de esto, SHL y SAL son idnticos. Los corrimientos a la izquierda en especial son tiles para duplicar
valores y son mucho ms rpidos que usar una operacin de multiplicacin. En los ejemplos de la
operacin de corrimiento a la izquierda, el primer corrimiento de un bit a la izquierda en realidad
multiplica por 2, y el segundo y tercer corrimientos de tres bits a la izquierda en realidad multiplican por 8. Tambin, si tiene que desplazar dos bits, es ms eficaz la codificacin de dos instrucciones de corrimiento que almacenar 2 en el CL y codificar un corrimiento.
Al finalizar una operacin de corrimiento, puede utilizar la instruccin JC (salta si hay
acarreo) para examinar el bit que ingres a la bandera de acarreo.
R O T A C I N DE B I T S (desplazamiento circular)
Las instrucciones de rotacin, que son parte de la capacidad lgica de la computadora, pueden
realizar las siguientes acciones:
Lgica y c o n t r o l de p r o g r a m a s
130
Captulo 8
rotacin
{registro/memoria},{CL/inmediato}
1*
->
->
BH
COMENTARIO
M O V C L , 03
MOV
BH,10110111B
10110111
ROR BH,01
11011011
ROR
BH,CL
01111011
Tres
ROR
BX,03
Para
80186
Una
rotacin
rotaciones
procesadores
la
a
derecha
la
derecha
posteriores
<-
<-
5
5
Tablas de bifurcacin
131
BL
COMENTARIO
CL,03
MOV BL,10110111B
; 10110111
ROR B L , 0 1
11011011
ROR BL,CL
01111011
ROR BX,03
AX, 1
RCL
DX, 1
EL SHL desplaza a la izquierda todos los bits del AX, y el bit de ms a la izquierda lo enva a la
bandera de acarreo. El RCL desplaza el DX a la izquierda e inserta el bit del CF en el bit vacante
de ms a la derecha. Para multiplicar por 4, haga seguir a la pareja SHL-RCL por otra pareja
SHL-RCL.
Para divisin, otra vez considere un valor en 32 bits en DX:AX. Las instrucciones para
"dividir" entre dos el valor seran
SAR
DX,1
RCR
AX, 1
Para dividir entre cuatro, haga seguir a la pareja SAR-RCR por otra pareja SAR-RCR.
Los desplazamientos de doble precisin para el 80386 y procesadores posteriores son SHRD
y SHLD.
TABLAS DE BIFURCACIN
Un programa puede tener una rutina para probar varias condiciones relacionadas, de las que cada
una necesita un salto a otra rutina. Por ejemplo, considere un sistema para una compaa que ha
establecido cdigos especiales para los clientes con base en su nivel de crdito y volumen de
ventas. Los cdigos indican la cantidad de descuento ofrecido y otros procesos especiales que
pueden necesitarse para el cliente. Los cdigos de los clientes son 0, 1, 2, 3 y 4.
132
Captulo 8
Una manera convencional de manejar cdigos es comparar de manera sucesiva contra cada
cdigo de cliente:
CMP
CUSCODE, 0
JE
DOODSCT
CMP
CUSCODE,1
JE
D10DSCT
CMP
CUSCODE,2
JE
D20DSCT
CMP
CUSCODE,3
JE
D3 0DSCT
CMP
CUSCODE,4
JE
D40NSCT
/Cdigo
0?
;Cdigo
1?
Cdigo
= 2?
;Cdigo
;Cdigo
= 4?
3?
Con este enfoque, es grande la ocasin para errores: slo considera la comparacin de los cdigos
correctos contra sus valores y salta a la rutina correcta. Una solucin ms elegante involucra una
tabla de direcciones de salto. Como se muestra en el programa parcial de la figura 8-5, CUSTTBL
define de manera sucesiva las cinco direcciones en palabras (dos bytes cada una). La rutina en
D10JUMP accesa los cdigos (como valores hexadecimales 00-04) en el registro BX. El valor es
duplicado, de manera que 0 permanece como 0, 1 se convierte en 2, 2 se convierte en 4, y as
sucesivamente. El valor duplicado proporciona un desplazamiento en la tabla: CUSTTBL4-0 es la
primera direccin, C U S T T B L + 2 es la segunda, C U S T T B L + 4 es la tercera, y as sucesivamente.
El operando de la instruccin J M P , [ C U S T T B L + B X ] , forma una direccin con base en el inicio
de la tabla ms un desplazamiento en la tabla. Despus la operacin salta de manera directa a la
rutina apropiada.
Una restriccin importante en el programa es que los cdigos slo pueden ser valores
hexadecimales 00-04; cualquier otro valor causara terribles resultados! Si utiliza DEBUG para
ejecutar este programa, para verificar el resultado de la lgica ingrese valores hexadecimales
vlidos (00-04) en CUSCODE.
Para el 80386 y procesadores posteriores podra reemplazar las dos instrucciones en
D10JUMP, esto es;
MOV
BL,CUSCODE
Obtiene
XOR
BH,BH
Limpia
el
la
cdigo
parte
de
descuento
superior
de
BX
BX,CUSCODE
Obtiene
cdigo
de
descuento
ORGANIZACIN DE UN PROGRAMA
Lo siguiente son los pasos comunes al escribir un programa en lenguaje ensamblador:
1. Tenga una idea clara del problema que el programa va a resolver.
2. Esboce sus ideas en trminos generales y planee la lgica general. Por ejemplo, si un problema
es examinar las operaciones de movimiento de mltiples bytes, inicie definiendo los campos
Organizacin de un programa
133
60,132
PAGE
P08JMPTB (EXE)
.MODEL SMALL
.STACK 64
TITLE
.DATA
DW
DW
DW
DW
DW
DB
DOONODSC
D10DSCT
D2 0DSCT
D3 0DSCT
D40DSCT
04
.CODE
PROC
MOV
MOV
MOV
FAR
AX,data
DS,AX
ES,AX
;Iniciar
registros
; de segmento
0007 E8 OOOF R
CALL
D10JUMP
;Invocar rutina de
000A B8 4C00
OOOD CD 21
OOOF
MOV
INT
ENDP
AX,4C00H
21H
, Salida a dos
PROC
MOV
XOR
SHL
JMP
NEAR
BL,CUSCODE
BH, BH
BX, 01
[CUSTTBL+BX]
0000
0002
0004
0006
0008
000A
001B
001E
0021
0024
0027
04
0000
0000 B8
0003 8E D8
0005 8E CO
OOOF
OOOF
0013
0015
0017
CUSTTBL
R
R
R
R
R
CUSC0DE
BEGIN
R
BEGIN
D10JUMP
8A
32
DI
FF
1E OOOA R
FF
E3
A7 0000 R
001B
DOONODSC:
001B EB OD 90
001E
D10DSCT:
001E EB OA 90
0021
;Tabla de direcciones
;Cdigo de descuento
D3 0DSCT:
0024 EB 04 90
0027
D4 0DSCT:
0027 EB 01 90
002A C3
002B
D90RET:
D10JUMP
;Rutina cdigo 0
JMP
D90RET
JMP
D9 0RET
JMP
D90RET
;Rutina cdigo 1
D2 0DSCT:
0021 EB 07 90
0024
sal
,Rutina cdigo 2
/Rutina cdigo 3
JMP
D90RET
/Rutina cdigo 4
JMP
RET
ENDP
END
Figura 8-5
D90RET
BEGIN
Tabla de bifurcaciones
que sern movidos. Despus planee la estrategia para las instrucciones: rutinas de inicializacin, para uso de salto condicional y para uso de LOOP. Lo siguiente muestra la lgica
principal: es seudocdigo que muchos programadores utilizan para planear un programa:
Inicializar los registros de segmento
Llamar a la rutina de bifurcacin
Llamar a la rutina del ciclo
Regresar al DOS
La rutina de bifurcacin podra ser planeada como:
Inicializar los registros del conteo, para direcciones de nombres
Salto 1:
Lgica y c o n t r o l d e p r o g r a m a s
134
Captulo 8
3. Organice el programa en unidades lgicas tales que rutinas relacionadas se sigan una a otra.
Procedimientos de alrededor de 25 lneas (el tamao de la pantalla) son ms fciles de
depurar que procedimientos ms largos.
4. Utilice como guas otros programas. Intentos de memorizar todo el material tcnico y codificar
"sin pensarlo bien" con frecuencia tienen como resultado ms errores en el programa.
5. Utilice comentarios para clarificar lo que se supone hace un procedimiento, qu operaciones
aritmticas y de comparacin son realizadas y lo que est haciendo una instruccin rara vez
usada. (Un ejemplo de lo anterior es LOOPNE: el ciclo se efecta mientras no sea igual o
hasta que no sea igual?)
6. Para teclear el programa, utilice una estructura de programa que pueda copiar en un archivo
con>un nuevo nombre.
El resto de los programas en este texto hacen uso considerable de J M P , LOOP, saltos
condicionales, CALL y llamadas a procedimientos. Ya cubierto lo bsico de lenguaje ensamblador,
ahora est en posicin para programacin ms avanzada y realista.
PUNTOS CLAVE
Una direccin corta es alcanzada por medio de un desplazamiento y est limitada a una
distancia de - 1 2 8 a 127 bytes. Una direccin cercana es alcanzada por medio de un desplazamiento y est limitada a una distancia de - 3 2 , 7 6 8 a 32,767 bytes dentro del mismo
segmento. Una direccin lejana est en otro segmento y es alcanzada por medio de una
direccin de segmento y un desplazamiento.
Una etiqueta como "B20:" dentro de un procedimiento necesita dos puntos (:) para indicar
que es una etiqueta cercana.
Las etiquetas para instrucciones de salto condicional y LOOP deben ser cortas. El operando
genera un byte de cdigo objeto: 01H a 7FH que cubre el rango desde el +1 hasta el +127
decimales, y FFH a 80H cubre el rango desde -1 hasta - 1 2 8 . Ya que las instrucciones de
mquina varan en longitud desde uno hasta cuatro bytes, el rango no es obvio, pero una
gua prctica es alrededor de dos pantallas completas de cdigo.
Inicialice CX con un valor positivo cuando utilice LOOP, ya que LOOP disminuye el CX y
verifica por un valor cero.
Cuando una instruccin establece una bandera en 1, sta permanece en 1 hasta que otra
instruccin la cambia.
Seleccione la instruccin apropiada de salto condicional, dependiendo de si la operacin
procesa datos con signo o sin signo.
Utilice C A L L para accesar un procedimiento e incluya RET al final del procedimiento para
el regreso. Un procedimiento llamado puede llamar a otros procedimientos, y si usted sigue
Preguntas
135
las convenciones, RET hace que salga la direccin correcta de la pila. Los nicos ejemplos
de este libro que saltan a un procedimiento estn al inicio de los programas .COM.
Utilice corrimiento (desplazamiento) a la izquierda para duplicar un valor y corrimiento a la
derecha para dividirlo entre dos. Asegrese de seleccionar la instruccin correcta de corrimiento para datos sin signo y para datos con signo.
PREGUNTAS
8-1. Explique estos trminos: (a) direccin corta; (b) direccin cercana; (c) direccin lejana.
8-2. (a) Cul es el nmero mximo de bytes que una instruccin JMP cercana, un LOOP y un salto
condicional pueden saltar? (b) Qu caractersticas del operando de cdigo de mquina provocan
este lmite?
8-3. Una instruccin JMP empieza en la localidad con desplazamiento 0624H. Determine la direccin de
transferencia con base en el siguiente cdigo objeto para el operando de JMP: (a) 27H; (b) 6BH; (c)
C6H.
8-4. Codifique una rutina usando LOOP que calcule la sucesin de Fibonacci: 1, 1, 2, 3, 5, 8, 13, . . .
(Salvo por los dos primeros nmeros en la sucesin, cada nmero es la suma de los dos nmeros que
le preceden.) Establezca el lmite de 12 vueltas. Ensmblela, enlcela y utilice DEBUG para rastrear
la rutina.
8-5. Suponga que AX y BX contienen datos con signo y que CX y DX contienen datos sin signo. Determine
las instrucciones CMP (en donde sea necesaria) y de salto condicional para lo siguiente:
(a) El valor de DX excede la de CX? (b) El valor de BX excede al de AX? (c) El CX contiene
cero? (d) Existe un desbordamiento? (e) El BX es igual o menor que el AX? (f) El DX es
igual o menor que el CX?
8-6. Qu banderas son afectadas y qu contendran en los siguientes sucesos?: (a) ocurri un
desbordamiento ; (b) un resultado es negativo; (c) un resultado es cero; (d) el procesamiento est en
modo de avance paso por paso; (e) una transferencia de cadena se hace de derecha a izquierda.
8-7. Refirase a la figura 8-3. Si el procedimiento B10 no contiene un RET, cul sera el efecto sobre la
ejecucin del programa?
8-8. Cul es la diferencia entre la codificacin de un operando PROC con FAR y con NEAR?
8-9. Cules son las formas en que un programa puede iniciar la ejecucin de un procedimiento?
8-10. En un programa .EXE, A10 llama a B10, B10 llama a CO y CO llama a DIO. Como resultado de
estas llamadas, cuntas direcciones contiene la pila?
8-11. Suponga que el BL contiene 1110 0011 y que la localidad llamada BOONO contiene 0111 1001.
Determine el efecto sobre el BL para lo siguiente: (a) XOR BL,BOONO; (b) AND BL.BOONO; (c)
OR BL,BOONO; (d) XOR B L . l l l l l l l l B ; (e) AND BL,0O0OOOO0B.
8-12. Corrija el programa de la figura 8-4 como sigue: Defina el contenido de TITLEX como letras
maysculas y codifique las instrucciones que conviertan maysculas a minsculas.
8-13. Suponga que el DX contiene 10111001 10111001 binario y que el CL contiene 03. Determine el
contenido hexadecimal de DX despus de la ejecucin de las siguientes instrucciones no relacionadas
(independientes): (a) SHR DX, 1; (b) SHR DX.CL; (c) SHL DX.CL; (d) SHL DL, 1; (e) ROR DX.CL;
(0 ROR DL,CL; (g) SAL DH,1.
8-14. Utilice instrucciones para recorrer, mover y sumar para multiplicar el contenido de AX por 10.
8-15. Una rutina al final de la seccin titulada "Rotacin de bits" multiplica el DX:AX por 2. Corrija la
rutina para (a) multiplicar por 4; (b) dividir entre 4; (c) multiplicar los 48 bits en el DX:AX:BX por
dos.
CAPTULO 9
Introduccin al procesamiento
en pantalla y del teclado
OBJETIVO
Introducir los requisitos para desplegar informacin en la pantalla y recibir informacin desde el teclado.
INTRODUCCIN
Hasta este punto, nuestros programas han definido datos ya sea en el rea de datos o como datos
inmediatos en un operando de instruccin. Sin embargo, la mayora de los programas necesitan
entradas desde un teclado, disco, ratn o mdem y proporcionan salidas en un formato til en la
pantalla, impresora o disco. Este captulo cubre los requisitos bsicos para mostrar informacin
en la pantalla y aceptar entradas desde el teclado.
Existen varios requisitos para especificar un dispositivo al sistema y solicitar una operacin
de entrada o salida. La instruccin INT (interrupcin), para la mayora de los propsitos, maneja
entrada y salida. Los dos tipos de interrupciones tratados en este captulo son las funciones de
INT 10H del BIOS para manejar la pantalla y las funciones de INT 21H del DOS para mostrar
salidas en pantalla y aceptar entrada desde el teclado. Estas funciones (o servicios) solicitan una
accin; para identificar el tipo de operacin que la interrupcin va a realizar, inserte un nmero de
funcin en el registro AH.
Las operaciones de bajo nivel del BIOS, como INT 10H transfieren el control de manera
directa al BIOS. Sin embargo, para facilitar algunas de las operaciones ms complejas, la INT
21H del DOS proporciona un servicio de interrupcin que transfiere primero el control al DOS.
Por ejemplo, la entrada desde un teclado puede consistir en un conteo de caracteres que se ingre136
La pantalla
137
san y verifican contra un nmero mximo. La operacin INT 21H del DOS maneja gran parte de
este procesamiento adicional de alto nivel y despus transfiere el control de manera automtica al
BIOS, que maneja la parte de bajo nivel de la operacin.
Como convencin, este libro se refiere al nmero ODH como el carcter Enter para el
teclado y como retorno de carro para la pantalla y la impresora.
Las operaciones introducidas en este captulo son:
FUNCIONES DE LA INT 10H DEL BIOS
02H
06H
02H
09H
OAH
3FH
40H
Fija el cursor
Recorre la pantalla
Despliega en pantalla
Despliega en pantalla
Entrada desde el teclado
Entrada desde el teclado
Despliega en pantalla
Los captulos 10 y 11 cubren las caractersticas avanzadas para manejo de la pantalla y el teclado.
LA PANTALLA
La pantalla es una malla de posiciones direccionables, en cualquiera de las cuales se puede colocar
el cursor. Por ejemplo, un monitor comn de video tiene 25 renglones (numerados del 0 hasta el
24) y 80 columnas (numeradas desde 0 hasta 79). A continuacin se muestran varios ejemplos de
ubicaciones del cursor:
Formato decimal
Ubicacin en pantalla
Formato hexadecimal
Rengln
Columna
Rengln
Columna
Esquina
superior
izquierda
00
00
00H
00H
Esquina
superior
derecha
00
79
00H
4FH
Centro de la pantalla
12
39/40
0CH
27H/28H
Esquina
Esquina
24
24
00
79
18H
00H
18H
4FH
inferior izquierda
inferior derecha
Introduccin a l p r o c e s a m i e n t o e n p a n t a l l a y d e l t e c l a d o
138
Capitulo 9
AH,02H
, P e t i c i n p a r a
MOV
BH, 00
;Nmero
MOV
D H , 05
;Rengln
MOV
D L , 12
, C o l u m n a 12
INT
10H
/Interrupcin
de
c o l o c a r el
pgina
cursor
05
que
llama
al
BIOS
Para establecer el rengln y columna en el DX tambin puede utilizar una instruccin MOV
con un valor hexadecimal inmediato, como
MOV
DX,050CH
/Rengln
05,
columna
12
LIMPIAR LA PANTALLA
La funcin 06H de la INT 10H del BIOS maneja el borrado o recorrido de la pantalla. Puede
limpiar todo o parte de un despliegue iniciando en cualquier localidad de la pantalla y terminando
en cualquier localidad con nmero mayor. Por ejemplo, para limpiar toda la pantalla especifique
el rengln:columna iniciales como 00:00H y el rengln:columna finales como 18:4FH. Cargue
estos registros:
AH = funcin 06H
AL = OOH para la pantalla completa
BH = nmero del atributo
CX = rengln:columna iniciales
DX = renglnxolumna finales
En el ejemplo siguiente el atributo 71H establece toda la pantalla con fondo blanco (7) con
primer plano azul (1):
MOV
AX,0600H
,-AH
MOV
BH,71H
;Atributo;
MOV
CX,0000H
/Esquina
superior izquierda
MOV
DX,184FH
;Esquina
inferior derecha
INT
10H
/Interrupcin
06
(recorrido) ,
blanco
AL
(7)
00
(pantalla
sobre
que llama
al
azul
completa)
(1)
rengln:
rengln:
columna
columna
BIOS
139
localidades. Esto puede causar un error en algunos sistemas. El captulo siguiente describe el
recorrido con mayor detalle.
Con frecuencia un programa tiene que desplegar mensajes al usuario que solicita datos o le
indica que ejecute una accin. Primero examinaremos los mtodos de las versiones originales del
DOS, que son tiles para ejercicios y programas pequeos, y ms adelante examinaremos los
mtodos con manejadores de archivo. Las operaciones del DOS original trabajan con todas las
versiones y en algunos aspectos son ms sencillas y ms fciles de usar, aunque se recomienda
utilizar operaciones ms recientes para el desarrollo de software.
,-Cadena de despliegue
AH, 09H
,-Peticin para
desplegar
LEA
DX,NAMPRMP
INT
21H
;Llama al DOS
La operacin INT no cambia el contenido de los registros. Una cadena desplegada que
excede la columna de la extrema derecha de la pantalla contina de forma automtica en el siguiente rengln, recorriendo la pantalla tanto como sea necesario. Si al final de la cadena se omite
el signo de pesos, la operacin despliega caracteres de la memoria hasta que encuentre un signo
as, si existe alguno.
Uso de la funcin 09H de la INT 21H para desplegar caracteres ASCII
La mayor parte de los 256 caracteres ASCII estn representados por smbolos que pueden ser
desplegados en una pantalla de video. Algunos valores, como 00H y FFH, pueden no tener un
smbolo desplegable y aparecen como un espacio en blanco, aunque el verdadero carcter ASCII
de espacio en blanco es 20H.
El programa .COM de la figura 9-1 despliega grupo completo de caracteres ASCII. El
programa llama a tres procedimientos:
B10CLR utiliza la funcin 06H de la INT 10H para limpiar la pantalla.
C10SET utiliza la funcin 02H de la INT 10H para inicializar el cursor en 00,00H.
Introduccin al p r o c e s a m i e n t o en p a n t a l l a y d e l t e c l a d o
140
TITLE
BEGIN:
CHAR
page 60,132
P 0 9 D O S A S (COM)
Exhibe
.MODEL SMALL
.CODE
ORG
100H
JMP
SHORT MAIN
DB
00,'$'
Procedimiento
<
MAIN
PROC
CALL
CALL
CALL
MOV
INT
ENDP
MAIN
NEAR
B10CLR
C10SET
D10DISP
AX.4C00H
21H
Despejar
B10CLR
B10CLR
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
C10SET
C10SET
PROC
MOV
MOV
MOV
INT
RET
ENDP
Exhibir
D10DISP
PROC
MOV
LEA
ASCII
OOH-FFH
principal:
pantalla:
cursor
NEAR
AH,02H
BH,0 0
DX,0000
10H
caracteres
Limpiar pantalla
Fijar c u r s o r
Exhibir caracteres
Salir a DOS
NEAR
AX,0600H
BH, 07
CX,0000
DX,184FH
10H
Fijar
los
Captulo 9
en
00,00:
,-Peticin d e f i j a r c u r s o r
;Pgina No. 0
/ H i l e r a 0, c o l u m n a 0
caracteres
ASCII
CX,256
DX, CHAR
Iniciar
Iniciar
AH,09H
21H
CHAR
D20
,-Exhibir
256 i t e r a c i o n e s
direccin de carcter
D20 :
D10DISP
MOV
INT
INC
LOOP
RET
ENDP
END
Figura 9-1
carcter ASCII
Incrementar
Decrementar
Regresar
BEGIN
D10DISP utiliza la funcin 09H de la INT 21H para desplegar el contenido de CHAR que
es inicializado en OOH y de manera sucesiva es incrementado en uno para desplegar cada
carcter hasta alcanzar FFH.
La primera lnea desplegada inicia con un blanco (OOH), dos "caritas felices" (01H y 02H)
y despus un corazn (03H), un diamante (04H), un trbol (05H). El carcter 06H tendra que mostrar
una pica, pero es borrada por caracteres de control posteriores. El carcter 07H hace que suene la
bocina, 08H provoca un carcter de retroceso, 09H ocasiona un tabulador, OAH provoca un
141
avance de lnea y ODH (Enter) causa un "retorno de carro" para el inicio de la lnea siguiente. Y,
por supuesto, con esta operacin, el smbolo de pesos, 24H, no se despliega. (Como ver en el
captulo 10, los servicios del BIOS pueden desplegar smbolos apropiados para estos caracteres
especiales.) El smbolo de la nota musical es OEH, y 7FH hasta FFH son caracteres ASCII
extendidos.
Puede corregir el programa para librar el intento de desplegar los caracteres de control. Las
instrucciones siguientes evitan todos los caracteres entre 08H y ODH; puede querer experimentar
con esta desviacin, digamos, slo para 08H (Retroceso) y ODH (Retorno de carro).
CMP
CHAR,0 8H
;Menor a 0 8H?
JB
D3 0
,-S,
CMP
CHAR,ODH
JBE
D4 0
;S,
entonces aceptar
entonces evitarlo
D3 0 :
MOV AH.0 9H
INT
21H
INC
CHAR
08H
ODH
Llama al DOS
D4 0 :
Aunque este ejercicio los evita, el despliegue de los caracteres de retroceso, tabulador,
avance de lnea y retorno de carro es la forma normal de realizar estas operaciones.
Sugerencia: Reproduzca el programa anterior, ensmblelo, enlcelo y convirtalo en un
archivo .COM.
142
NAMEPAR
LABEL
BYTE
MAXLEN
DB
20
ACTLEN
DB
NAMEFLD
DB
20
Inicio
de
la
Nmero
mximo
Nmero
real
Caracteres
DUP ( " )
lista
de
de
de
Captulo 9
parmetros
caracteres
caracteres
introducidos
de
de
del
entrada
entrada
teclado
AH, OAH
Peticin
de
la
funcin
LEA
DX, N A M E P A R
Carga
la
direccin
INT
21H
Llama
al
DOS
de
de
la
entrada
lista
de
parmetros
La operacin INT espera que el usuario introduzca caracteres y verifica que no excedan el mximo
(20 en MAXLEN en la lista de parmetros). La operacin repite cada carcter en la pantalla y
avanza el cursor. El usuario presiona la tecla Enter para sealar el final de la entrada. La operacin tambin transfiere el carcter Enter (ODH) al campo de entrada (en el ejemplo, NAMEFLD)
pero no lo cuenta en la longitud real. Si teclea un nombre como BROWN (Enter), la lista de
parmetros es como lo siguiente:
ASCII:
20
HWX:
14
05
42
52
4F
57
4E
OD
20
20
20
20
La operacin enva la longitud del nombre de entrada, 05H, al segundo byte de la lista de parmetros,
llamado en el ejemplo ACTLEN. El carcter Enter (ODH) est en N A M E F L D + 5 . (Aqu el smbolo
# indica este carcter, ya que ODH no es un smbolo imprimible.) Puesto que la longitud mxima
es de 20, incluyendo el ODH, el nombre introducido slo puede ser de hasta 19 caracteres.
La operacin acepta y acta sobre el carcter de retroceso, pero no lo agrega a la cuenta. La
operacin no acepta ms que el nmero mximo de caracteres. Si en el ejemplo anterior un usuario
teclea 20 caracteres sin presionar Enter, la operacin provoca que suene la bocina; en este punto,
slo acepta el carcter Enter.
La operacin pasa por alto las teclas de funcin ampliada, como F l , Inicio, RePg y las
teclas de direccin del cursor (flechas). Si usted espera que el usuario introduzca alguna de ellas,
utilice la INT 16H del BIOS o funcin 01H de la INT 21H del DOS, ambas estudiadas en el
captulo 11.
143
TITLE
page
60,132
P09CTRNM (EXE)
.MODEL SMALL
.STACK 64
AME PAR
MAXNLEN
NAMELEN
NAMEFLD
PROMPT
BEGIN
.DATA
LABEL
DB
DB
DB
DB
Lista de p a r m e t r o s nombre:
longitud mxima de nombre
no. de caracteres introducidos
nombre introducido
BYTE
20
1
21 DUP(
'ame? '
. CODE
PROC
MOV
MOV
MOV
CALL
FAR
AX,@data
DS,AX
ES, AX
Q10CLR
MOV
CALL
CALL
CALL
CALL
CMP
JE
CALL
CALL
JMP
DX,0000
Q2 0CURS
B10PRMP
D10INPT
Q10CLR
NAMELEN,00
A3 0
El0CODE
FIO CENT
A2 0LOOP
;Fijar cursor en
MOV
INT
ENDP
AX,4C00H
21H
;Salir a DOS
;Iniciar registros
; de segmento
,-Despejar p a n t a l l a
A20LOOP:
00,00
/Exhibir indicacin
;Proporciona entradas del nombre
,-Despejar p a n t a l l a
;Se ingres el nombre?
; no, salida
,-Fijar campana y '$'
,-Centra y exhibe el nombre
A30:
BEGIN
Exhibe
B10PRMP
B10PRMP
PROC
MOV
LEA
INT
RET
ENDP
indicador:
NEAR
AH,09H
DX,PROMPT
21H
,-Peticin de exhibicin
Acepta entrada de n o m b r e :
D10INPT
PROC
MOV
LEA
INT
RET
ENDP
NEAR
AH, OAH
DX, AME PAR
21H
Figura 9-2
;Peticin de teclado
,- entrada
144
Introduccin al p r o c e s a m i e n t o en p a n t a l l a y d e l t e c l a d o
Fijar
El 0CODE
El0CODE
PROC
MOV
MOV
MOV
MOV
RET
ENDP
campana
FIOCENT
PROC
MOV
SHR
NEG
ADD
MOV
CALL
MOV
LEA
INT
RET
ENDP
Q10CLR
PROC
NEAR
AX,0600H
BH, 3 0
CX,0000
DX,184FH
10H
Fijar
Q2 0CURS
Q2 0CRS
PROC
MOV
MOV
INT
RET
ENDP
exhibir
nombre
NEAR
DL,NAMELEN
DL, 1
DL
DL,40
D H , 12
Q2 0CURS
AH,09H
DX, N A M E F L D
21H
MOV
MOV
MOV
MOV
INT
RET
ENDP
'$'
Despejar
Q10CLR
delimitador
NEAR
B H , 00
.Reemplaza c a r c t e r E n t e r
(OD)
BL,NAMELEN
; c o n e l d e l a c a m p a n a (07)
NAMEFLD[BX],07
N A M E F L D [ B X + 1 ] , $ ' ; P o n e el d e l i m i t a d o r de e x h i b i c i n
Centrar
FIO-CENT
Captulo 9
nombre
pantalla
Peticin de recorrido
Color
(07 p a r a B l a n c o
De 00,00
A 24,79
hilera/columna
de
cursor
DX fija en entrada
Peticin de ubicar
Pgina 0
NEAR
AH,02H
BH, 0 0
10H
de pantalla
y Negro)
cursor
END
Figura 9-2
Rengln
(continuacin)
12:
Columna:
Pat
Brown
36
40
Observe que la instruccin en E10CODE que inserta el carcter campana (07H) en el rea de
entrada sigue de manera inmediata al nombre:
MOV
BH,00
,-Reemplaza
MOV
BL,NAMELEN
MOV
NAMEFLD
con
el
el
carcter
carcter
Enter
campana
(ODH)
(07H)
[BX],07H
Los dos primeros MOV establecen el BX con la longitud. El tercer MOV hace referencia a un
especificador de ndice en corchetes, que significa que el BX acta como un registro especial de
ndice para facilitar el direccionamiento extendido. El MOV combina la longitud en el BX con la
145
(hexadecimal):
|14 j 0 0|OD|
...
Si la longitud es cero, el programa determina que la entrada ha finalizado, como lo muestra por la
instruccin C M P NAMELEN,00 en A20LOOP.
Cmo borrar el carcter Enter
Usted puede utilizar caracteres de entrada para diferentes propsitos, como imprimir un reporte,
almacenar en una tabla o escribir en un disco. Para ello, tiene que haber reemplazado el carcter
Enter (ODH) con un espacio en blanco (20H) siempre que ste aparezca en NAMEFLD. El campo
que contiene la longitud real de los datos de entrada, NAMELEN, proporciona la posicin relativa del carcter Enter. Por ejemplo, si NAMELEN contiene 05, entonces el carcter Enter est en
N A M E F L D + 5 . Puede mover esta longitud al registro BX para indexar la direccin de NAMEFLD
como sigue:
<
MOV
BH,00
,-Establece el BX
MOV
BL,NAMELEN
; a 00 05
MOV
NAMEFLD
[BX]
Las dos primeras instrucciones MOV establecen el BX con la longitud 05. El tercer MOV mueve
un espacio en blanco (20H) a la direccin especificada en el primer operando: la direccin de
NAMEFLD ms el contenido de BX en realidad, N A M E F L D + 5 .
Cmo limpiar el rea de entrada
Los caracteres introducidos reemplazan a los anteriores que estn en un rea de entrada y permanecen hasta que otros caracteres los reemplazan. Considere las siguientes entradas sucesivas:
ENTRADA
1. PAINE
2. HAMILTON
3. ADAMS
AME PAR
(HEX)
|14|05|50|41|49|4E|45|0D|20|20|20| . . . |20 |
|14|08|48|41|4D|49|4C|54|4F|4E | 0D | . . . |20 |
| 14 |05|41|44 |414D|53 |0D|45|5A|0D| . . . |20|
El nombre HAMILTON reemplaza al nombre ms corto PAINE. Pero ya que el nombre ADAMS
es ms corto que HAMILTON, reemplaza HAMIL y el carcter Enter reemplaza a la T. Las letras
restantes, ON, an siguen a ADAMS. Puede querer borrar NAMEFLD antes de solicitar un
nombre, como sigue:
146
MOV
CX,20
;Inicializa
MOV
SI,0000
;Inicia
MOV
NAMEFLD
INC
SI
Incrementa
LOOP
B3 0
20
la
para
realizar
posicin
del
20
Captulo 9
ciclos
nombre
B30 :
[SI]
,20H
Un
espacio
en
blanco
para
el
al
nombre
siguiente
carcter
veces
En lugar del registro SI puede utilizar el DI o el BX. Un mtodo ms eficaz que mueve una
palabra de dos espacios en blanco necesita 10 ciclos. Sin embargo, como NAMEFLD est definido como DB (byte), tendra que invalidar su longitud con un operando WORD y PTR (apuntador), como se indica a continuacin:
MOV
CX,10
,-Inicializa p a r a
LEA
SI,NAMEFLD
;Inicializa
MOV
WORD
INC
SI
/Incrementa
INC
SI
LOOP
B30
/Repite
el
10
ciclos
principio
del
nombre
B30 :
PTR
[SI]
,2020H
;Dos
en
espacios
el
en
dos
blanco
para
el
nombre
lugares
nombre
10
veces
Interprete el MOV en B30 como "Mover una palabra en blanco a la localidad de memoria a donde
apunta el registro SI". Este ejemplo utiliza LEA para inicializar el borrado de NAMEFLD y
utiliza un mtodo ligeramente diferente para el MOV en B30 porque ya no puede codificar una
instruccin como
MOV
WORD
PTR[NAMEFLD],2020H
/No
vlido
El borrado del rea de entrada resuelve el problema de nombres ms cortos que siguen a
datos anteriores. Una prctica ms efectiva es borrar slo las posiciones a la derecha del nombre
que ha sido ingresado de manera ms reciente.
de
de
Tabulador
carro
lnea
ASCII
HEX
EFECTO EN EL CURSOR
13
ODH
Restablece
la
posicin
10
OAH
Avanza
la
lnea
09
09H
Avanza
la
siguiente
de
la
extrema
izquierda
de
tabulador
siguiente
marca
147
Siempre que despliegue salidas o acepte entradas, utilice estos caracteres de control para el manejo del cursor. Aqu est un ejemplo que despliega el contenido de una cadena de caracteres llamada MESSAGE, seguida por un retorno de carro y un avance de lnea para colocar el cursor en la
lnea siguiente:
MESSAGE
DB
09,
13,
MOV
AH,09H
Peticin de
LEA
DX,MESSAGE
INT
21H
Llama al DOS
10,
'$'
despliegue
ttulo
El uso de EQU para redefinir los caracteres de control puede hacer que un programa sea ms
legible:
CR
EQU
13
; (o EQU ODH)
LF
EQU
10
TAB
EQU
09
MESSAGE
DB
TAB,
CR,
LF,
'$'
F U N C I N 02H D E L D O S P A R A D E S P L I E G U E E N P A N T A L L A
Puede encontrar que la funcin 02H de la INT 21H, sea til para despliegue de un solo carcter.
Cargue en el DL el carcter que ser desplegado en la posicin actual del cursor, y solicite la INT
21H. Los caracteres de Tabulador, Retorno de carro y Avance de lnea actan normalmente, y la
operacin avanza de manera automtica el cursor. El cdigo en lenguaje ensamblador es:
MOV
AH,02H
MOV
DL.char
/Carcter desplegado
INT
21H
/Llama al DOS
El ejemplo siguiente muestra cmo utilizar este servicio para desplegar una cadena de caracteres. La cadena para desplegar est definida en CONAME. El programa carga la direccin de
C O N A M E en el registro DI y su longitud en el CX. El ciclo implica el incremento de DI (en INC)
para cada carcter sucesivo y la disminucin del CX (en LOOP) para el nmero de caracteres
desplegados. El cdigo es como sigue:
CONAME
DB
"Software Services',
MOV
AH,02H
MOV
CX, 19
LEA
DI,CONAME
MOV
DL,
/Carcter que
INT
21H
[DI]
13,
10
/Llama al DOS
se despliega
148
INC
DI
;Incrementa
LOOP
A3 0
,-Si
...
an
no
para
el
termina
siguiente
repite
el
Capitulo 9
carcter
ciclo
/Terminacin
MANEJADORES DE ARCHIVOS
Ahora examinaremos el uso de los manejadores de archivos para operaciones con la pantalla y el
teclado, que est ms en el estilo de UNIX o del OS/2. Un manejador de archivo slo es un
nmero que hace referencia a un dispositivo especfico. Ya que los manejadores de archivo siguiente estn preestablecidos, no tiene que definirlos:
MANEJADOR
DISPOSITIVO
00
01
02
03
04
Como puede verse, los manejadores de archivo normales son 00 para entrada del teclado )
01 para despliegue en pantalla. Otros manejadores de archivo, como aquellos para dispositivos dt
disco, tienen que ser establecidos por su programa. Tambin puede utilizar estos servicios par;
redireccionar la entrada y la salida a otros dispositivos, aunque esta caracterstica por el momentc
no nos interesa.
AH
BX
CX
DX
=
=
=
=
Funcin 40H
Manejador de archivo 01
Nmero de caracteres a desplegar
Direccin del rea de despliegue
Una operacin INT exitosa regresa al AX el nmero de bytes escritos y pone en cero la bandera
acarreo (la cual puede usted examinar).
Una operacin INT fallida pone en uno la bandera de acarreo y regresa un cdigo de erro
en el AX: 05H = acceso denegado (para un dispositivo no vlido o desconectado) o 06H =
manejador no vlido. Ya que el AX puede contener ya sea una longitud o un cdigo de error, 1
nica forma de determinar una condicin de error es probar la bandera de acarreo, aunque lo
errores en el despliegue son raros:
JC
rutina-de-error
;Prueba
por
si
existe
error
en
el
despliegue
La operacin responde igual que la funcin 09H del DOS a los caracteres de control 071
(Campana), 08H (Retroceso), OAH (Avance de lnea) y ODH (Retorno de carro). Las instruccic
nes siguientes ilustran esta operacin:
ODH,
149
DB
OAH
;rea de despliegue
MOV
AH,4 0H
;Peticin de
MOV
BX, 01
MOV
CX , 18
,-Despliega 18 caracteres
LEA
DX,DISAREA
;rea de despliegue
INT
21H
;Llama al DOS
despliegue
MOV BX,01
105
MOV CX,xx
108
MOV DX,10E
10B
INT 21
10D
NOP
10E
DB
'Your ame'
150
Captulo 9
Una operacin exitosa INT pone en cero la bandera de acarreo (que puede probar) y establece el AX con el nmero de caracteres introducidos.
Una operacin INT fallida podra deberse a un manejador no vlido; la operacin pone en
uno la bandera de acarreo e inserta un cdigo de error en el AX: 05H = acceso denegado (para un
dispositivo no vlido o uno desconectado) o 06H = manejador no vlido. Ya que el AX podra
contener ya sea la longitud o un cdigo de error, la nica forma de determinar una condicin de
error es examinar la bandera de acarreo, aunque los errores de teclado presumiblemente son raros.
Igual que la funcin OAH del DOS, la funcin 3FH tambin acta sobre el carcter de
retroceso, pero ignora teclas de funcin extendidas tal como F l , Inicio y AvPg.
Las instrucciones siguientes ilustran el uso de la funcin 3FH del DOS:
INAREA
DB
2 0 DUP('
MOV
AH,3FH
MOV
BX,00
MOV
CX,2 0
LEA
DX, I N A R E A
INT
21H
;Area
de
entrada
,-Peticin
de
;Manejador
de
entrada
archivo
para
el
teclado
, M x i m o 2 0 c a r a c t e r e s
,-rea
:Llama
de
al
entrada
DOS
La operacin INT espera que usted introduzca caracteres, pero desafortunadamente no verifica si
el nmero de stos excede el mximo en el registro CX (20 en el ejemplo). La presin de la tecla
Enter (ODH) seala la terminacin de una entrada. Por ejemplo, el tecleo de los caracteres "PC
Users Group" introduce lo siguiente en INAREA:
|PC
Users
Group|ODH|OAH|
Los caracteres tecleados son seguidos de manera inmediata por un Enter (ODH), que usted tecle,
y un avance de lnea (OAH) que no tecle. A causa de este hecho, el nmero mximo y la longitud
del rea de entrada deben dar espacio para dos caracteres adicionales. Si teclea menos caracteres del
mximo, las localidades siguientes en memoria a los caracteres ingresados an contienen los
caracteres ingresados con anterioridad.
Una operacin INT exitosa pone en cero la bandera de acarreo y establece el AX con el
nmero de caracteres enviados. En el ejemplo anterior, este nmero es 14 ms 2 por los caracteres
Enter y avance de lnea, es decir 16. De acuerdo con esto, un programa puede determinar el
nmero real de caracteres introducidos. Aunque esta caracterstica es trivial para respuesta SI y
NO, es til para respuestas con longitud variable, como nombres.
Si teclea un nombre que exceda el mximo en el registro CX, la operacin en realidad acepta
todos los caracteres. Considere una situacin en la que el CX contiene 08 y un usuario introduce
los caracteres "PC Exchange". La operacin coloca los primeros ocho caracteres en el rea de
entrada "PC Excha" sin Enter ni Avance de lnea siguindolos y establece el AX con una longitud
de 08. Ahora, observe esto: la siguiente operacin INT por ejecutar no acepta un nombre directamente del teclado, ya que el resto de la cadena anterior an se encuentra en su bfer. Enva "nge"
seguido por los caracteres Enter y Avance de lnea al rea de entrada y establece el AX en 05.
Ambas operaciones son "normales" y ponen en cero la bandera de acarreo:
Puntos clave
151
Primer INT:
PC Excha
Segundo INT:
nge,
ODH,
AX = 08
OAH
AX = 05
MOV AH, 3F
102
MOV BX, 00
105
MOV CX, 0C
108
MOV DX,10F
10B
INT 21
10D
JMP 100
10F
DB 20 20 20 20 20 20 20 20 20 20 20 20
PUNTOS CLAVE
El despliegue monocromtico permite utilizar 4K bytes de memoria: 2K estn disponibles
para caracteres y 2K para un atributo de cada carcter.
El despliegue bsico de color permite utilizar 16K bytes y puede operar en color o monocromo.
Puede procesar ya sea en modo de texto, para despliegue normal de caracteres, o en modo
grfico.
Sea consistente en el uso de la notacin hexadecimal. Por ejemplo, INT 21 no es lo mismo
que INT 21H.
152
Capitulo 9
La instruccin INT 10H transfiere el control al BIOS para operaciones de despliegue. Dos
operaciones comunes son la funcin 02H (ubicar el cursor) y 06H (recorrer la pantalla).
DOS INT 21H provee funciones especiales para manejar algunos problemas input/output.
La funcin 09H de la INT 21H del DOS para despliegue define un delimitador ($)
inmediatamente despus del rea de despliegue. Un delimitador ausente puede provocar
efectos espectaculares en la pantalla.
La funcin OAH de la INT 21H para entrada del teclado espera que el primer byte contenga
un nmero mximo e inserta de manera automtica un valor real en el segundo byte.
Un manejador de archivo es un nmero que se refiere a un dispositivo especfico. Algunos
nmeros para los manejadores estn preestablecidos, mientras que otros los puede establecer
su programa.
Para desplegar la funcin 40H del DOS, utilice el manejador 01 en el BX.
Para la funcin 3FH del DOS en la entrada del teclado, utilice 00 en el BX. La operacin
incluye los caracteres Enter y Avance de Lnea despus de los caracteres tecleados en el rea
de entrada. No verifica que las entradas excedan el mximo que usted especific.
PREGUNTAS
9-1. Cules son los valores hexadecimales para (a) la posicin superior izquierda y (b) la posicin
inferior derecha en una pantalla de 80 columnas?
9-2. Codifique la instruccin para fijar el cursor en el rengln 12, columna 8.
9-3. Codifique las instrucciones para limpiar la pantalla, empezando en el rengln 12, columna 0 hasta el
rengln 22, columna 79.
9-4. Codifique los datos y la funcin 09H de la INT 21H del DOS, para mostrar el mensaje "Cul es la
fecha (mm/dd/aa)?" Haga que una seal auditiva siga al mensaje.
9-5. Codifique los datos y la funcin OAH de la INT 21H del DOS, para aceptar entrada desde el teclado
de acuerdo con el formato de la pregunta 9-4.
9-6. La seccin titulada "Cmo limpiar el rea de entrada" muestra cmo limpiar toda el rea de entrada
del teclado, definida como NAMEFLD. Cambie el ejemplo de modo que limpie slo los caracteres
que queden a la derecha de nombre ms recientemente ingresado.
9-7. Teclee el programa de la figura 9.2 con los cambios siguientes: (a) En lugar del rengln 12, establezca
el centro en el rengln 15; (b) en lugar de limpiar toda la pantalla, limpie slo del rengln 0 al 15.
Ensamble, enlace y pruebe el programa nuevo.
9-8. Identifique los manejadores de archivo estndar para (a) entrada del teclado; (b) despliegue normal
en pantalla; (c) la impresora.
9-9. Codifique los datos y la funcin 40H de la INT 21H del DOS, para mostrar el mensaje "Cul es la
fecha (mm/dd/aa)?" Despus del mensaje, enve una seal auditiva.
9-10. Codifique los datos y la funcin 3FH de la INT 21H del DOS, para aceptar entrada desde el teclado
de acuerdo con el formato de la pregunta 9-4.
9-11. Corrija el programa que se muestra en la figura 9-2 para utilizar las funciones 3FH y 40H de la INT
21H del DOS para entrada y despliegue. Ensamble, enlace y pruebe el programa nuevo.
CAPTULO 10
Procesamiento avanzado
de la pantalla
OBJETIVO
Estudiar las caractersticas avanzadas de manejo de la pantalla, incluyendo recorrido, video inverso, intermitencia y grficas a color.
INTRODUCCIN
El captulo 9 introdujo las caractersticas bsicas concernientes al manejo de la pantalla y la
entrada desde el teclado. Este captulo trata las caractersticas avanzadas para los adaptadores de
video, modos de configuracin (texto o grfico) y manejo de la pantalla. La primera seccin
describe los adaptadores comunes de video y sus reas de despliegue de video asociadas.
Las secciones sobre el modo de texto explican el uso del byte de atributo para color, intermitencia e intensidad, as como las instrucciones para establecer el tamao y posicin del cursor,
recorrer hacia arriba o hacia abajo de la pantalla y desplegar caracteres. Las ltimas secciones explican
el uso de los modos grficos, junto con las distintas instrucciones usadas para su despliegue.
Este captulo introduce los siguientes servicios ofrecidos por la INT 10H del BIOS:
00H
01H
02H
03H
04H
05H
154
06H
07H
08H
09H
OAH
OBH
OCH
ODH
OEH
OFH
11H
12H
13H
1BH
1CH
Captulo 10
ADAPTADORES DE VIDEO
Los ms comunes adaptadores de video son:
MDA
HGC
CGA
EGA
MCGA
VGA
El VGA y sus clones super VGA reemplazaron a los adaptadores de video CGA y EGA.
Programas escritos para un CGA o un EGA por lo comn pueden correr con un sistema VGA,
aunque programas escritos especficamente para VGA no corren en un CGA o un EGA.
El adaptador de video consta de tres unidades bsicas: el controlador de video, el video de
BIOS y el rea de despliegue de video.
1. El controlador de video, esta unidad "es el caballo de batalla", genera las seales de rastreo
del monitor para el modo seleccionado, texto o grfico. El procesador de la computadora
enva instrucciones a los registros del controlador y lee ah la informacin de estado.
2. El video de BIOS, que acta como una interfaz con el adaptador de video, contiene rutinas,
como para establecer el cursor y desplegar caracteres.
3. El rea de despliegue de video en memoria contiene la informacin que el monitor va a
mostrar. Las interrupciones que manejan el despliegue en pantalla de forma directa transfieren
a esta rea sus datos. Las localidades del adaptador de video dependen de los modos de
video que se estn usando. Para los adaptadores principales, a continuacin estn las
direcciones del inicio de los segmentos de despliegue de video:
A000:[0] Utilizada para descripcin de fuentes cuando est en modo de texto y para
grficos de alta resolucin para EGA, MCGA y VGA
B000:[0] Modo de texto monocromtico para MDA, EGA y VGA
Modo de texto
155
B100:[0] P a r a H C G
B800:[0] Modos de texto para CGA, MCGA, EGA y VGA y modos grficos para CGA,
EGA, MCGA y VGA.
El monitor grfico de color RGB comn permite la entrada de seales que son enviados a
tres caones de electrones (rojo, verde y azul, para cada uno de los colores primarios aditivos).
AH, 00H
MOV
AL.03H
INT
10H
;Llama al BIOS
80 x 25
Si escribe programas para monitores de video desconocidos, puede utilizar la INT 10H,
funcin OFH (tratada ms adelante), la cual regresa en el AL el modo de video actual. Otro
enfoque es usar la INT 11H de BIOS para determinar el dispositivo conectado al sistema, aunque
la informacin enviada es muy primitiva. La operacin regresa un valor al AX, con los bits 5 y 4
que indican el modo de video:
01:40 x 25, usando un adaptador de color
10:80 X 25, usando un adaptador de color
11:80 x 25, usando un adaptador monocromtico.
MODO DE TEXTO
El modo de texto se utiliza para el despliegue normal en la pantalla de caracteres ASCII. El
procesamiento es semejante tanto para monocromtico como a color, salvo que a color no permite
el atributo de subrayado. El modo de texto proporciona acceso a todo el conjunto de 256 caracteres ASCII extendido. La figura 10-1 muestra los modos de texto comunes, con el nmero de modo
a la izquierda.
Modos de texto 00 (mono) y 01 (color). Estos modos permiten usar un formato de 40
columnas. Aunque fueron diseados originalmente para el CGA, son compatibles los siguientes y
tambin operan con funciones en sistemas EGA y VGA.
156
Modo
Tamao
Tipo
Adaptador
Resolucin
00
(25
renglones, Mono
40 cois)
CGA
EGA
MCGA
VGA
320
320
320
360
X
X
X
X
200
350
400
400
01
(25
renglones, Color
40 cois)
CGA
EGA
MCGA
VGA
320
320
320
360
X
X
X
X
200
350
400
400
02
(25
renglones, Mono
80 cois)
CGA
EGA
MCGA
VGA
640
640
640
720
X
X
X
X
200
350
400
400
03
(25
renglones, Color
80 cois)
CGA
EGA
MCGA
VGA
640
640
640
720
X
X
X
X
200
350
400
400
renglones, Mono
80 cois)
MDA
EGA
VGA
720
720
720
X 350
X 350
X 400
07
(25
Nota:
MDA:
CGA:
MCGA:
VGA:
Figura 10-1
Captulo 10
Colores
16
16
16
16
de
de
de
64
262 , 144
262 , 144
16
16
16
16
de
de
de
64
262 , 144
262 , 144
Modos de texto 02 (mono) y 03 (color). Estos modos proporcionan el formato convencional de 80 columnas. Aunque diseados originalmente para el CGA, son compatibles con los
posteriores y tambin funcionan con los sistemas EGA y VGA.
Modo de texto 07 (mono). ste es el modo estndar monocromtico para MDA, EGA y
VGA y ofrece respetables resoluciones en pantalla.
Byte de atributo
Un byte de atributo en modo de texto (no en modo grfico) determina las caractersticas de cada
carcter mostrado. Cuando un programa establece un atributo, permanece activado; esto es, todos
los caracteres subsecuentes desplegados tienen el mismo atributo hasta que otra operacin lo
cambie. Puede utilizar las funciones de la INT 10H para generar un atributo de la pantalla y
realizar acciones como recorrer hacia arriba, recorrer hacia abajo, leer un atributo o un carcter o
desplegar un atributo o un carcter. Si utiliza DEBUG para ver el rea de despliegue de video de
su sistema, ver cada carcter de un byte, seguido de manera inmediata por su atributo de un byte.
El byte de atributo tiene el formato siguiente, de acuerdo con la posicin del bit:
Fondo
Atributo:
Nmero de
bit:
Frente
BL
Modo de texto
157
Las letras R,G y B indican las posiciones de bits para rojo, verde y azul, respectivamente.
Los bits RGB definen un color (en color y en monocromtico, 000 es negro y 111 es blanco). Por ejemplo un atributo con el valor 0000 0111 significa fondo negro con primer plano
blanco.
Despliegue monocromtico
Para un monitor monocromtico, el bit 0 establece el atributo de subrayado. Para especificar
atributos, puede establecer combinaciones de bits como se muestra a continuacin:
Frente
I R G B
Hex
0 0 0 0
0 0 0 0
00H
0 0 0 0
1 1 1
07H
Intermitencia
10
1 1 1
87H
Blanco
Intenso
0 0 0 0
1 1 1 1
Blanco
Negro
Video
0 0 0 0
70H
Blanco
Negro
Inverso,
1 1 1 1
0 0 0 0
F0H
0 0 0 0
0 0 0 1
01H
Fondo
Frente
Caracterstica
Negro
Negro
No
Negro
Blanco
Normal
Negro
Blanco
Negro
Fondo
BLRGB
despliega
inverso
intermitente
Subrayado
1 1 1
0FH
Despliegue a color
En muchos monitores a color, el fondo puede mostrar uno de ocho colores y los caracteres pueden
mostrar uno de 16 colores. La intermitencia e intensidad slo se aplican al primer plano. Tambin puede
seleccionar uno de 16 colores para el borde (marco). Los monitores de color no permiten subrayado; en lugar de eso, al establecer un bit en 0 selecciona el color azul como primer plano.
El byte de atributo es utilizado de la misma manera como se mostr con un monitor
monocromtico. Los tres colores bsicos son rojo, verde y azul. Puede combinarlos en el byte de
atributo para formar un total de ocho colores (incluyendo blanco y negro) y puede establecer alta
intensidad, para un total de 16 colores:
Color
I R G B
Color
I R GB
Negro
0 0 0 0
Gris
Azul
0 0 0 1
Azul
1 0 0 0
Verde
0 0 1 0
Verde
Cian
0 0 1 1
Cian
Rojo
0 1 0 0
Rojo
Magenta
0 1 0 1
Magenta
Caf
0 1 1 0
Amarillo
1 1 1 0
Blanco
0 1 1 1
Blanco
1 1 1 1
claro
l 0 0 1
l 0
10
claro
1 0
11
claro
1 10
1 10
claro
claro
brillante
158
Captulo 10
Si los colores del fondo y del primer plano son iguales, el carcter mostrado es invisible.
Tambin puede utilizar el byte de atributo para generar un carcter intermitente en el primer
plano. Aqu estn algunos atributos comunes:
Primer
Fondo
Primer plano
Fondo
plano
BL
G B
Hex
Negro
Negro
0 0
00
Negro
Azul
0 0
01
Azul
Roj o
0 1
1 0
14
Verde
Cian
1 0
1 1
23
Blanco
Magenta
1 1 0
7D
Verde
Gris
1 0
A8
claro
(intermitente)
1 0
1 1 1
1 0
Puede utilizar la INT 11H para determinar el tipo de monitor instalado. Despus, para monocromtico, use 07H para establecer el atributo normal (fondo negro, frente blanco); para color,
utilice cualquiera de las combinaciones de colores descritas. El color queda activo hasta que otra
operacin lo cambia. El modo de texto permite usar las pginas de pantalla 0-3, en donde la
pgina 0 es la pantalla normal.
Como ejemplo, la siguiente operacin INT 10H (explicada ms adelante) utiliza la funcin
09H para mostrar cinco asteriscos verde claro e intermitentes sobre fondo magenta:
MOV
AH,09H
/Solicita
MOV
AL,'*'
/Asterisco
MOV
BH,OOH
/Pgina
MOV
BL,0DAH
/Atributo
MOV
CX, 05
/Cinco
veces
INT
10H
/Llama
al
desplegar
nmero
de
color
BIOS
Puede utilizar DEBUG para revisar este ejemplo, as como para experimentar con otras
combinaciones de colores.
PGINAS DE PANTALLA
Los modos de texto le permiten almacenar datos en memoria de video en pginas. Los nmeros de
pgina son desde 0 hasta 3 para el modo normal de 80 columnas (y 0 hasta 7 para la raramente
utilizada pantalla de 40 columnas). En modo de 80 columnas, la pgina nmero 0 es por omisin
e inicia en el rea de despliegue de video en B800[0], la pgina 1 inicia en B900[0], la pgina 2 en
BA00[0] y la pgina 3 en BB00[0].
Puede formatear cualquiera de las pginas en memoria, aunque slo puede desplegar una
pgina a la vez. Cada carcter que se muestra en la pantalla necesita dos bytes de memoria: un byte
para el carcter y un segundo byte para su atributo. De esta forma una pgina completa de caracteres, para 80 columnas y 25 renglones, necesita 80 x 25 x 2 = 4,000 bytes. La cantidad de
memoria realmente asignada a cada pgina es 4K, o 4,096 bytes, as que despus de cada pgina
la siguen 96 bytes no utilizados.
159
AH, 01H
MOV
CH.00
MOV
CL, 14
INT
10H
; Llama al BIOS
cursor
Ahora el cursor parpadea como un rectngulo relleno. Puede ajustar su tamao a cualquiera entre
los lmites establecidos, por ejemplo, 04:08, 03:10, etc. El cursor conserva sus atributos hasta
que otra operacin los cambie. Usando 0:14 (VGA), 12:13 (monocromtico o EGA) o 6:7 (CGA)
se restablece el cursor normal. Si no est seguro de los lmites en su monitor, primero intente
ejecutar una funcin 03H con DEBUG.
INT 10H, funcin 02H: Establece la posicin del cursor
Esta til operacin coloca el cursor en cualquier parte de la pantalla, de acuerdo con las coordenadas rengln:columna. Establezca estos registros:
BH = Nmero de pgina, para modo de texto con 80 columnas, puede ser 0 (por omisin),
1,2 o 3.
DH = Rengln
DL = Columna
160
Captulo 10
La posicin del cursor en cada pgina es independiente de su posicin en las otras pginas. Ese
cdigo coloca al cursor en el rengln 5, columna 20, para la pgina 0:
MOV
AH,02H
;Peticin
MOV
B H , 00
;Pgina
MOV
D H , 05
,- R e n g l n
MOV
DL, 2 0
,- C o l u m n a
INT
10H
;Llama
para designar
el
cursor
nmero 0
al
BIOS
AH,03H
/Peticin
MOV
BH,00
/Nmero de p g i n a
INT
10H
/Llama
al
de
colocar
0
el
cursor
(normal)
i
1
BIOS
AX
CH
CL
DH
DL
y BX = Sin cambio
= Lnea de rastreo inicial del cursor
= Lnea de rastreo final del cursor
= Rengln
= Columna
\
\
j
El ejemplo siguiente utiliza la funcin 03H para leer el cursor y determinar su posicin y
tamao y despus usa la funcin 02H para avanzar el cursor a la columna siguiente en la pantalla:
MOV
AH.03H
MOV
BH, 0 0
INT
10H
MOV
AH,02H
INC
DL
INT
10H
Peticin
Pgina
Llama
Coloca
en
la
Llama
de
posicin
del
cursor
0
al
el
BIOS
cursor
columna
al
siguiente
BIOS
161
MOV
AH.05H
MOV
AL,#pg
;Nmero de pgina
INT
10H
/Llama al BIOS
AL
BH
CX
DX
=
=
=
=
El cdigo siguiente recorre toda la pantalla una lnea y establece un atributo de color:
MOV
AX,0601H
MOV
BH,3 0H
/Fondo en cian,
MOV
CX.OOOO
/Desde
MOV
DX,184FH
INT
10H
/Llama al BIOS
00,00
hasta 24,79
(pantalla completa)
AX,0605H
/Recorre
cinco
lneas
MOV
BH,S1H
/Fondo caf,
MOV
CX,0A1CH
162
MOV
DX,0E34H
hasta
INT
10H
;Llama
el
al
rengln
14,
columna
52
(parte
de
Captulo 10
pantalla)
BIOS
El ejemplo especifica un recorrido de cinco lneas, que es el mismo nmero que la distancia
entre los renglones 10 y 14. Ya que el atributo para una ventana permanece hasta que otra operacin lo cambie, al mismo tiempo puede establecer varias ventanas con diferentes atributos.
I N T 10H, funcin 07H: Recorrer hacia abajo la pantalla
Para modo de texto, el recorrido hacia abajo de la pantalla provoca que las lneas inferiores
desaparezcan por la parte inferior y aparezcan lneas en blanco en la parte superior. Cargue los
registros siguientes igual que para la funcin 06H (recorrido hacia arriba):
AL
BH
CX
DX
=
=
=
=
AH,08H
;Peticin
MOV
BH,00
/Nmero
INT
10H
,-Llama
de
al
de
leer
pgina
atributo
0
carcter
(normal)
BIOS
AL
BH
BL
CX
=
=
=
=
163
MOV
AH,09H
,-Peticin de despliegue
MOV
AL,'-'
MOV
BH, 0
;Pgina nmero 0
MOV
BL,61H
;Fondo caf,
MOV
CX, 80
;80
INT
10H
;Llama al BIOS
caracteres repetidos
AH,09H
/Peticin de despliegue
MOV
AL,03H
MOV
BH, 00
MOV
BL,0F0H
/Intermitencia y video
MOV
CX, 05
;Cinco veces
INT
10H
;Llama al BIOS
inverso
AH, OAH
/Peticin de
despliegue
MOV
AL,carcter
MOV
BH,#pgina
/Nmero de pgina
MOV
CX,repeticin
/Nmero de caracteres
INT
10H
/Llama al BIOS
repetidos
164
Capitulo 10
Con frecuencia, las funciones de la INT 21H del DOS que pueden imprimir cadenas de
caracteres y responder a los caracteres de control de la pantalla son ms adecuadas que las operaciones del BIOS.
INT 10H, funcin OEH: Escribir en teletipo
Esta operacin le permite utilizar un monitor como terminal para despliegue simple. Establezca la
funcin OEH en el AH, el carcter para desplegar en el AL, el nmero de pgina en el BH y el
color del primer plano (modo grfico) en el BL:
Los
avance de
operacin
siguiente,
MOV
AH, OEH
;Peticin
para
MOV
AL,carcter
;Carcter
que
MOV
BH,#pgina
.Nmero
MOV
BL,color
INT
10H
desplegar
se
despliega
de
pgina
activa
;Color
del
primer
plano
;Llama
al
(algunos
(modo
sistemas)
grfico)
BIOS
AH, OFH
; Peticin
de
INT
10H
;Llama
al
BIOS
CMP
A L , 03
,-Si
modo
JE
. . .
,- e n t o n c e s s a l t a r
el
modo
es
de
video
3,
BH
BL
CH
CL
=
=
=
=
165
La operacin permite usar varias funciones elaboradas para las computadoras del tipo PS/2,
tal como 30H (selecciona lneas de rastreo), 31H (carga la paleta por omisin) y 34H (emulacin
de un cursor).
I N T 10H, funcin 13H: Despliega u n a cadena de caracteres
Para monitores EGA y VGA, esta operacin despliega cadenas con opciones de establecer el
atributo y mover el cursor y acta sobre los caracteres de control de retroceso, campana, retorno
de carro y avance de lnea. Los registros ES:BP deben contener la direccin segmento: desplazamiento de la cadena que se despliega. El cdigo es como sigue:
MOV
AH,13H
;Peticin para
MOV
AL,subfuncin
; 0, 1, 2 o 3
MOV
BH,#pgina
MOV
BL,atributo
/Atributos de la pantalla
LEA
BP,direccin
MOV
CX,longitud
/Longitud de
MOV
DX,pantalla
/Posicin relativa de
INT
10H
/Llama al BIOS
desplegar
Nmero de pgina
la cadena de caracteres
inicio en la pantalla
en el AL son:
y la cadena; no avanza el cursor.
y la cadena; avanza el cursor.
y despus el atributo, no avanza el cursor.
y despus el atributo; avanza el cursor.
U S O D E L B I O S P A R A D E S P L E G A R E L C O N J U N T O D E C A R A C T E R E S ASCII
El programa de la figura 9-1 utiliz la DOS INT 21H para desplegar el conjunto de caracteres
ASCII, pero la operacin actu sobre los caracteres de control de retroceso, campana, retorno de
carro y avance de lnea, en lugar de desplegarlos. El programa corregido de la figura 10-2 ilustra
el uso de la INT 10H del BIOS con las funciones siguientes:
0FH Obtiene el modo actual de video y lo guarda.
00H Para este programa, establece el modo de video 03 y al salir restaura el modo original.
08H Lee el atributo en la posicin actual del cursor, para usarlo con la funcin 06H.
06H Recorre hacia arriba la pantalla para limpiarla usando el atributo para slo leer. Tambin crea una ventana de 16 lneas para los caracteres desplegados, con primer plano
caf y fondo azul.
02H Establece inicialmente el cursor, y lo avanza para cada carcter desplegado.
166
Captulo 10
OAH En la posicin actual del cursor, despliega cada carcter, incluyendo los caracteres de
control.
Los caracteres son desplegados en 16 columnas y 16 renglones. Este programa, al igual que
los otros en este libro, estn escritos prefiriendo la claridad en lugar de la eficiencia en el procesamiento. Puede corregir el programa para hacerlo ms eficiente, por ejemplo, usando los registros para el rengln, la columna y el generador de carcter ASCII. Tambin, como la INT 10H
slo destruye el contenido del registro AX, los valores en los otros registros no tienen que volver
a cargarse. Sin embargo, el programa no correra mucho ms rpido y perdera algo de claridad.
CARACTERES ASCII EXTENDIDOS
Entre los caracteres ASCII extendidos, 128-255 (80H-FFH) estn varios caracteres especiales
para despliegue de indicaciones, mens y logotipos. Por ejemplo, estos caracteres son usados para
dibujar un rectngulo con lneas continuas sencillas y dobles:
TITLE
BEGIN:
CTR
COL
ROW
MODE
MAIN
P 1 0 B I O A S (COM)
INT
.MODEL SMALL
.CODE
100H
ORG
JMP
SHORT MAIN
DB
00
DB
24
DB
04
DB
Procedimiento
10H
para
desplegar
el
conjunto
Contador de caracteres
Columna de la pantalla
Rengln de la pantalla
Modo de video
de
caracteres
ASCII
principal:
PROC
CALL
CALL
NEAR
B10MODE
C10CLR
CALL
CALL
CMP
JE
INC
ADD
CMP
JNE
INC
MOV
JMP
D10SET
E10DISP
CTR,OFFH
A3 0
CTR
COL,02
COL,56
A2 0
ROW
COL,24
A20
Coloca el cursor
Despliega
caracteres
Es e l l t i m o c a r c t e r d e s p l e g a d o ?
s, entonces salir
Incrementar el contador ASCII
Incrementar la columna
Se l l e g a la l t i m a c o l u m n a ?
no, entonces saltar
s,
incrementar el rengln
y r e i n i c i a r la c o l u m n a
CALL
CALL
MOV
INT
ENDP
Fl OREAD
G10MODE
AX,4C00H
21H
;Obtiene/designa el modo
,-Limpia l a p a n t a l l a
de
video
A20 :
A30 :
MAIN
Obtener
B10MODE
B10MODE
PROC
MOV
INT
MOV
MOV
MOV
INT
RET
ENDP
NEAR
AH, OFH
10H
MODE, AL
AH,OOH
A L , 03
10H
Figura 10-2
designar
el
;Peticin
;Guardar
modo
para
el
de
teclado
video
video
obtener
el
modo
modo
un
nuevo
modo
ASCII
167
Limpia
C10CLR
C10CLR
PROC
MOV
INT
MOV
MOV
MOV
MOV
INT
MOV
MOV
MOV
MOV
INT
RET
ENDP
NEAR
AH,08H
10H
BH, AH
AX,0600H
CX,0000
DX,184FH
10H
AX,0610H
BH,16H
CX,0418H
DX,1336H
10H
Coloca el
D10SET
D10SET
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
NEAR
AH,02H
BH, 00
DH,ROW
DL,COL
10H
cursor en el
rengln y columna:
cursor
Despliega caracteres A S C I I :
E10DISP
E10DISP
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
NEAR
AH, OAH
AL,CTR
BH, 00
CX, 01
10H
Despliega
carcter ASCII
Pgina 0
Un carcter
Obliga a detenerse,
Fl OREAD
Fl OREAD
PROC
MOV
INT
RET
ENDP
NEAR
AH,10H
16H
310MODE
PROC
MOV
MOV
INT
RET
ENDP
END
NEAR
AH,00H
AL,MODE
10H
BEGIN
Figura 10-2
(continuacin)
Carcter
ngulo de la esquina superior izquierda
ngulo de la esquina superior derecha
ngulo de la esquina inferior izquierda
ngulo de la esquina inferior derecha
Lnea continua horizontal
Lnea continua vertical
Lnea sencilla
Lnea doble
DAH
BFH
C0H
D9H
C4H
C9H
BBH
C8H
BCH
CDH
B3H
BAH
Procesamiento a v a n z a d o de la pantalla
168
Captulo 1 0
El cdigo siguiente utiliza la funcin 09H de la INT 10H para dibujar una lnea continua de
25 posiciones de longitud:
MOV
AH,09H
/Peticin
para
desplegar
MOV
AL,0C4H
,-Lnea
MOV
BH, 0 0
;Pgina
nmero
MOV
BL,OFH
,-Frente
negro,
fondo
MOV
CX, 2 5
;25
INT
10H
;Llama
continua
sencilla
blanco,
intenso
repeticiones
al
BIOS
DB
0DAH
17
DUP(0C4H),
OBFH
DB
0B3H
'
ADD
DB
0B3H
'
Delete
DB
0B3H
'
Enter
orders
0B3H
DB
0B3H
'
report
0B3H
DB
0B3H
'
Update
DB
0B3H
'
View
DB
0C0H
17
MOV
AH,40H
MOV
BX, 01
,-Manejador
de
MOV
CX,152
;Nmero
caracteres
LEA
DX,MEN
.- S o l i c i t u d
INT
21H
0B3H
records
0B3H
records
0B3H
accounts
0B3H
records
DUP(0C4H),
[Peticin
0D9H
para
desplegar
de
archivo
para
la
pantalla
En el captulo siguiente, la figura 11-1 despliega un men semejante en una caja con lneas
dobles. Los caracteres "con puntos" para crear sombras con frecuencia son utilizados a la derecha
o abajo de una caja:
Nmero
Carcter
BO
Bl
B2
DBH
169
Benjamn Franklin
Benjamn Frankln
[intermitente]
I
Columna 0
Columna 4 0
Para controlar la ubicacin del cursor, el programa define ROW para incrementar el rengln
en la pantalla y COL para avanzar el cursor cuando se despliega la peticin y el nombre. (La
funcin 09H de la INT 10H no avanza de manera automtica el cursor.) El programa despliega hacia abajo de la pantalla hasta que alcanza el rengln 20 y despus empieza a recorrerla una lnea
hacia arriba por cada peticin adicional.
Para entrada desde el teclado, el procedimiento D10INPT utiliza la funcin OAH de la INT 10H.
TITLE
page
60,132
P10NMSCR (EXE) Video inverso, intermitencia y recorrido de la
.MODEL
SMALL
.STACK
64
AME PAR
MAXNLEN
ACTNLEN
NAMEFLD
.DATA
LABEL
DB
DB
DB
COL
COUNT
PROMPT
ROW
DB
DB
DB
DB
BEGIN
BYTE
20
7
20 D U P ( '
')
;Lista de p a r m e t r o s :
longitud m x i m a del nombre
nmero de caracteres ingresado
; para el nombre
00
'ame? '
00
. CODE
PROC
MOV
MOV
MOV
MOV
CALL
FAR
AX,data
DS, AX
ES, AX
AX,0600H
Q10SCR
MOV
CALL
CALL
CALL
CMP
JNE
MOV
CALL
MOV
INT
COL,00
Q2 0CURS
B10PRMP
D10INPT
ACTNLEN,0 0
A3 0
AX,0600H
Q10SCR
AX,4C00H
21H
CALL
JMP
ENDP
E10NAME
A2 0LOOP
;Inicializa el registro
; de segmentos
/Limpia la p a n t a l l a
A2 0LOOP:
;Establece la columna a cero
,-Muestra una indicacin
/Proporciona entrada de nombre
No hay nombre? (indica el final)
A3 0 :
BEGIN
Figura 10-3
/Desplegar
nombre
Captulo 10
170
Despliega
B10PRMP
la
indicacin
PROC
LEA
MOV
NEAR
SI,PROMPT
COUNT,05
;Designa
MOV
CALL
INC
INC
CALL
DEC
JNZ
RET
ENDP
BL,71H
F10DISP
SI
COL
Q20CURS
COUNT
B20
Video
inverso
Rutina de despliegue
Carcter siguiente de nombre
Columna
siguiente
Coloca el cursor
Cuenta
descendente
R e p i t e el ciclo n v e c e s
la
direccin
de
la
indicacin
B20 :
B10PRMP
Acepta
D10INPT
D10INPT
PROC
MOV
LEA
INT
RET
ENDP
NEAR
AH,OAH
DX, AME PAR
21H
Despliega
;
E10NAME
PROC
LEA
MOV
entrada de
la
un
nombre
Peticin de entrada
desde el teclado
el nombre
en video
inverso y con
intermitencia:
NEAR
SI,NAMEFLD
COL,40
Inicializa el nombre
, D e s i g n a la c o l u m n a de p a n t a l l a
E20 :
CALL
MOV
CALL
INC
INC
DEC
JNZ
Q20CURS
BL,0F1H
F10DISP
SI
COL
ACTNLEN
E20
Coloca el cursor
Video inverso e intermitencia
Rutina de despliegue
Carcter siguiente en el nombre
Siguiente columna de la pantalla
Disminuye la cuenta de la longitud
R e p i t e el c i c l o n v e c e s
CMP
JAE
INC
RET
ROW,20
E30
ROW
Cerca
MOV
CALL
RET
ENDP
AX,0S01H
Q10SCR
no,
del
borde
incrementa
inferior
el
de
la
rengln
E30 :
E10NAME
recorre
la
pantalla
Despliegue
F10DISP
F10DISP
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
Q10SCR
,-BL ( a t r i b u t o ) s e d e s i g n a a n t e s
;Peticin de despliegue
,-Obtiene e l c a r c t e r d e n o m b r e
;Nmero de pgina
;Un c a r c t e r
Recorre
Q10SCR
NEAR
AH,09H
AL,[SI]
B H , 00
CX, 01
10H
PROC
MOV
MOV
MOV
INT
RET
ENDP
la
NEAR
BH,17H
CX,0000
DX,184FH
10H
Coloca
;AX s e d e s i g n a a n t e s
,-Blanco s o b r e a z u l
Pantalla
completa
el
Figura 10-3
(continuacin)
del
nomb
pantalla?
171
Q20CURS
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
END
Q20CURS
NEAR
AH,02H
BH, 00
DH,R0W
DL,COL
10H
Pgina
Rengln
Columna
BEGIN
Figura 10-3
(continuacin)
El despliegue muestra que estaba en la pantalla en el momento que tecle el comando, lo cual por
lo regular es un conjunto de bytes que contienen 20 07H (por carcter en blanco, fondo negro y
primer plano blanco). Observe que DEBUG y usted estn compitiendo por la misma rea de
despliegue y la pantalla. Trate de cambiar la pantalla con estos comandos para desplegar caritas
felices en los renglones superiores e inferiores:
E B800:000 01 25 02 36 03 47
E B800:F90 01 25 02 36 03 47
Procesamiento a v a n z a d o de la pantalla
172
TITLE
0000
0000
1000
VIDSEG
VI D A R A
VIDSEG
1 0 0 0 [?]
P 1 0 D R V I D (EXE)
Despliegue directo
.MODEL
SMALL
SEGMENT AT 0B90 0H
Pgina 1 del
DB
1000H DUP(?)
ENDS
en
Capitullo
video
rea
de
video
. S T A C K 64
0000
0000
0003
0005
0007
0009
00OA
000B
000D
OOOF
0011
0013
0015
0017
001A
001D
001F
0020
0022
0024
0025
0027
0029
002C
002E
002E
002E
0030
0032
0035
BEGIN
B8
8E
CO
B 4 OF
C D 10
50
53
B 4 00
B O 03
C D 10
B 4 05
B O 01
C D 10
E8 002E
E8 004D
B 4 05
5B
8A C 7
C D 10
58
B 4 00
C D 10
B8 4C00
CD 21
R
R
BEGIN
C10PROC
BO
B4
BF
B9
0 0 3 8 25
003D 47
003E 47
003F E2
0041 FE
0043 FE
0 0 4 5 83
0048 3C
0 0 4 A 75
004C C3
004D
004D
004D
004F
0051
0052
41
01
0294
003C
89
35
C3 0 :
C40 :
0000 R
F7
C4
CO
C7 2 3
51
E9
CIOPROC
E10INPT
B4
CD
C3
10
16
E10INPT
. CODE
PROC
MOV
MOV
ASSUME
MOV
INT
PUSH
PUSH
MOV
MOV
INT
MOV
MOV
INT
CALL
CALL
MOV
POP
MOV
INT
POP
MOV
INT
MOV
INT
ENDP
PROC
MOV
MOV
MOV
MOV
MOV
INC
INC
LOOP
INC
INC
ADD
CMP
JNE
RET
ENDP
PROC
MOV
INT
RET
ENDP
END
FAR
AX,VIDSEG
ES, AX
ES:VIDSEG
AH,OFH
10H
AX
BX
AH,OOH
A L , 03
10H;
AH,05H
AL,01H
10H
COPROC
E10INPT
AH,05H
BX
AL, BH
10H
AX
AH,OOH
10H
AX,4CO0H
21H
Direccionabilidad para
el rea de video
Peticin para obtener
y guardar
el modo actual
y la p g i n a
Peticin para designar
el m o d o 03, y l i m p i a r
la
pantalla
al
DOS
NEAR
Carcter que se despliega
AL,41H
Atributo
AH, 01H
Inicio del rea de despliegue
DI,660
Caracteres por rengln
CX, 60
WORD
PTR[VIDAREA+DI],AX
AX en el rea de despliegue
Siguientes posiciones
DI
de video
DI
C4 0
Repite 60 veces
Atributo
siguiente
AH
AL
Carcter
siguiente
DI, 40
Sangra para el rengln siguiente
AL,51H
ltimo carcter a desplegar?
C30
no, r e p e t i r
s, r e g r e s a r
NEAR
AH,10H
16H
/Peticin
para
BEGIN
Figura 10-4
entrada
Modo grfico
173
El programa establece la posicin inicial de una pgina en el rea de despliegue de video con
base en el hecho de que hay 80 x 2 = 160 columnas en un rengln. Entonces la posicin inicial
para el rengln 10, columna 10, es (160 x 10 renglones) + (10 columnas x 2) = 660. Despus
de desplegar un rengln, el programa avanza 40 posiciones en el rea de despliegue para el inicio de
la lnea siguiente y termina cuando llega a la letra Q (51H).
El segmento de despliegue de video para la pgina 1 est definido como VIDSEG y la
pgina como VID ARE A. El programa establece el registro ES como el registro del segmento para
VIDSEG. Al inicio, el programa guarda el modo y la pgina actuales y despus establece el modo
03 y la pgina 0 1 .
En el procedimiento C10PROC, el carcter y atributo iniciales son inicializados en el AX y
el desplazamiento inicial del rea de video en el DI. La instruccin MOV WORD PTR
[VIDREA + DI],AX mueve el contenido del AL (el carcter) al primer byte del rea de despliegue y el AH (el atributo) al segundo byte. La rutina LOOP ejecuta esta instruccin 60 veces y
despliega el carcter:atributo en toda la pantalla. Despus incrementa el carcter:atributo y aade
40 al DI: 20 para el final del rengln actual y 20 para sangrar el inicio del rengln siguiente (en
la pantalla, 10 columnas cada vez). Despus la rutina repite el despliegue del siguiente rengln de
caracteres.
Al terminar el despliegue, el procedimiento E10INPT espera a que el usuario presione una
tecla y despus el programa restaura el modo y pgina originales.
MODO GRFICO
Los adaptadores grficos tienen dos modos bsicos de operacin: texto (por omisin) y grfico.
Utilice la funcin 00H de la INT 10H del BIOS para establecer el modo grfico o de texto, como
lo muestran los dos ejemplos siguientes:
1. Establece el modo grfico para VGA:
MOV AH, O0H
MOV A L , 0 C H
/Grficos en color
INT
/Llama al BIOS
10H
MOV A L , 0 3 H
/Texto en color
INT
/Llama al BIOS
10H
El EGA y el VGA proporcionan una resolucin mucho mayor que el CGA original y son
compatibles con l en muchas formas. Las resoluciones y modos para adaptadores grficos estn
mostrados en la figura 10-5 y son como sigue:
Modos grficos 04H, 05H y 06H. La direccin del rea de despliegue de video para estos
modos es B800[0]. stos son los modos originales del CGA, que tambin son utilizados por
los EGA y VGA por su compatibilidad con posteriores, de manera que programas escritos
para el CGA pueden correr en un EGA o VGA.
174
Modo
04H
05H
06H
ODH
OEH
OFH
10H
11H
12H
13H
Tipo
Adaptador
Color
Mono
Mono
Color
Color
Mono
Color
Color
Color
Color
Figura 10-5
Colores
Resolucin
320
320
640
320
640
640
640
640
640
320
x
x
x
x
X
x
x
x
x
x
200
200
200
200
200
350
350
480
480
200
Captulo 10
16
16
16
2 de 2 6 2 , 1 4 4
16 de 262,144
256 de 262,144
Modos grficos ODH, OEH, OFH y 10H. La direccin del rea de despliegue de video para
estos modos es A000[0]. stos son los modos originales del EGA, que tambin son usados
por el VGA por su compatibilidad con posteriores, de manera que programas escritos para
el EGA por lo comn pueden correr en un VGA. Tambin estos modos permiten usar 8 , 4 ,
2 y 2 pginas, respectivamente, del rea de despliegue de video, por omisin con la pgina 0.
Modos grficos 11H, 12H y 13H. La direccin del rea de despliegue de video para estos
modos es A000[0]. Estos modos estn diseados especficamente para el VGA (y el ahora
raro MCGA) y no se pueden usar con otros adaptadores de video.
En modo grfico, la ROM contiene patrones de puntos slo para los 128 caracteres (inferiores). La INT 1FH proporciona acceso a un rea de memoria de 1K que define los 128 caracteres
superiores, ocho bytes por carcter.
Pixeles
El modo grfico utiliza pixeles (tambin llamados elementos grficos o pels) para generar patrones en color. Por ejemplo, el modo 04H para grficos en color estndar proporciona 200 renglones de 320 pixeles. Cada byte representa cuatro pixeles (esto es, dos bits por pixel), numerados de
0 a 3, como sigue:
ic.
pixel:
co
co
Cl
Cl
co
co
Cl
Color
Negro
Azul
Verde
Cian
Rojo
Magenta
Caf
0000
0001
0010
0011
0100
0101
0110
Gris
Azul claro
Verde claro
Cian claro
Rojo claro
Magenta claro
Amarillo
1000
1001
1010
1011
1100
1101
1110
Gris claro
0111
Blanco
1111
175
Y puede seleccionar los pixeles 0 1 , 10 y 11 para cualquiera de las tres paletas de colores:
Paleta 0
Paleta 1
1
0
fondo
verde
rojo
fondo
cian
magenta
caf
blanco
Cl
CO
0
1
1
Utilice la funcin OBH de la INT 10H para seleccionar una paleta de colores y el fondo. As,
si tiene que elegir fondo en color amarillo y la paleta 0, los colores disponibles son amarillo,
verde, rojo y caf. Un byte con el valor para pixeles 10101010 desplegara todo como rojo. Si
elige el fondo azul y la paleta 1, los colores disponibles son azul, cian, magenta y blanco. Un byte
con el valor para pixeles 00011011 desplegara azul, cian, magenta y blanco.
AH,00H
MOV
AL,12H
INT
10H
,-Llama al BIOS
P r o c e s a m i e n t o a v a n z a d o de la p a n t a l l a
176
Captulo 10J
I
Para modo grfico, utilice el BL para definir el color del primer plano. Si el bit 7 es cero, el color]
definido reemplaza los colores actuales presentes de pixeles; si el bit 7 es uno, el color definido es
combinado (se le aplica un XOR) con ellos. Para detalles, vea la seccin anterior, "Interrupcin)
10H del BIOS para el modo de texto".
j
j
'
Utilice esta funcin para establecer la paleta de colores y desplegar un carcter grfico. El nmero
en el BH (00 o 01) determina el propsito del registro BL:
j
1. BH = 00. Selecciona el color del fondo, en donde el BL contiene el nmero del color en los]
bits 0-3 (cualquiera de 16 colores):
\
i
MOV
AH, OBH
; Peticin
I
MOV
BH,0 0
fondo
MOV
BL,04
,- c o l o r r o j o
INT
10H
; Llama
al
BIOS
AH,OBH
MOV
BH,01
MOV
BL,00
INT
10H
Peticin
de
Selecciona
nmero
Llama
al
color
la
paleta
(verde,
rojo,
caf)
BIOS
Una vez que se selecciona una paleta, permanece activa. Pero cuando cambia la paleta, toda
la pantalla cambia a esa combinacin de colores. Si utiliza la funcin OBH mientras est en modo
de texto, el nmero establecido para el color 0 de la paleta determina el color del borde.
INT 10H, funcin OCH: Escribe un pixel punto
Utilice la funcin OCH para desplegar un color seleccionado (fondo y paleta). Establezca estos
registros:
AL
BH
CX
DX
=
=
=
=
El nmero mnimo para la columna o el rengln es 0 y el nmero mximo depende del modo de
video. El ejemplo siguiente establece un pixel en la columna 50, rengln 70 en la pantalla:
AH.OCH
177
/Peticin para escribir un punto
MOV AL, 03
MOV
BH,0
/Pgina nmero 0
MOV
CX,50
/Posicin horizontal
MOV
DX.70
/Posicin vertical
INT
10H
/Llama al BIOS
(columna)
(rengln)
178
Captulo 10
AH, 1AH
,-Peticin
MOV
AL, 0
INT
10H
;Llama
al
BIOS
CMP
AL, 1AH
;Si
AL
contiene
JE
VGAFOUND
de
la
subfuncin
el
el
sistema
funcin
VGA
1AH
contiene
regresar
un
VGA
AH,12H
;Peticin
de
la
MOV
BL, 10H
,-Cantidad
de
memoria
INT
10H
;Llama
BIOS
al
funcin
EGA
EGA
BEGIN
BEGIN
B10MODE
B10MODE
C10DISP
P10GRAFX (COM)
.MODEL SMALL
.CODE
ORG
100H
PROC
NEAR
MOV
AH, OFH
INT
10H
PUSH
AX
CALL
B10MODE
CALL
C10DISP
CALL
D10KEY
POP
AX
AH,00H
MOV
INT
10H
MOV
AX,4C00H
21H
INT
ENDP
PROC
MOV
MOV
INT
MOV
MOV
MOV
INT
RET
ENDP
NEAR
AH.OOH
AL,10H
10H
AH,OBH
BH, 00
BL,07H
10H
PROC
MOV
MOV
MOV
NEAR
BX, 00
CX, 64
DX, 70
MOV
MOV
INT
INC
CMP
JNE
MOV
INC
INC
CMP
JNE
RET
ENDP
AH,OCH
AL, BL
10H
CX
CX,576
C20
CX, 64
BL
DX
DX,280
C20
PROC
MOV
INT
RET
ENDP
END
NEAR
AH,10H
16H
179
Despliegue grfico
Conserva
modo de video
original
Designa el m o d o grfico
Despliegue grfico en color
Obtiene respuesta del teclado
Restaura
el modo original
(en AL)
Sale al DOS
fondo
C20:
C10DISP
D10KEY
D10KEY
BEGIN
Figura 10-6
CMP
BL,10H
JNE
EGAFOUND
Ya que un EGA puede estar instalado junto con un MDA o un CGA, puede necesitar
determinar si el EGA est activo. El rea de datos del BIOS en 40:0087 contiene un byte de
instruccin EGA. Verifique el bit 3, donde 0 significa que el EGA est activo y 1 significa que
est inactivo.
180
Capitulo 10
PUNTOS CLAVE
El byte de atributo para modo de texto proporciona intermitencia, video inverso e intensidad.
Para texto en color, los bits RGB permiten seleccionar colores pero no subrayado.
La INT 10H de BIOS proporciona funciones para el procesamiento completo de la pantalla,
como configurar el modo de video, establecer la posicin del cursor, recorrido de la pantalla, lectura desde el teclado y escritura de caracteres.
Si su programa despliega lneas en la parte inferior de la pantalla, utilice la funcin 06H de
la INT 10H del BIOS para recorrer hacia arriba la pantalla antes de que el despliegue alcance
la parte inferior.
Para los servicios de la INT 10H que despliegan un carcter, tiene que avanzar el cursor y
tal vez repetir el carcter en la pantalla.
La memoria de 16K para despliegue en color permite almacenar "pginas" o "pantallas"
adicionales. Existen cuatro pginas para pantallas de 80 columnas.
La manera ms rpida de desplegar caracteres en pantalla (texto o grficos) es transferirlos
de forma directa al rea de video apropiada.
Un pixel (elemento grfico) consiste en un nmero especificado de bits, dependiendo del
adaptador grfico y de la resolucin (baja, media o alta).
Para los modos grficos 04 y 05 puede seleccionar cuatro colores, de los cuales uno es
cualquiera de los 16 colores disponibles y los otros tres son de una paleta de colores.
PREGUNTAS
10-1. Proporcione los bytes de atributo, en binario, y para pantallas monocromticas, para lo siguiente: (a)
slo subrayado: (b) blanco y negro, con intensidad normal; (c) video inverso, con intensidad alta.
10-2. Proporcione los bytes de atributo, en binario, para lo siguiente: (a) magenta sobre cian claro; (b)
caf sobre amarillo; (c) rojo sobre gris, intermitente.
10-3. Codifique las rutinas siguientes: (a) Establezca el modo monocromtico de 80 columnas; (b) establezca
el tamao del cursor con inicio en la lnea cinco y lnea final 1 2 ; (c) recorra la pantalla hacia arriba
10 lneas; (d) despliegue 10 "puntos" intermitentes con medios puntos (hexadecimal Bl) encima.
10-4. En el modo de texto 0 3 , cuntos colores estn disponibles para el fondo y el primer plano?
10-5. Codifique las instrucciones para desplegar cinco caracteres de diamante en modo de texto con verde
claro sobre magenta.
10-6. Qu modo le permite el uso de pginas de pantalla?
10-7. Escriba un programa que utilice la funcin O A H de la I N T 2 1 H , para aceptar datos desde el teclado
y la funcin 0 9 H para desplegar los caracteres. El programa limpiar la pantalla, establecer los
colores (seleccinelos) y aceptar un conjunto de datos desde el teclado empezando en la posicin
actual del cursor. El conjunto de datos podra ser de cuatro o cinco lneas (digamos, de una longitud
de hasta 25 caracteres) ingresados desde el teclado, cada conjunto seguido de un Enter. Puede usar
diferentes colores, video inverso o sonido, para experimentar. Despus coloque el cursor en un
Preguntas
181
rengln y columna diferentes (usted decida) y despliegue los datos ingresados en esa posicin. El
programa sirve para aceptar cualquier nmero de conjuntos de datos. Puede terminar cuando el
usuario presione Enter sin datos. Escriba el programa con una pequea rutina con la lgica principal
y una serie de subrutinas llamadas. Incluya algunos comentarios concisos.
10-8. Corrija el programa de la pregunta 10-7, de manera que utilice la INT 16H para entrada desde el
teclado y la funcin 09H de la INT 10H para el despliegue.
10-9. Explique cmo el byte de atributo limita el nmero de colores disponibles.
10-10. Codifique las instrucciones para establecer el modo grfico para estas resoluciones: (a) 320 x 200;
(b) 640 x 200; (c) 640 x 480.
10-11. Codifique las instrucciones para seleccionar el fondo en azul en modo grfico.
10-12. Codifique las instrucciones para leer un punto del rengln 12, columna 13 en modo grfico.
10-13. Corrija el programa de la figura 10-6 de manera que proporcione lo siguiente: (a) un modo grfico
adecuado para su monitor; (b) fondo en color rojo; (c) rengln de inicio 10 y final en 30; (d)
columna inicial en 20 y final en 300.
10-14. Con base en los cambios hechos en la pregunta 10-13, corrija el programa para desplegar una
columna de puntos (en lugar de un rengln) a un tiempo. Esto es, despliegue puntos hacia abajo en
la pantalla, despus avance a la columna siguiente, y as sucesivamente.
CAPTULO 11
Procesamiento avanzado
del teclado
OBJETIVO
INTRODUCCIN
Este captulo describe las diferentes operaciones para manejo del teclado, algunas de las cuales
tienen usos especializados. De estas operaciones la funcin OAH de la INT 21H (estudiada en el
captulo 9), y la INT 16H (estudiada en este captulo) deben proporcionarle casi todas las operaciones con el teclado que usted necesitar.
Otros temas en el captulo incluyen los bytes de estado del shift del teclado, cdigos de
rastreo y el rea del bfer del teclado. Los bytes de estado del shift en el rea de datos del BIOS
permiten a un programa determinar, por ejemplo, si las teclas Ctrl, Shift o Alt han sido presionadas. El cdigo de rastreo es un nmero nico asignado a cada tecla en el teclado que permite al
sistema identificar el origen de una tecla presionada y permite a un programa verificar las teclas de
funcin extendidas, como Inicio, AvPg y Flechas. Y el rea del bfer del teclado ofrece espacie
en memoria para que usted teclee por adelantado antes de que un programa solicite en realidad um
entrada.
Las operaciones introducidas en este captulo son las siguientes:
F U N C I O N E S D E L A I N T 21H D E L D O S
01H
182
183
El teclado
06H
07H
08H
OAH
OBH
OCH
00H
Lee un carcter
01H
02H
05H
Escribe en el teclado
10H
11H
12H
EL TECLADO
El teclado proporciona tres tipos bsicos de teclas:
1. Las letras desde la A hasta la Z, los nmeros desde el 0 hasta el 9 y caracteres como %, $ y #.
2. Las teclas extendidas de funcin, que consisten en:
Teclas de funcin de programa ( F l , etc., S h i f t + F 1 , etc.).
Teclas del panel numrico con BloqNum apagado (Inicio, Fin, Flechas, Supr, Ins, RePg
y AvPg) y las teclas repetidas en el teclado de 101 teclas.
Alt + letras y Alt+teclas de funcin de programa.
3. Teclas de control para Alt, Ctrl y Shift, que funcionan en conjuncin con otras teclas. El
BIOS las trata de manera diferente de las otras teclas actualizando su estado actual en los
bytes de estado del shift en el rea de datos de BIOS. El BIOS no las enva como caracteres
ASCII a su programa.
La PC original con sus 83 teclas sufri la consecuencia de una decisin miope que provoc
que las teclas en el llamado panel (o teclado) numrico realizaran dos acciones. As, los nmeros
compartan teclas con Inicio, Fin, Flechas, Supr, Ins, RePg y AvPg, con la tecla BloqNum para
conmutar entre ellas. Para resolver este problema, los diseadores produjeron el teclado extendido con 101 teclas. De las 18 teclas nuevas, slo dos, FU y F12, proporcionan una funcin nueva;
el resto duplican la funcin de teclas en el teclado original. Si sus programas permiten presionar
F U , F12 o alguna de las nuevas combinaciones de teclas, los usuarios deben tener un teclado
ampliado y una computadora con un BIOS que pueda procesarlas. Para la mayora de las otras
operaciones con el teclado, sus programas no necesitan interesarse en el tipo de teclado instalado.
184
Captulo 11
Bit
Accin
Bit
Accin
7
6
5
Insercin activa
Estado de BloqMays activa
Estado de BloqNum activa
3
2
1
Alt presionada
Ctrl presionada
Shift izquierdo presionado
Puede utilizar la funcin 02H (estudiada ms adelante) de la INT 16H para examinar estos
valores. Note que "activa" significa que el usuario en ese momento est manteniendo oprimida la
tecla; al soltar la tecla pone en cero el valor del bit. El teclado de 83 teclas slo necesita este byte
de estado del shift.
El teclado ampliado de 101 teclas tiene teclas Ctrl y Alt duplicadas (izquierdas y derechas),
de modo que se necesita informacin adicional para examinarlas. El segundo byte de estado del
teclado necesario para el teclado de 101 teclas est en 40:18H, en donde un bit en uno indica lo
siguiente:
Bit
Accin
Bit
Accin
7
6
5
Ins presionada
BloqMays presionada
BloqNum presionada
3
2
1
Scroll
Lock presionada
Los bits 0, 1 y 2 estn asociados con el teclado ampliado (de 101 teclas). Ahora puede, por
ejemplo, examinar si est presionada Ctrl o Alt o ambas.
Otro byte de estado del teclado se encuentra en 40:96H. Aqu el elemento de inters para
nosotros es el bit 4; cuando est en uno, indica que est instalado un teclado de 101 teclas.
Ejercicio con el estado del shift
Para ver el efecto de las teclas Ctrl, Alt y Shift sobre los bytes de estado del shift, cargue DEBUG
para ejecucin. Introduzca D 40:17 para ver el contenido de los bytes de estado. Presione las
teclas BloqMays, BloqNum y ScrollLock y otra: vez introduzca D 40:17 para ver el resultado en
ambos bytes de estado. El byte 40:17H debe mostrar 70H (0111 0000B) y el byte en 40:18H es
quiz OOH. El byte en 40:96H debe mostrar la presencia (o ausencia) de un teclado de 101 teclas.
Intente cambiar el contenido del byte de estado en 40:17H introduciendo E 40:17 00. Si su
teclado tiene indicadores luminosos para las teclas de bloque, deben apagarse. Ahora intente
introduciendo E 40:17 70 para volverlas a encender.
Debe intentar con diferentes combinaciones, aunque es difcil teclear un comando vlido
DEBUG mientras mantiene oprimidas las teclas Ctrl y Alt. Introduzca Q para salir de DEBUG.
185
AH,01H
INT
21H
;Llama al DOS
CMP AL, 0 0
JNZ
teclado
funcin?
186
INT
21H
...
s,
para
entonces
el
repite
cdigo
de
la
Captulo 11
operacin
rastreo
AH,06H
/Peticin
directa
MOV
DL,OFFH
;Entrada
INT
21H
, L l a m a al D O S
JZ
KIO
,-Repetir
CMP
A L , 00
;Se
JNZ
K3 0
no,
entonces
es
INT
21H
s,
entonces
repite
del
si
el
la
consola
teclado
el
presion
para
bfer
una
cdigo
est
tecla
un
de
vaco
de
funcin?
carcter ASCII
la
operacin
rastreo
187
MOV
AH,OCH
MOV
AL,funcin
MOV
DX,KBAREA
INT
21H
Llama al DOS
La operacin limpia el bfer del teclado, ejecuta la funcin que est en AL, y acepta (o espera) un
carcter, de acuerdo a la peticin en AL. Podra utilizar esta operacin para un programa que no
permite que el usuario teclee por adelantado.
AL
Cdigo de rastreo
Carcter ASCII
Cdigo de rastreo
00H
Tecla presionada
El siguiente cdigo examina el AL contra 00H para determinar si el usuario ha presionado una
tecla de funcin extendida:
MOV
AH.00H
INT
16H
, Llama al BIOS
CMP
AL,00H
JE
G4 0
; si
Como la operacin no repite el carcter en la pantalla, tiene que emitir una interrupcin de
despliegue en pantalla para ese propsito.
188
Captulo 11
AH,02H
INT
1SH
OR
AL,00000011B
JE
xxxx
Peticin
de
Llama
BIOS
Se
al
estado
presion
el
del
shift
shift
izq.
der?
-s
Vase la funcin 11H para manejo del estado del shift en la localidad 418H para funciones
extendidas en el teclado ampliado.
Funcin 05H de la INT 16H: Escritura en el teclado
Esta operacin permite que su programa inserte caracteres en el bfer del teclado como si el
usuario hubiera presionado alguna tecla. Cargue el carcter ASCII al CH y su cdigo de rastreo al
CL. La operacin le permitir ingresar caracteres en el bfer hasta que est lleno.
Funcin 10H de la INT 16H: Lectura de un carcter del teclado
La operacin es la misma que la de la funcin OOH, salvo que tambin acepta las teclas adicionales
de funcin extendidas (como Fl 1 y F12) desde el teclado ampliado, mientras que la funcin OOH
no lo permite.
La operacin verifica el bfer del teclado para un carcter ingresado. Si ninguno est presente, la operacin espera a que el usuario presione una tecla. Si un carcter est presente, la
operacin lo regresa en el AL y su cdigo de rastreo en el AH. Si la tecla presionada es una tecla
de funcin extendida, como Inicio o F l , el carcter en el AL es OOH. En el teclado ampliado, Fl 1
y F12 tambin regresan OOH en el AL, pero otras teclas de control (duplicados), como Inicio y
RePg, regresan EOH. Aqu estn las dos posibilidades:
Tecla presionada
AH
AL
Cdigo de rastreo
Carcter ASCII
Cdigo de rastreo
OOH o EOH
189
Puede examinar el AL contra 00H o EOH para determinar si el usuario ha presionado una tecla de
funcin extendida:
MOV
AH,10H
INT
16H
; Llama al BIOS
CMP
AL,00H
JE
G4
; -s
CMP
AL,OEOH
JE
G40
; -s
Ya que la operacin no repite el carcter en la pantalla, debe emitir una interrupcin de despliegue
en pantalla para ese propsito.
Funcin 11H de la INT 16H: Determina si
est presente un carcter
Esta operacin es la misma que la funcin 01H, excepto que reconoce las funciones extendidas del
teclado ampliado, mientras que 01H no lo hace.
Funcin 12H de la INT 16H: Regresa el estado
presente del shift del teclado
Esta operacin es semejante a la funcin 02H, que regresa al AL el estado del shift del teclado
desde el rea de datos del BIOS en la localidad 417H (40:17H). La operacin tambin enva el
estado del shift extendido a AL:
Bit
Accin
Bit
Accin
7
6
5
SysReq presionada
BloqMays presionada
BloqNum presionada
3
2
1
ScrollLock presionada
190
Captulo 1 1
de dos formas, dependiendo de si presiona una tecla de carcter o una tecla de funcin extendida.
Para un carcter, como la letra A, la operacin enva estos dos elementos:
1. En el registro AL, el carcter ASCII de la A (41H).
2. En el registro AH, el cdigo de rastreo para la letra A, 1EH.
AH
AL
IE
41
El teclado tiene dos teclas para caracteres tales como -, + y *. Por ejemplo, presionando la
tecla del asterisco se establece el cdigo del carcter en 2AH en el AL y uno de dos cdigos de
rastreo en el AH, dependiendo de qu tecla fue presionada: 09H para el asterisco que est arriba
del nmero 8, o 29H para el asterisco del panel numrico.
El cdigo siguiente prueba el cdigo de rastreo para determinar qu asterisco fue presionado:
CMP
AL,2AH
;Es
JNE
EXIT1
,- n o , e n t o n c e s s a l i r
CMP
AH,09H
JE
un
Cul
asterisco?
es
el
cdigo
de
rastreo?
EXIT2
Si presiona una tecla de funcin extendida, como Ins, la operacin enva estos dos elementos:
1. En el registro AL: Cero, o EOH para una nueva tecla de control en teclado ampliado.
2. En el registro AH: El cdigo de rastreo para Ins, 52H.
AH
AL
52
00
Por tanto, luego de una operacin INT 16H (y algunas operaciones de la INT 21H), se puede
examinar el AL. Si contiene OOH o EOH, la peticin es para una funcin extendida; de otra
manera, la operacin ha enviado un carcter. Lo siguiente prueba una tecla de funcin extendida:
MOV
AH, 10H
,-Peticin
para
INT
16H
:Llama
BIOS
CMP
AL,OOH
;Es
JZ
salir
CMP
AL.0E0H
;Es
JZ
salir
s,
s,
al
una
funcin
entonces
una
entrar
el
teclado
extendida?
salir
funcin
entonces
desde
extendida?
salir
191
Seleccin de un men
MOV
AH,10H
;Peticin de entrada
INT
1SH
, Llama al BIOS
CMP
AL,00H
; Es una
JE
G3 0
; s
CMP
AL,EOOH
; Es una
JNE
G90
; no
CMP
AH,47H
; Es el cdigo de rastreo de
JNE
G90
; no
MOV
AH,02H
;Peticin
MOV
BH, 0 0
MOV
DX, 0 0
; en 0, 0
INT
10H
;Llama al BIOS
funcin extendida?
entonces
pasarlo
funcin extendida?
entonces
entonces
salir
salir
Las teclas de funcin programable F1-F10 generan cdigos de rastreo 3BH-44H, respectivamente, y FU y F12 generan 85H y 86H. El cdigo siguiente prueba la tecla de funcin
programable FIO:
CMP
AH,44H
JE
EXIT1
; s,
entonces salir
JMP 10 0
Utilice el comando P (Proceder) para ejecutar la operacin INT. Teclee varios caracteres y compare los resultados en el AX con el listado del apndice F.
SELECCIN DE UN MEN
El programa parcial de la figura 11-1 ilustra el despliegue de un men y permite al usuario
presionar las teclas direccionales (hacia arriba y hacia abajo) para seleccionar un elemento de l.
El men est definido en el segmento de datos dentro de una caja con dobles lneas (como se
explic en el captulo 10). Los procedimientos y las acciones que realizan son los siguientes:
192
TITLE
page
60,132
P 1 1 S E L M U (EXE)
.MODEL
.STACK
TOPROW
BOTROW
LEFCOL
COL
ROW
COUNT
LINES
ATTRIB
NINTEEN
MEN
.DATA
EQU
EQU
EQU
DB
DB
DB
DB
DB
DB
DB
DB
una
opcin
del
men
SMALL
64
00
07
16
00
00
?
7
DB
DB
DB
DB
DB
DB
DB
OS,
'To s e l e c t a n i t e m , u s e u p / d o w n
' and press Enter.
13, 10, 09, 'Press Esc to e x i t . '
.CODE
PROC
MOV
MOV
MOV
CALL
MOV
MOV
CALL
MOV
MOV
MOV
LEA
INT
FAR
AX,@data
DS,AX
ES,AX
Q10CLR
ROW,BOTROW+2
COL,00
Q20CURS
AH,40H
BX, 01
CX, 75
DX,PROMPT
21H
DB
BEGIN
de
1
0C9H,
0BAH,
0BAH,
0BAH,
0BAH,
0BAH,
0BAH,
0C8H,
DB
PROMPT
Seleccin
Captulo 11
arrow'
;Iniciar registros
de segmento
Despejar
pantalla
Fijar cursor
Peticin de exhibicin
Manejo de p a n t a l l a
Nmero de caracteres
;Indicacin
A10LOOP:
CALL
MOV
CALL
MOV
MOV
CALL
CALL
BEGIN
CMP
JE
MOV
CALL
MOV
INT
ENDP
Mostrar
B10MENU
PROC
MOV
MOV
/Exhibicin
B10MENU
COL,LEFCOL+l
Q20CURS
ROW,TOPROW+l
ATTRIB,16H
H10DISP
D10INPT
AL, ODH
Al0LOOP
AX,0600H
Q10CLR
AX,4C00H
21H
todo
NEAR
ROW, TOPROW
LINES,08
Figura 11-1
Fijar
de
men
cursor
el
men:
,-Fijar h i l e r a s u p e r i o r
/Nmero de lneas
de
men
Seleccin de un men
LEA
MOV
SI,MEN
ATTRIB,71H
MOV
MOV
COL,LEFCOL
COUNT,19
CALL
MOV
MOV
MOV
MOV
MOV
INT
INC
INC
DEC
JNZ
INC
DEC
JNZ
RET
ENDP
Q20CURS
AH,09H
AL, [SI]
BH, 00
BL,71H
CX, 01
10H
COL
SI
COUNT
B30
ROW
LINES
B20
Azul
sobre blanco
B20 :
Fijar columna
B30 :
B10MENU
D20 :
D30 :
D40 :
D90:
DIOINPT
Se imprimieron todas
;Si es as, regresar
PROC
MOV
INT
CMP
JE
CMP
JE
CMP
JE
CMP
JE
JMP
MOV
CALL
INC
CMP
JBE
MOV
JMP
MOV
CALL
DEC
CMP
JAE
MOV
CALL
MOV
CALL
JMP
RET
ENDP
NEAR
AH.10H
16H
AH,50H
D2 0
AH,48H
D3 0
AL,ODH
D90
AL,1BH
D90
DIOINPT
ATTRIB, 71H
HIODISP
ROW
ROW,BOTROW-l
D4 0
ROW,TOPROW+l
D4 0
ATTRIB,71H
HIODISP
ROW
ROW,TOPROW+l
D4 0
ROW,BOTROW-l
Q2 0CURS
ATTRIB,16H
HIODISP
DIOINPT
PROC
MOV
MOV
MUL
LEA
ADD
MOV
NEAR
AH, 00
AL,ROW
NINTEEN
SI,MENU+1
SI,AX
COUNT, 17
las lneas?
Peticin de entrada
del teclado
Flecha hacia abajo?
Flecha hacia arriba?
Tecla
Enter?
Tecla
escape?
Ninguna, p r o c e s a r de nuevo
Azul sobre blanco
Fijar la lnea anterior a video normal
Se pas la hilera interior?
no, muy bien
s, restablecer
;Video normal
Fijar lnea anterior a video normal
<;
HIODISP
Siguiente columna
Fijar siguiente carcter
ltimo carcter?
No, repetir
Siguiente hilera
Aceptar entrada a p e d i d o
DIOINPT
194
Captulo 1
H20:
H10DISP
CALL
MOV
MOV
MOV
MOV
MOV
INT
INC
INC
DEC
JNZ
MOV
CALL
RET
ENDP
Q2 0CURS
AH,09H
A L , [SI]
B H , 00
BL,ATTRIB
CX, 01
10H
COL
SI
COUNT
H20
COL,LEFCOL+l
Q20CTJRS
Despejar
Q10CLR
Q10CLR
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
Q2 0CURS
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
END
;Siguiente columna
;Fijar para el siguiente carcter
;ltimo carcter?
;No, r e p e t i r
/ R e s t a b l e c e r c o l u m n a a la i z q u i e r d a
;Fijar cursor
pa
NEAR
AX,0600H
BH,61H
CX,0000
DX,184FH
10H
Fijar
Q20CURS
,-Fijar c u r s o r e n s e g m e n t o c o l u m n a
;Peticin de exhibicin
/Obtener carcter del men
;Pgina 0
;Nuevo atributo
;Un c a r c t e r
;Azul
sobre
;Llamar
cursor
caf
BIOS
hilera:columna
NEAR
AH,02H
B H , 00
DH,ROW
DL,COL
10H
Pgina 0
Hilera
Columna
BEGIN
Figura 11-1
(continuacin)
BEGIN llama a Q10CLR para limpiar la pantalla, llama a B10MENU para desplegar lo:
elementos del men y establecer el primer elemento en video inverso y llama a D10INP1
para aceptar entradas del teclado.
B10MENU muestra el conjunto completo de selecciones del men.
D10INPT utiliza la INT 16H para entrada: La flecha hacia abajo para bajar por el men, 1;
flecha hacia arriba para subir por el men. Enter para aceptar un elemento del men y Esi
para salir. Las dems entradas del teclado son ignoradas. La rutina da vuelta alrededor de
cursor, de manera que tratar de mover el cursor por arriba de la primera lnea del men k
coloca en la ltima lnea y viceversa. La rutina tambin llama a H10DISP para restaurar 1
lnea anterior del men a video normal y la nueva lnea del men (seleccionada) a vide(
inverso.
H10DISP muestra la lnea actualmente seleccionada de acuerdo con un atributo (normal c
en video inverso) que haya sido proporcionado.
Q10CLR limpia toda la pantalla y la establece en primer plano azul y fondo caf.
El programa ilustra la seleccin de men en una forma sencilla; un programa complete
ejecutara una rutina para cada elemento seleccionado. Entender mejor este programa tecleando
lo y verificndolo.
195
AL.60H
La rutina de BIOS lee el cdigo de rastreo y lo compara con entradas en una tabla de cdigos de
rastreo para el carcter ASCII asociado (si existe). La rutina combina el cdigo de rastreo con su
carcter ASCII asociado y enva los dos bytes al bfer del teclado. La figura 11-2 ilustra este
procedimiento.
Observe que la INT 09H maneja los bytes de estado del teclado en 40:17H, 40:18H y
40:96H para Shift, Alt y Ctrl, respectivamente. Sin embargo, aunque la presin de estas teclas
genera la INT 09H, la rutina de interrupcin establece los bits apropiados en los bytes de estado,
pero no enva ningn carcter al bfer del teclado. Tambin, la INT 09H ignora combinaciones de
tecleo no definidas.
Cuando se presiona una tecla, el procesador del teclado de manera automtica genera un
cdigo de rastreo y la INT 09H. Cuando se suelta o libera la tecla en un perodo de medio
segundo, genera un segundo cdigo de rastreo [el valor del primer cdigo sumado a 128 (1000
0000B), lo que pone en uno el bit de la extrema izquierda] y emite otra INT 09H. El segundo
cdigo de rastreo indica a la rutina de interrupcin que ha liberado la tecla. Si mantiene oprimida
la tecla por ms de medio segundo, el proceso de teclado se convierte en tecleo automtico, y
repite de manera automtica la operacin de la tecla.
El bfer del teclado
El bfer del teclado necesita una direccin para indicar a la INT 09H en dnde insertar el siguiente
carcter y otra direccin para indicar a la INT 16H de dnde extraer el carcter siguiente. Las dos
direcciones tienen desplazamientos dentro del segmento 40[0]H. Lo siguiente describe el contenido del bfer:
DIRECCIN
EXPLICACIN
41AH
Direccin del inicio actual del bfer, la posicin siguiente para la INT 16H
para leer.
Direccin del final actual del bfer, la posicin siguiente para la INT 09H
para almacenar un carcter ingresado.
Direccin del inicio del bfer del teclado: 16 palabras (32 bytes), aunque
puede ser ms largo. El bfer retiene los caracteres del teclado y los cdigos de rastreo como son introducidos para lectura posterior por medio de la
INT 16H. Se necesitan dos bytes para cada carcter y su cdigo de rastreo
asociado:
41CH
41EH
Direccin de la
parte inicial
Direccin de la
parte final
Direccin
del bfer
41A
41C
41E ...
196
Rutina
INT 09H
de BIOS
Cdigo
de rastreo
Teclado
Captulo 1 1
XX XX
r
1
I
Rutina
[_
W
INT21H
|
| del DOS |
L
J
I
Rutina
INT16H
del BIOS
Cdigo I
de rastreo!
Registro AX
El programa solicita la INT 16H ya sea directamente o por medio de la iNT 21H
Figura 11-2
Cuando se teclea un carcter, la INT 09H avanza la parte final. Cuando la INT 16H lee un
carcter, avanza la parte inicial. De esta manera, el proceso es circular, con la parte inicial
siguiendo de manera continua a la parte final.
Cuando el bfer est vaco, la parte inicial y la parte final estn en la misma direccin. En
el ejemplo siguiente, un usuario tecle 'abcd < Enter > '. La INT 09H ha almacenado los caracteres
en el bfer y ha avanzado la parte final a 428H. (Por simplicidad, el ejemplo no muestra los cdigos
de rastreo asociados.) El programa ha emitido la INT 16H cinco veces para leer todos los caracteres y ha avanzado la parte final a 428H, de manera que el bfer est vaco ahora:
.
I
41E
I
420
I
422
I
424
<0DH>
. . .
I
426
I
428
Cuando el bfer est lleno, la parte final est inmediatamente atrs de la parte inicial. Para
verlo suponga que ahora teclea 'fghijklmnopqrs'. Entonces la INT 09H almacena los caracteres
empezando en la parte final en 428H y dando vuelta para almacenar la ' s ' en 424H, inmediatamente antes de la parte inicial en 426H.
p
I
41E
s <0DH>
426
f
I
j
I
m
I
I I I
438 43A 43C
En este punto, la INT 09H no acepta ningn carcter ms que se teclee por adelantado, y
aunque el bfer tiene 16, acepta slo 15 a lo ms. (Puede decir por qu?) Si la INT 09H captara
197
otro carcter, avanzara la parte final a la misma direccin de la parte inicial y la INT 16H
supondra que el bfer est vaco.
Las teclas Ctrl, Shift y Alt
La INT 09H tambin maneja el byte de estado del shift en 40:17H en el rea de datos del BIOS
[Shift derecho (bit 0), shift izquierdo (bit 1), Ctrl (bit 2) y Alt (bit 3)], as como 40:18 y 40:96
para el teclado ampliado. Cuando presiona una de estas teclas, la rutina del BIOS pone en uno el
bit apropiado, y cuando libera la tecla pone en cero el bit.
Su programa puede examinar si alguna de las teclas anteriores estn presionadas ya sea por
medio de la INT 16H (funcin 02H) o por referencia directa a la byte de estado. El siguiente
programa parcial .COM ilustra el uso directo de la referencia directa al byte de estado:
BIODATA
SEGMENT AT 4OH
ORG
17H
KBSTATE
DB ?
BIODATA
ENDS
CODESG
SEGMENT
PARA
ASSUME
CS:CODESG,
ORG
10OH
MOV
AX,BIODATA
MOV
DS, AX
MOV
AL,KBSTATE
TEST
AL,00000011B
JNZ
XXX
el byte de estado
DS:BIODATA
BEGIN:
Inicializa la direccin de
BIODATA en DS
s, entonces - saltar
El programa utiliza la caracterstica SEGMENT AT para definir el rea de datos del BIOS
como, en realidad, un segmento ficticio. KBSTATE identifica la posicin del byte de estado del
teclado en 40:17H. El segmento de cdigo inicializa la direccin de BIODATA en el DS y
almacena el byte de estado del teclado en el AL. Una operacin OR prueba si alguna de las teclas
shift fue presionada.
Puede modificar este cdigo para examinar tambin los bytes de estado de teclado ampliado
en 40:18H y 40:96H.
198
Captulo 11
de los 256 caracteres ASCII no estn representados en l. Sin embargo puede introducir cualquiera de los cdigos desde 01 hasta 255 manteniendo oprimida la tecla Alt e ingresando el cdigo
apropiado como un valor decimal por medio del panel numrico. El sistema almacena los valores
que ingres como dos bytes en el bfer del teclado: el primero es el carcter ASCII generado y el
segundo, es cero. Por ejemplo, Alt+001 enva 01H, y Alt+255 enva FFH. Puede utilizar DEBUG
para examinar el efecto de introducir diferentes nmeros:
100
MOV
AH.10
102
INT
16
104
JMP
100
PUNTOS CLAVE
Los bytes de estado del shift en el rea de datos del BIOS indican el estado actual de Ctrl,
Alt, Shift, BloqMays, BloqNum y ScrollLock.
Las operaciones de la INT 21H del DOS proporcionan diferentes servicios con o sin repeticin
en la pantalla, para reconocer o ignorar Ctrl+Break y para aceptar cdigos de rastreo.
La INT 16H del BIOS proporciona la operacin bsica del BIOS para el teclado para aceptar
caracteres desde el bfer del teclado. Para una tecla de carcter, la operacin enva el
carcter al AL y el cdigo de rastreo de la tecla al AH. Para una tecla de funcin extendida,
la operacin enva cero al AL y el cdigo de rastreo al AH.
El cdigo de rastreo es un nmero nico asignado a cada tecla, que le permite al sistema
identificar el origen de una tecla presionada y permite a un programa verificar las teclas de
funcin extendidas tales como Inicio, AvPg y las flechas.
El rea de datos del BIOS en 40:1EH contiene el bfer del teclado. Esta rea le permite
teclear hasta 15 caracteres antes que el programa solicite una entrada.
Cuando presiona una tecla, el procesador del teclado genera el cdigo de rastreo de la tecla
(su nico nmero asignado) y solicita la INT 09H. Cuando suelta la tecla genera un segundo
cdigo de rastreo (el primero ms 128: pone en uno el bit de la extrema izquierda) para
indicarle a la INT 09H que la tecla ha sido soltada.
La INT 09H del BIOS obtiene un cdigo de rastreo del teclado, y o bien genera un carcter
ASCII asociado y enva el cdigo de rastreo al rea del bfer del teclado, o establece el
estado de Ctrl, Alt, Shift.
, h >$.'
PREGUNTAS
11-1. (a) Cul es la localidad en el rea de datos del BIOS, del primer byte del estado del shift del teclado':
(b) Qu significa el contenido 00001100? (c) Qu significa el contenido 00000010?
11-2. Explique las caractersticas de las funciones siguientes para entrada desde el teclado con la INT 21H
(a) 01H; (b) 07H; (c) 08H; (d) OAH.
11-3. Explique las diferencias entre las funciones OOH, 01H y 10H de la INT 16H.
Preguntas
199
11-4. Proporcione los cdigos de rastreo para las funciones extendidas siguientes: (a) Flecha hacia arriba;
(b) tecla de funcin programable; (c) inicio (Home); (d) RePg (PgUp).
11-5. Utilice DEBUG para examinar los efectos de los tecleos introducidos. Para solicitar entrada de una
instruccin en lenguaje ensamblador, teclee A 100 e introduzca las instrucciones siguientes:
MOV
AH, 00
INT
16
JMP
100
(o AH, 10)
Utilice U 100,104 para desensamblar el programa, y utilice el comando P para hacer que DEBUG
ejecute toda la interrupcin. La ejecucin se detiene en espera de su entrada. Presione cualquier tecla
para examinar los registros AH y AL. Contine introduciendo diferentes teclas. Presione Q para salir
de DEBUG.
11-6. Codifique las instrucciones para introducir un solo tecleo; si la tecla es AvPg(PgDn), coloque el
cursor en el rengln 24, columna 0.
11-7. Corrija el programa de la figura 11-1 para proporcionar las caractersticas siguientes: (a) Despus del
borrado inicial de la pantalla, mostrar una peticin que pida al usuario presionar Fl para un men de
pantalla, (b) Cuando se presione F l , desplegar el men, (c) Tambin permitir a los usuarios seleccionar
elementos del men presionando el primer carcter (mayscula o minscula) de cada elemento, (d) A
solicitud de un elemento, mostrar un mensaje para esa seleccin en particular, como "Procedimiento
para eliminar registros", (e) Permitir a los usuarios presionar la tecla Esc para regresar al men
principal de la rutina seleccionada.
11-8. Bajo qu circunstancias ocurre una INT 09H?
11-9. Explique en trminos sencillos cmo la INT 09H maneja las teclas Ctrl y Shift de manera diferente a
la forma de manejar las teclas del teclado estndar.
11-10. (a) En dnde est la posicin en memoria del BIOS del bfer del teclado? (b) En bytes, cul es el
tamao del bfer? (c) Cuntos caracteres de teclado puede tener?
11-11. Qu significa que la direccin de la cabeza y de la cola en el bfer del teclado sean iguales? (b) Qu
significa que la direccin de la cola siga de manera inmediata de la cabeza?
CAPTULO 12
INTRODUCCIN
En este punto, las instrucciones presentadas han manejado datos definidos como un solo byte, palabra o palabra doble. Sin embargo, a veces es necesario mover o comparar campos de datos que
excedan estas longitudes. Por ejemplo, puede querer comparar las descripciones o nombres a fin
de clasificarlas en orden ascendente. Los elementos en este formato son conocidos como datos de
cadena de caracteres (o slo datos de cadena) y puede ser de carcter o numrico. Para procesar
una cadena de caracteres, el lenguaje ensamblador proporciona cinco instrucciones para cadenas:
MOVS
LODS
STOS
CMPS
SCAS
200
Mueve un byte, palabra o palabra doble desde una localidad en memoria a otra.
Carga desde memoria un byte en el AL, una palabra en el AX o una palabra doble
en el EAX.
Almacena el contenido de los registros AL, AX o EAX en memoria.
Compara localidades de memoria de un byte, palabra o palabra doble.
Compara el contenido de AL, AX o EAX con el contenido de una localidad de
memoria.
201
Una instruccin asociada, el prefijo REP, provoca que una instruccin para cadena se realice
de manera repetitiva un nmero especfico de veces.
Operandos
Operacin
Operacin
Operacin
Operacin
bsica
implicados
con bytes
con palabra
Mover
MOVS
ES:DI,DS:SI
MOVSB
MOVSW
MOVSD
Cargar
LODS
AX,DS:SI
LODSB
LODSW
LODSD
Almacenar
STOS
ES:DI,AX
STOSB
STOSW
STOSD
Comparar
CMPS
DS:SI,ES:DI
CMPSB
CMPSW
CMPSD
Rastrear
SCAS
ES:DI,AX
SCASB
SCASW
SCASD
AX,@data
MOV
DS,AX
;Lo almacena en DS
MOV
ES,AX
; y en ES
202
Captulo 12
DB
2 0 DUP( * )
STRING2
DB
20
DUP('
')
CLD
MOV
CX,20
;Inicializa para
LEA
DI,STRING2
,-Inicializa
LEA
SI,STRINGl
REP
MOVSB
;Copia STRINGl en S T R I N G 2
el
20
bytes
nombre
receptor
Durante la ejecucin, las instrucciones CMPS y SCAS tambin establecen las banderas de
estado, de modo que la operacin puede terminar de manera inmediata al encontrar una condicin especificada. Las variaciones de REP para este propsito son las siguientes:
REP
REPE o REPZ Repite la operacin mientras la bandera de cero (ZF) indique igual o cero.
Se detiene cuando la ZF indica diferente o cero o cuando CX llega a cero.
REPNE o REPNZ Repite la operacin mientras la ZF indica diferente o cero. Se detiene
cuando la ZF indica igual o cero o cuando CX llega a cero.
Para el 80286 y procesadores ms avanzados, el uso de las operaciones con palabra o palabra
doble puede proporcionar un procesamiento ms rpido. Ahora examinaremos en detalle las operaciones de cadena.
REP MOVSn
[ES:DI,DS:SI]
Para la cadena receptora, los registros segmento:desplazamiento son ES:DI; para la cadena
emisora los registros segmento desplazamiento son DS:SI. Como resultado, al inicio de un programa . EXE inicialice el registro ES junto con el registro DS y, antes de ejecutar el MOVS, utilice LEA
para inicializar los registros DI y SI. Dependiendo de la bandera de direccin, MOVS incrementa o
disminuye los registros DI y SI en 1 para un byte, en 2 para una palabra y en 4 para una palabra
doble. El cdigo siguiente es ilustrativo:
203
CX,nmero
;Nmero de byte/palabras
LEA
DI,STRING2
;Direccin de STRING2
LEA
SI,STRING1
;Direccin de STRING1
REP
MOVSn
,-Mueve n bytes/palabras
LABEL2
,-Salta,
AL, [SI]
si CX es cero
MOV
[DI] , AL
INC
DI
,-0 DEC DI
INC
SI
,-0 DEC SI
LOOP
LABEL1
LABEL2:
La figura 6-2 ilustr cmo mover un campo de 9 bytes. El programa tambin pudo haber
utilizado MOVSB para este objetivo. En la figura 12-1 el procedimiento C10MVSB utiliza MOVSB
para mover de byte en byte un campo de 10 bytes NAME1 a NAME2. La primer instruccin, CLD,
pone en cero la bandera de direccin de modo que el MOVSB procesa los datos de izquierda a
derecha. Al inicio de la ejecucin, por lo regular la bandera de direccin se encuentra en cero, pero
aqu por precaucin est codificado CLD.
Las dos instrucciones LEA cargan los registros SI y DI con los desplazamientos de NAME1
y NAME2, respectivamente. Ya que el cargador del DOS para un programa .COM de manera automtica inicializa los registros DS y ES, las direcciones segmento:desplazamiento son correctas
para ES:DI y DS:SI. Una instruccin MOV inicializa el CX con 10 (la longitud de NAME1 y de
NAME2). Ahora la instruccin REP MOVSB realiza lo siguiente:
Mueve el byte de la extrema izquierda de NAME1 (direccionado por DS:SI) al byte de
extrema izquierda de NAME2 (direccionado por ES:DI).
Incrementa el DI y SI en uno para los siguientes bytes a la derecha.
Disminuye el CX en 1.
Repite esta operacin, 10 ciclos en total, hasta que el CX se convierte en cero.
Puesto que la bandera de direccin es cero y MOVSB incrementa DI y SI, cada iteracin
procesa un byte ms a la derecha, como NAME1 +1 a N A M E 2 + 1 , y as en forma sucesiva. Al
final de la ejecucin, el CX contiene 00, el DI contiene la direccin de N A M E 2 + 1 0 , y el SI
contiene la direccin de NAME1 + 1 0 ambos un byte despus del final del nombre.
Si la bandera de direccin es uno, MOVSB disminuira DI y SI, provocando que el procesamiento ocurriera de derecha a izquierda. Pero en ese caso, para mover los contenidos de manera
adecuada tendra que inicializar el SI con NAME1 +9 y el DI con N A M E 2 + 9 .
El procedimiento siguiente de la figura 12-1, D10MVSW, utiliza MOVSW para mover
cinco palabras desde NAME2 a NAME3. Al final de la ejecucin, el CX contiene 00, el DI
contiene la direccin de NAME3 + 10, y el SI contiene la direccin de N A M E 2 + 1 0 .
204
BEGIN:
P 1 2 M O V S T (COM)
Operaciones
.MODEL SMALL
.CODE
ORG
100H
SHORT MAIN
JMP
NAME1
AME 2
AME 3
DB
DB
DB
'Assemblers'
10 D U P ( ' ')
10 D U P ( ' ')
,-Elementos
MAIN
PROC
CALL
CALL
MOV
INT
ENDP
NEAR
C10MVSB
D10MVSW
AX,4C00H
21H
Procedimiento principal
Subrutina MVSB
Subrutina MVSW
Salir a DOS
TITLE
MAIN
<
C10MVSB
C10MVSB
<
D10MVSW
D10MVSW
Use
of
cadenas
de
con
MOVS
datos
MOVSB:
PROC
NEAR
CLD
MOV
CX, 10
LEA
DI,AME2
LEA
SI,NAME1
REP MOVSB
RET
ENDP
Use of MOVSW:
PROC
NEAR
CLD
MOV
CX, 05
LEA
DI,NAME3
LEA
SI,NAME2
REP MOVSW
RET
ENDP
END
BEGIN
Figura 12-1
de
Captulo 12
Izquierda a derecha
M o v e r los b y t e s
de N A M E 1 a A M E 2
/Izquierda a derecha
/Mover 5 p a l a b r a s
/
de N A M E 2 a A M E 3
TITLE
205
BEGIN:
P12LODST (COM)
Uso de LODSB en operaciones de cadenas
.MODEL
SMALL
.CODE
ORG
100H
JMP
SHORT MAIN
FIELDA
FIELDB
DB
DB
'Assemblers'
10 DUP(20H)
Elementos de datos
MAIN
PROC
CLD
MOV
LEA
LEA
LODSB
MOV
DEC
LOOP
MOV
INT
ENDP
END
NEAR
Procedimiento principal
Izquierda a derecha
A20:
MAIN
CX, 10
SI,FIELDA
DI,FIELDB+9
[DI] ,AL
DI
A20
AX,4C00H
21H
BEGIN
Figura 12-2
AL, [SI]
,-Carga un byte en AL
INC
SI
En la figura 12-2 el rea de datos define un campo de 10 bytes llamado FIELDA, con el
valor "Assemblers" y otro campo de 10 bytes llamado FIELDB. El objetivo es transferir los
bytes de FIELDA a FIELDB en secuencia inversa, de manera que FIELDB contenga "srelbmessA".
LODSB es utilizada para accesar un byte a la vez de FIELDA al AL y la instruccin MOV
[DI],AL transfiere los bytes a FIELDB de derecha a izquierda.
S T O S : A L M A C E N A R UNA CADENA D E C A R A C T E R E S
STOS almacena los contenidos del registro AL, AX o EAX en un byte, palabra o palabra doble en
memoria. La direccin de memoria siempre est sujeta a los registros ES:DI. Dependiendo de la
bandera de direccin, STOS tambin incrementa o disminuye el registro DI en 1 para byte, 2 para
palabra y 4 para palabra doble.
Un uso prctico de STOS con un prefijo REP es para inicializar el rea de datos a cualquier
valor especificado, tal como limpiar el rea de despliegue a blancos. Puede establecer el nmero de
bytes, palabras o palabras dobles en el CX. Las instrucciones equivalentes a REP STOSB son:
JCXZ
L A B E L 1 : MOV
LABEL2
LABEL2
[DI],AL
INC/DEC
DI
LOOP
LABEL1
;Si CX es cero,
entonces salta
/Almacena AL en memoria
/Incrementa o disminuye
206
TITLE
BEGIN:
P 1 2 S T O S T (COM)
OO p e r a c i o n e s
.MODEL
SMALL
.CODE
ORG
10OH
JMP
SHORT MAIN
NAME1
DB
MAIN
PROC
NEAR
CLD
MOV
AX,2020H
MOV
CX,05
LEA
DI,NAME1
REP STOSW
MOV
AX,4C00H
INT
21H
ENDP
END
BEGIN
MAIN
Figura 12-3
'Assemblers
de
cadenas
/Elementos
de
con
Captulo 12
STOSW
datos
Procedimiento principal
Izquierda a derecha
Mover
5 blancos
a NAME1
/Salir
DOS
La instruccin STOSW en la figura 12-3 almacena de forma repetida una palabra con 2020H
(blancos) cinco veces en N A M E 1 . La operacin almacena el AL en el primer byte y el AH en el byte
siguiente (esto es, en orden inverso). Al final, NAME1 est en blanco, el CX contiene 00 y el DI
contiene la direccin de NAME1 + 1 0 .
PTR
[VIDAREA +
DI*],
AX
207
TITLE
P12DRVID (EXE)
. M O D E L SMALL
VIDSEG
VIDAREA
VIDSEG
SEGMENT AT 0BA00H
DB
1000H DUP(?)
ENDS
PROMPT
DB
.DATA
'Press any k e y . . .
. STACK 64
BEGIN
BEGIN
.CODE
PROC
MOV
MOV
MOV
MOV
ASSUME
MOV
INT
PUSH
PUSH
MOV
MOV
INT
MOV
MOV
INT
CALL
CALL
CALL
MOV
POP
MOV
INT
POP
MOV
INT
MOV
INT
ENDP
FAR
AX,@data
DS, AX
AX, VIDSEG
ES, AX
ES/VIDSEG
AH, OFH
10H
AX
BX
AH,00H
AL, 03
10H
AH,05H
AL,02H
10H
C10PROC
DIOPROMPT
E10INPT
AH, 05H
BX
AL, BH
10H
AX
AH,00H
10H
AX,4C00H
21H
Direccionamiento
del segmento de datos,
y del
rea de video
Peticin obtiene
y guarda
modo y
p g i n a presente
Peticin fija
modo 03, despejar pantalla
Peticin fija
p g i n a 02
Procesar rea de exhibicin
Mostrar indicacin al u s u a r i o
Proporcionar para entrada
Restaurar
nmero de pgina
original
/Restaurar video
/ modo (en AL)
/Salir a DOS
C30 :
C40 :
CIOPROC
PROC
MOV
MOV
MOV
MOV
STOSW
LOOP
INC
INC
ADD
CMP
JNE
RET
ENDP
NEAR
AL.41H
AH,01H
DI,660
CX, 60
C40
AH
AL
DI,40
AL,51H
C3 0
Carter a mostrar
Atributo
Inicio de rea de exhibicin
Caracteres por hilera
AX en rea de exhibicin
Repetir 6 0 veces
/Siguiente atributo
/Siguiente carcter
/Sangrar para siguiente hilera
/ltimo carcter a mostrar?
no, repetir
/ s, regresar
NEAR
CX, 16
SI,PROMPT
Figura 12-4
/Caracteres a exhibir
/Direccin de la indicacin
208
D2 0:
D10PROMPT
MOV
MOV
LODSB
STOSW
LOOP
RET
ENDP
DI,3840
AH,03H
D20
Aceptar
E10INPT
E10INPT
PROC
MOV
INT
RET
ENDP
END
Ubicacin en el rea
Nuevo atributo en AH
Carcter en AL
Almacenar en rea de
16 v e c e s
Regresar
NEAR
AH,10H
16H
de
Captulo 1
exhibicin
exhibicin
entrada
;Peticin del
,- e n t r a d a
teclado
BEGIN
Figura 12-4B
(continuacin)
para palabras dobles. La operacin establece las banderas AF, C F , OF, PF, SF y Z F . Cuando s<
combinan con un prefijo REP y una longitud en el CX, de manera sucesiva CMPS puede compa
rar cadenas de cualquier longitud.
Pero observe que CMPS proporciona una comparacin alfanumrica, esto es, una compa
racin de acuerdo con los valores ASCII. La operacin no es adecuada para comparacione
algebraicas, que consisten en nmeros con signo. Considere la comparacin de dos cadenas qu
contienen JEAN y JOAN. Una comparacin de izquierda a derecha, tiene el resultado siguiente
J:J
E:0
A: A
N:N
Iguales
Diferentes (E es menor)
Iguales
Iguales
Una comparacin de los cuatro bytes termina con una comparacin de N con N (iguales). Ahora
ya que los dos nombres no son idnticos, la operacin debe terminar tan pronto como la compa
racin entre dos caracteres sea diferente. Para este propsito, REP tiene una variacin, REP1
(Repite cuando sea igual), que repite la operacin mientras la comparacin entre caracteres se
igual, o hasta que el registro CX sea igual a cero. El cdigo para la comparacin repetida de ui
byte es REPE CMPSB.
La figura 12-5 consta de dos ejemplos que utilizan CMPSB. El primero compara AME
con NAME2, que contienen los mismos valores. Por tanto, la operacin CMPSB se realiza coi
los 10 bytes. Al final de la ejecucin, el CX contiene 00, el DI contiene la direccin de NAME2 +10
el SI contiene la direccin de NAME1 + 1 0 , la bandera de signo es positiva y la bandera de cen
indica igual o cero.
El segundo ejemplo compara NAME2 con NAME3, que contienen valores diferentes. L
operacin CMPSB termina despus de comparar el primer byte resultando una condicin alta i
diferente: El CX contiene 09, el DI contiene la direccin de NAME3 + 1, el SI contiene 1
direccin de N A M E 2 + 1 , la bandera del signo es positiva y la bandera del signo indica diferente
El primer ejemplo resulta igual o cero y (slo por razones de ilustracin) mueve 01 a
registro BH. El segundo ejemplo resulta diferente y mueve 02 al registro BL. Si utiliza DEBU(
para rastrear las instrucciones, al final de la ejecucin ver 0102 en el registro BX.
Advertencia!: Estos ejemplos utilizan CMPSB para comparar datos de byte en byte. Inicialic
CX en 5, si utiliza CMPSW para comparar datos una palabra a la vez. Pero ste no es el problema
TITLE
209
BEGIN:
P12CMPST (COM)
Uso de CMPS para operaciones en cadenas
.MODEL
SMALL
.CODE
ORG
100H
JMP
SHORT MAIN
NAME1
AME 2
AME 3
DB
DB
DB
MAIN
PROC
NEAR
CLD
MOV
CX, 10
LEA
DI,NAME2
LEA
SI,NAME1
RE PE CMPSB
JNE
G2 0
MOV
BH, 01
'Assemblers'
'Assemblers'
10 D U P ( ' ')
;Elementos de datos
/Procedimiento principal
/Izquierda a derecha
Iniciar para 10 bytes
Compare NAME1: NAME2
no es igual, saltarlo
igual, fijar BH
G20 :
MOV
CX,10
LEA
DI, NAME3
LEA
SI,NAME2
REPE CMPSB
JE
G3 0
MOV
BL,02
G3 0 :
MAIN
MOV
INT
ENDP
END
AX,4C00H
21H
Salir a DOS
BEGIN
Figura 12-5
Cuando compara palabras, CMPSW invierte los bytes. Por ejemplo, compare los nombres
SAMUEL y ARNOLD. Para la comparacin inicial de las palabras, en lugar de comparar SA con
AR la operacin compara AS con RA. As, en lugar de que el nombre SAMUEL indique un valor
mayor, ser menor, e incorrecto. CMPSW funciona de manera correcta slo si las cadenas
comparadas contienen datos numricos sin signo definido como DW, DD o DQ.
SCAS: BSQUEDA E N C A D E N A S
SCAS difiere de CMPS en que SCAS busca una cadena por un valor de byte, palabra o palabra
doble especfico. SCAS compara el contenido de la localidad de memoria (direccionado por ES:DI)
con el contenido del registro AL, AX o EAX. Dependiendo de la bandera de direccin, SCAS
tambin incrementa o disminuye el registro DI en 1 para byte, 2 para palabra y 4 para palabra doble.
Al final de la ejecucin, SCAS establece las banderas AF, CF, OF, PF, SF y Z F . Cuando se combina
con el prefijo REP y una longitud en el CX, SCAS puede buscar en cadenas con cualquier longitud.
SCAS es til en particular para aplicacin de edicin de texto, en la que el programa tiene que
buscar signos de puntuacin, como puntos, comas y blancos.
El cdigo en la figura 12-6 rastrea NAME1 por la letra minscula ' m \ La operacin en este
caso es REPNE SCASB, ya que la operacin SCASB es para una bsqueda continua, mientras la
comparacin no sea igual o hasta que CX sea cero.
Como NAME1 contiene "Assemblers", SCASB encuentra una coincidencia en la quinta
comparacin. Si utiliza DEBUG para rastrear las instrucciones, al final de la ejecucin de la
210
TITLE
BEGIN:
P 1 2 S C A S T (COM)
Operaciones
.MODEL
SMALL
.CODE
ORG
100H
JMP
SHORT MAIN
NAME1
DB
'Assemblers'
.Elementos
MAIN
PROC
CLD
MOV
MOV
LEA
REPNE
JNE
MOV
NEAR
/Procedimiento principal
/Izquierda a derecha
AL,'m'
CX, 10
DI, NAME1
SCASB
H2 0
A L , 03
de
cadenas
de
/Escudriar
/
en N A M E 1
con
Captulo 12
SCAS
datos
'm'
/Si s e e n c o n t r
/
almacenar 0 3
en AL
H20 :
MOV
INT
ENDP
END
MAIN
AH,4CH
21H
/Salir
DOS
BEGIN
Figura 12-6
operacin REP SCASB ver que la bandera del cero muestra cero, el CX est disminuido en 05
y el DI est aumentado en 0 5 . (El DI est incrementado en un byte pasando la posicin actual de
la ' m ' . )
El programa almacena 03 en el registro AL (por razones ilustrativas) para indicar que se
encontr una " m " .
SCASW busca una palabra en memoria que coincida con la palabra en el registro AX. Si
utiliza LODSW o MOV para transferir una palabra al registro AX, el primer byte estara en el
AL y el segundo en el AH. Como SCASW compara los bytes en orden inverso, la comparacin
funciona de manera correcta.
BUSCAR Y R E E M P L A Z A R
Tambin puede necesitar reemplazar un carcter especfico con otro carcter, por ejemplo, para
borrar de un documento caracteres de edicin, como smbolos de prrafo y de fin de pgina. El
siguiente programa parcial busca en STRING un ampersn (&) y lo reemplaza con un blanco. Si
SCASB localiza un ampersn, termina la operacin. En este ejemplo, existe uno en S T R I N G + 8 , er
donde se inserta un blanco, aunque al final SCASB haya incrementado el registro DI a STRING+9.
Disminuir el DI en uno proporciona la direccin correcta para insertar el blanco que reemplaza al
carcter. El cdigo es el siguiente:
STRLEN
EQU 15
STRING
DB
/Longitud
'The
time&is
de
STRING
now'
CLD
/De
MOV
A L , / B u s c a
izquierda
a
el
derecha
carcter
211
CX,STRLEN
;Longitud de STRING
LEA
DI,STRING
,-Direccin de STRING
REPNE SCASB
/Busca
JNZ K2 0
/Se encontr el
DEC
DI
/ s, ajusta direccin
MOV
BYTE PTR[DI],20H
carcter?
FLDA,FLDB
implica un movimiento repetido del byte que inicia en FLDB al byte que inicia en FLDA. Si carga
los registros DI y SI con las direcciones de FLDA y FLDB, tambin puede codificar la instruccin MOVS como
REP MOVS ES :BYTE PTR [DI] , DS : [SI]
Pocos programas estn codificados de esta manera, y el formato se trata aqu slo para
informacin.
En lugar de definir el patrn de manera repetitiva, slo necesita definir los primeros seis bytes
que estn al inicio de la lnea de despliegue. Aqu est la codificacin necesaria:
PATTERN
DB
'***###'
DISAREA
DB
42 DUP(?)
212
CLD
,-De
izquierda
palabras
MOV
CX,21
;21
LEA
DI,DISAREA
/Destino
LEA
SI,PATTERN
/Origen
REP
MOVSW
/Mueve
los
Captulo 12
derecha
caracteres
PATTERN
DISAREA
I
PATTERN
DISAREA+6
DISAREA+12
...
***###
I
DISAREA+42
Puede utilizar esta tcnica para duplicar cualquier nmero de veces un patrn. El patrn puede ser de cualquier longitud, pero debe preceder de manera inmediata al campo destino.
Ruth
Mantle
Jackson
I
Cmo alinear a la derecha en la pantalla
TITLE
213
P12RIGHT (EXE)
.MODEL SMALL
.STACK 64
NAMEPAR
MAXNLEN
ACTNLEN
NAMEFLD
.DATA
LABEL
DB
DB
DB
BYTE
31
?
31 D U P C
PROMPT
NAMEDSP
ROW
DB
DB
DB
' a m e ? , '$'
31 D U P ( ) , 13,
00
.CODE
PROC
MOV
MOV
MOV
MOV
CALL
SUB
CALL
FAR
AX,@data
DS,AX
ES,AX
AX,0600H
Q10SCR
DX,DX
Q20CURS
.Procedimiento principal
;Iniciar
;
segmento de datos
B10INPT
ACTNLEN,OFFH
A90
D10SCAS
AL, *'
A10LOOP
E10RGHT
F10CLNM
A10LOOP
AX,4C00H
21H
BEGIN
;Lista de p a r m e t r o s de nombres
/Longitud mxima
;No. de caracteres introducidos
;Nombre
')
10, '$'
,-Despejar p a n t a l l a
Fijar cursor en 00,00
A10LOOP:
A90 :
BEGIN
B10INPT
B10INPT
DIOSCAS
CALL
TEST
JZ
CALL
CMP
JE
CALL
CALL
JMP
MOV
INT
ENDP
PROC
MOV
LEA
INT
MOV
LEA
INT
RET
ENDP
Indicacin
AH,09H
DX, PROMPT
21H
AH,OAH
DX, NAMEPAR
21H
PROC
CLD
MOV
AL, *'
MOV
CX, 30
DI,NAMEFLD
LEA
R E P N E SCASB
JE
D20
MOV
AL,20H
RET
"ENDP
/Exhibir
indicacin
,-Aceptar entrada
/Izquierda a derecha
,-Carcter a escudriar
/Fijar 30 bytes a escudriar
,-Se encontr un asterisco?
,- no, salir
,- s, despejar * en AL
/
E10RGHT
para entrada
D20 :
D10SCAS
/Salir a DOS
PROC
Figura 12-7
214
STD
MOV
MOV
LEA
ADD
DEC
LEA
/Izquierda
CH, 00
CL,ACTNLEN
SI,NAMEFLD
SI,CX
SI
DI,NAMEDSP+3 0
derecha
,-Longitud e n C X p a r a R E P
/Calcular la posicin
/
m s a la d e r e c h a
/
del n o m b r e que se i n g r e s a
/Posicin a la d e r e c h a de e x h i b i c i n
ame
REP
MOVSB
/Mover
cadena
/Fijar
cursor
derecha
left
MOV
MOV
CALL
MOV
LEA
INT
DH,ROW
DL, 4 8
Q20CURS
AH,09H
DX,NAMEDSP
21H
CMP
JAE
INC
JMP
ROW,20
E20
ROW
E90
MOV
CALL
MOV
MOV
CALL
RET
ENDP
AX,0601H
Q10SCR
DH,ROW
DL, 00
Q20CURS
/Exhibir
nombre
iParte i n f e r i o r de la
no,
incrementar hilera
E20 :
E90 :
E10RGHT
Clear
F10CLNM
F10CLNM
Q10SCR
Q10SCR
Q2 0CURS
recorrer y
fijar cursor
ame:
PROC
CLD
MOV
AX,2020H
MOV
CX, 15
LEA
DI,NAMEDSP
REP STOSW
RET
ENDP
Scroll screen:
PROC
MOV
MOV
MOV
INT
RET
ENDP
PROC
MOV
SUB
INT
RET
ENDP
END
/Izquierda
/Despejar
a
15
derecha
palabras
/AX s e f i j a a l i n i c i o
/Atributo de color
BH, 30
CX, 00
DX,184FH
10H
Set
Q20CURS
si,
cursor
row/col:
,-DX
se
fija
AH,02H
BH, B H
10H
BEGIN
Figura 12-7
(continuacin)
al
inicio
pantalla?
Capitulo 12
215
Preguntas
PUNTOS CLAVE
Para las instrucciones de cadenas de caracteres MOVS, STOS, CMPS y SCAS, asegrese
de que su programa .EXE inicializa el registro ES.
Para instrucciones de cadenas, utilice los sufijos B, W o D para manejo de cadenas de byte,
palabra o palabra doble.
Ponga en unoXCLD) o en cero (STD) la bandera de direccin para la direccin necesaria de
procesamiento.
Verifique dos veces la inicializacin de los registros DI y SI. Por ejemplo, MOVS implica
los operandos DI,SI, mientras que CMPS implica los operandos SI,DI.
Inicialice el registro CX de REP para procesar el nmero necesario de bytes, palabras o
palabras dobles.
Para procesamiento normal, utilice REP con MOVS y STOS, y utilice un REP condicional
(REPE o REPNE) con CMPS y SCAS.
CMPSW y SCASW invierten los bytes de las palabras que son comparadas.
En donde necesite procesar de derecha a izquierda, tenga cuidado con la direccin inicial
del campo de byte de la extrema derecha. Por ejemplo, si el campo es NAME1 y tiene una
longitud de 10 bytes, entonces para procesar los bytes, la direccin que carga para LEA
es N A M E + 9 . Sin embargo, para procesar palabras la direccin que carga para LEA es
AME 4-8 ya que la operacin de cadena de caracteres accesa A M E + 8 y NAME + 9.
PREGUNTAS
12-1. Las operaciones con cadena de caracteres suponen que los operandos estn relacionados con los registros
DI o SI. Identifique estos registros para lo siguiente: (a) MOVS (operandos 1 y 2); (b) CMPS (operandos
1 y 2); (c) SCAS (operando 1).
12-2. Para operaciones con cadenas usando REP, cmo define el nmero de repeticiones que ocurren?
12-3. Para operaciones con cadenas usando REP, cmo establece el procesamiento de derecha a izquierda?
12-4. El captulo da las instrucciones equivalentes a (a) MOVSB, (b) LODSB y (c) STOSB, cada una con
prefijo REP. Para cada caso, proporcione el cdigo equivalente para procesamiento de palabras.
12-5. Corrija el programa de la figura 12-1. Convierta el programa de formato .COM a .EXE, y asegrese de
inicializar el registro ES. Cambie las operaciones MOVSB y MOVSW para mover datos de derecha a
izquierda. Utilice DEBUG para rastrear los procedimientos y observe el contenido del segmento de
datos y de los registros.
12-6. Utilice la definicin de datos siguiente y codifique operaciones con cadenas para las partes (a) - (f):
DATASG
(a)
(b)
(c)
(d)
Mover CONAME
Mover CONAME
Cargar el tercer y
Almacenar el AX
SEGMENT PARA
1
CONAME
DB
S P A C E LAUNCHES,
PRLINE
DB 20 D U P ( '
LAUNCHES,
INC
216
Captulo 12
CAPTULO 13
Aritmtica:
IProcesamiento de datos binarios
OBJETIVO
C u b r i r los requisitos p a r a la s u m a , resta, multiplicacin y divisin d e datos b i n a r i o s .
INTRODUCCIN
Este captulo estudia la suma, resta, multiplicacin y divisin, y el uso de datos con y sin signo.
Tambin ofrece muchos ejemplos y advertencias sobre varios errores al viajero inexperto en el
reino de los microprocesadores. El captulo 14 cubre los requisitos especiales para la conversin
entre formato de datos binarios y ASCII.
Aunque estamos acostumbrados a realizar aritmtica en formato decimal (base 10), un
microprocesador realiza su aritmtica slo en binario (base 2). Adems, la limitacin es de registros de 16 bits en procesadores anteriores al 80386 exige un tratamiento especial para nmeros
grandes.
Las instrucciones introducidas en este captulo son:
ADD
Suma
SUB
Resta
MUL
IMUL
DIV
IDIV
NEG
Niega
CBW
217
Aritmtica: I P r o c e s a m i e n t o d e d a t o s b i n a r i o s
218
Captulo 1 3 ;
SUMA Y R E S T A
Las instrucciones ADD y SUB realizan sumas y restas sencillas de datos binarios. Como se des-j
cribi en captulos anteriores, los nmeros binarios negativos estn representados en la forma de
complemento a dos: Invierta todos los bits del nmero positivo y sume 1. Los formatos generales
para las instrucciones ADD y SUB son:
[etiqueta:]
ADD/SUB
{registro,registro}
[etiqueta:]
ADD/SUB
{memoria,registro}
[etiqueta:]
ADD/SUB
{registro,memoria}
[etiqueta:]
ADD/SUB
{registro,inmediato}
[etiqueta:]
ADD/SUB
{memoria,inmediato}
Como con otras instrucciones, no existen operaciones directas de memoria a memoria. El!
ejemplo siguiente utiliza el registro AX para sumar WORDA a WORDB:
I
WORDA
DW
12 3
/Define WORDA
WORDB
DW
25
;Define
WORDB
MOV
AX, W O R D A
/Mueve W O R D A al AX
ADD
AX,WORDB
/Suma W O R D B al AX
MOV
WORDB, AX
,-Mueve AX a W O R D B
Desbordamientos
i
Est alerta con los desbordamientos en las operaciones aritmticas. Ya que un byte slo permite e|
uso de un bit de signo y siete bits de datos (desde - 1 2 8 hasta +127), una operacin aritmtica,
puede exceder con facilidad la capacidad de un registro de un byte. Y una suma en el registro AL
que exceda su capacidad puede provocar resultados inesperados. Por ejemplo, suponga que el
AL contiene 60H. Entonces la instruccin
i
.i
ADD
AL, 20H
genera una suma de 80H en el AL. Comq hemos sumado dos nmeros positivos, esperamos qu
la suma sea positiva, pero la operacin pone en uno la bandera de desbordamiento y la bandera de
signo en negativa. La razn? El valor 80H, o 10000000 binario, es un nmero negativo; en
lugar de + 1 2 8 la suma es - 1 2 8 . El problema es que el registro AL es muy pequeo para la
suma, que debe estar en el registro AX completo, como se muestra en la seccin siguiente.
f
Suma y resta
219
TITLE
(COM)
SMALL
BEGIN:
P13ADD
. MODEL
.CODE
ORG
JMP
BYTEA
BYTEB
BYTEC
WORDA
WORDB
WORDC
DB
DB
DB
DW
DW
DW
64H
4 OH
16H
4000H
2000H
1000H
MAIN
PROC
CALL
CALL
MOV
INT
ENDP
NEAR
B10ADD
C10SUB
AX,4C00H
21H
MAIN
Operaciones A D D y SUB
100H
SHORT MAIN
;Datos
Ejempl os de SUMA
B10ADD
B10ADD
PROC
MOV
MOV
ADD
ADD
ADD
ADD
ADD
RET
ENDP
AL,BYTEA
BL,BYTEB
AL, BL
AL,BYTEC
BYTEA,BL
BL,10H
BYTEA,25H
Ejemplos de R E S T A
10SUB
PROC
MOV
MOV
SUB
SUB
SUB
SUB
SUB
RET
ENDP
END
C10SUB
AX,WORDA
BX,WORDB
AX,BX
AX,WORDC
WORDA,BX
BX,1000H
WORDA,256H
Procedimiento p r i n c i p a l :
Llama a la rutina ADD
Llama a la rutina SUB
Sale al DOS
(ADD) de b y t e s :
Registro a registro
Memoria a registro
Registro a memoria
Inmediato a registro
Inmediato a memoria
(SUB)
de p a l a b r a s :
Registro de registro
Memoria de registro
Registro de memoria
Inmediato de registro
Inmediato de memoria
BEGIN
Figura 13-1
Aritmtica: I P r o c e s a m i e n t o d e d a t o s b i n a r i o s
220
AH
CBW
ADD
/Extiende
AX.20H/
el
signo
de
AL
al
/Suma al AX
AH
Captulo 1 3
AL
XX
SOH
00
60
00
80
01 23
B C 62
0BC62H
DW
0123H
Entonces el ensamblador convierte estas definiciones en secuencia inversa de bytes, adecuada para
aritmtica con palabras dobles:
Hex
62 BC
23
01
Examinemos dos maneras de realizar aritmtica de palabras mltiples. La primera es sencilla y especfica, mientras que la segunda es ms elaborada y general.
En la figura 13-2, el procedimiento D10DWD ilustra la suma de un par de palabras (WORD1A
y WORD IB) a un segundo par (WORD2A y WORD2B) y almacena la suma en un tercer par
(WORD3A y WORD3B). En efecto, la operacin es para sumar los nmeros, tal como lo siguiente:
Nmero
0123
BC62H
Sumar:
inicial:
0012
553AH
Total:
0136
119CH
A causa de la secuencia inversa de bytes en memoria, el programa define los nmeros con las
palabras al revs: BC62 0123 y 553A 0012, respectivamente. Entonces el ensamblador almacena
en la memoria valores de palabras dobles en la secuencia inversa de bytes correcta:
TITLE
BEGIN:
P13DBADD (COM)
Suma de p a l a b r a s
.MODEL
SMALL
.CODE
ORG
100H
SHORT MAIN
JMP
WORDlA
WORDIB
WORD2A
WORD2B
WORD3A
WORD3B
DW
DW
DW
DW
DW
DW
0BC62H
0123H
553AH
0012H
?
?
MAIN
PROC
CALL
CALL
MOV
INT
ENDP
NEAR
D10DWD
E10DWD
AX,4C00H
21H
MAIN
Ejemplo de
D10DWD
D10DWD
PROC
MOV
ADD
MOV
MOV
ADC
MOV
RET
ENDP
E10DWD
PROC
CLC
MOV
LEA
LEA
LEA
/Datos
Procedimiento principal
Llama al p r i m e r ADD
Llama al segundo ADD
Sale al DOS
SUMA
AX.WORD1A
AX,WORD2A
WORD3A,AX
AX,W0RD1B
AX,WORD2B
WORD3B, AX
Operacin
dobles
(ADD)
de palabras d o b l e s :
de suma generalizada:
CX, 02
SI,W0RD1A
DI,WORD2A
BX,WORD3A
Pone en
Designa
Palabra
Palabra
Palabra
E20 :
E10DWD
MOV
ADC
MOV
INC
INC
INC
INC
INC
INC
LOOP
RET
ENDP
END
AX, [SI]
AX,[DI]
[BX] ,AX
SI
SI
DI
DI
BX
BX
E20
Mueve la palabra al AX
Suma con acarreo al AX
Almacena la palabra
Ajusta las direcciones para
la siguiente palabra de la derecha
BEGIN
Figura 13-2
WORD1A y WORD1B:
G2BC
2301
WORD2A y WORD2B:
3A55
1200
Aritmtica: I P r o c e s a m i e n t o d e d a t o s b i n a r i o s
222
Captulo 1 3
suma en WORD3B. Examinemos las operaciones en detalle. El primer MOV y la operacin ADD
invierten los bytes en el AX y suman las palabras de la extrema izquierda:
WORD1A:
BCS2H
WORD2A:
+553AH
Total:
(D119CH
(9C11H
es
almacenado
en WORD3A)
Ya que la suma de WORD 1A ms WORD2A excede la capacidad del AX, ocurre un acarreo y la
bandera de acarreo es puesta en uno. Ahora, el ejemplo suma las palabras de la derecha, pero esta
vez utilizando ADC (sumar con acarreo) en lugar de ADD. ADC suma los dos nmeros y ya que
la bandera de acarreo est en uno, suma uno a la suma:
WORD
IB:
0123H
WORD2B:
Ms
el
+0012H
acarreo:
Total:
1H
0136H
(3601H
es
almacenado
en
WORD3B)
Por medio de DEBUG rastree la aritmtica: puede ver la suma 0136H en el AX y los valores en
orden inverso 9C11H en WORD3A y 3601H en WORD3B.
Tambin en la figura 13-2, el procedimiento ms elaborado E10DWD proporciona un enfoque para sumar nmeros de cualquier longitud aunque aqu, como antes, se suma la misma pareja
de palabras W 0 R D 1 A : W 0 R D 1 B y WORD2A:WORD2B. El procedimiento utiliza el SI, DI y
BX como registros base para las direcciones de WORD1A, WORD2A y WORD3A, respectivamente. Se realiza una iteracin a travs de las instrucciones por cada par de palabras que se suman
en este caso, dos veces. El primer ciclo suma las palabras de la extrema izquierda, y el segundo
suma las de la extrema derecha. Ya que el segundo ciclo es para procesar las palabras de la derecha, las
direcciones en los registros SI, DI y BX se incrementan en 2. Para cada registro, dos instrucciones
INC realizan esta operacin. Se emplea INC (en lugar de ADD) por una buena razn: la instruccin reg,02 limpiara la bandera de acarreo y causara una respuesta incorrecta, mientras que INC
no afecta la bandera de acarreo.
A causa del ciclo, slo existe una instruccin ADC. Al inicio, una instruccin CLC (pone
en cero el acarreo) asegura que la bandera de acarreo est inicialmente en cero. Para hacer que este
mtodo funcione, asegrese de (1) definir palabras adyacentes una de otra, (2) procesar palabras
de izquierda a derecha y (3) inicializar el CX al nmero de palabras que sern sumadas.
Para resta de mltiples palabras, la instruccin equivalente a ADC es SBB (restar con prstamo). En el procedimiento E10DWD, slo reemplace ADC con SBB.
EAX, EBX
,-registros
de
32
bits
Puede sumar palabras cudruples utilizando la tcnica estudiada antes para sumar palabras mltiples.
223
DECIMAL
SIN SIGNO
DECIMAL
CONSIGNO
11111001
249
-7
+2
+2
251
-5
+00000010
11111011
OF
CF
El resultado binario de la suma en este ejemplo es el mismo tanto para datos con signo como datos
sin signo. Sin embargo, los bits en el campo sin signo representan el 251 decimal, mientras que
los bits en el campo con signo representan el -5 decimal. En realidad, el contenido de un campo
significa cualquier cosa que usted quiera que signifique.
Aritmtica con acarreo
Una operacin aritmtica que causa un acarreo externo (hacia afuera) del bit de signo tambin
pone en uno la bandera de acarreo. Si ocurre un acarreo en datos sin signo, el resultado no es
vlido. El ejemplo siguiente de una suma provoca un acarreo:
BINARIO
11111100
+00000101
(1)00000001
DECIMAL
SIN SIGNO
DECIMAL
CONSIGNO OF CF
252
-4
+5
+5
1
(no vlido)
1 0
(vlido)
La operacin sobre los datos sin signo no es vlida a causa del acarreo externo de un bit de datos,
mientras que la operacin en datos con signo es vlida.
Desbordamiento aritmtico
Una operacin aritmtica pone en uno la bandera de desbordamiento cuando se tiene un acarreo
hacia el bit de signo (acarreo interno) y no se tiene un acarreo hacia afuera, o bien ocurre un
acarreo externo sin acarreo interno. En donde ocurra un desbordamiento en datos con signo, el
resultado es no vlido (a causa de un desbordamiento en el bit de signo), como lo muestra este
ejemplo:
Aritmtica: I P r o c e s a m i e n t o d e d a t o s b i n a r i o s
224
DECIMAL
DECIMAL
SIN SIGNO
CONSIGNO
01111001
121
+121
+00001011
+ 1 1
+ 1 1
BINARIO
10000100
132
OF
CF
-124
(vlido)
Captulo 1 3
(no v l i d o )
Una suma puede poner en uno las dos banderas, la de acarreo y la de desbordamiento. En el
ejemplo siguiente, el acarreo hace que la operacin sin signo sea no vlida, y as mismo el desbordamiento hace que la operacin con signo sea no vlida:
BINARIO
DECIMAL
DECIMAL
SIN SIGNO
CONSIGNO
11110110
246
+10001001
+137
(1)01111111
OF
CF
10
-119
127
+127
(no v l i d o )
(no
vlido)
El resultado de todo esto es que usted debe tener una buena idea de cul es la magnitud de los
nmeros que su programa procesar, y debe definir el tamao de los campos de acuerdo con esto.
MULTIPLICACIN
Para la multiplicacin, la instruccin MUL maneja datos sin signo y la instruccin IMUL (multiplicacin entera) maneja datos con signo. Ambas instrucciones afectan las banderas de acarreo y
de desbordamiento. Como programador, usted tiene el control sobre el formato de los datos que
procesa, y tiene la responsabilidad de seleccionar la instruccin de multiplicacin apropiada. El
formato general para M U L e IMUL es
[etiqueta:]
MUL/IMUL
registro/memoria
Las operaciones de multiplicacin bsicas son byte por byte, palabra por palabra y (para el 80386
y procesadores posteriores) palabras dobles por palabras dobles.
Byte por byte
Para multiplicar dos nmeros de un byte, el multiplicando est en el registro AL y el multiplicador
es un byte en memoria o en otro registro. Para la instruccin M U L DL, la operacin multiplica el
contenido del AL por el contenido del DL. El producto generado est en el registro AX. La
operacin ignora y borra cualquier informacin que pueda estar en el AH.
AH
Antes de multiplicar:
AL
Multiplicando
AX
Despus de multiplicar:
Producto
Multiplicacin
225
AX
Ignorado
Multiplicando
Antes de multiplicar:
Despus de multiplicar:
EAX
Ignorado
Multiplicando
Antes de multiplicar:
Despus de multiplicar:
Tamao de campo
El operando de M U L o IMUL slo hace referencia al multiplicador, que determina el tamao del
campo. En los ejemplos siguientes, el multiplicador est en un registro, el cual especifica el tipo
de operacin:
INSTRUCCIN
MULTIPLICADOR
MUL CL
byte
AL
AX
MUL BX
palabra
AX .
DX:AX
MUL
palabra
EAX
EDX: EAX
EBX
MULTIPLICANDO
doble
PRODUCTO
OPERACIN
BYTEl
DB
WORDl
DW
DWORD1
DD
MULTIPLICADOR
MULTIPLICANDO
PRODUCTO
MUL
BYTEl
BYTEl
AL
AX
MUL
WORDl
WORDl
AX
DX:AX
MUL
DWORD1
DWORD1
EAX
EDX: EAX
Aritmtica: I P r o c e s a m i e n t o d e d a t o s b i n a r i o s
226
Captulo 1 3
TITLE
227
BEGIN:
P13MULT (COM)
Operaciones MUL e IMUL
.MODEL SMALL
.CODE
ORG
100H
JMP
SHORT MAIN
BYTEl
BYTE 2
WORDl
W0RD2
DB
DB
DW
DW
80H
4 OH
8000H
2000H
MAIN
PROC
CALL
CALL
MOV
INT
ENDP
NEAR
ClOMUL
DIOIMUL
AX,4C00H
21H
MAIN
/Procedimiento principal
/Llama a la rutina MUL
/Llama a la rutina IMUL
/Sale al DOS
Ejemplos de M U L :
ClOMUL
ClOMUL
1
PROC
MOV
MUL
AL,BYTEl
BYTE 2
MOV
MUL
AX,WORDl
WORD 2
/Palabra p o r palabra
/ el producto en DX:AX
MOV
SUB
MUL
RET
ENDP
AL,BYTEl
AH, AH
WORDl
Ejemplos de
IMUL:
DIOIMUL PROC
MOV
IMUL
AL, BYTEl
BYTE 2
MOV
IMUL
AX,WORDl
WORD2
/Palabra p o r palabra
/ el p r o d u c t o en DX:AX
MOV
CBW
IMUL
RET
DIOIMUL ENDP
END
AL,BYTEl
WORDl
BEGIN
Figura 13-3
1,365
12
16,380
Qu pasa si usted slo puede multiplicar nmeros de dos dgitos? Entonces podra multiplicar por
separado el 13 y el 65 por 12, como:
13
12
156
65
12
780
Aritmtica: I P r o c e s a m i e n t o d e d a t o s b i n a r i o s
228
Captulo 1 3
Y despus sumar los dos productos; pero recuerde, ya que el 13 son los cientos, su producto en
realidad es 15,600:
15,600
+
780
(13 x 12 x 100)
(65 x 12)
16,380
Un programa en ensamblador puede usar esta misma tcnica, salvo que los datos consisten
de palabras (cuatro dgitos) en formato hexadecimal. Examinemos ahora los requisitos para multiplicar una palabra doble por una palabra y una palabra doble por una palabra doble.
Palabra doble por palabra
En la figura 13-4, E10XMUL multiplica una palabra doble por una palabra. El multiplicando
M U L T C N D , consiste en dos palabras con 3206H y 2521H, respectivamente. La razn de definir
dos DW (palabras) en lugar de una DD (palabra doble) es para facilitar el direccionamiento para
las instrucciones MOV que mueven palabras al registro AX. Los nmeros estn definidos en
secuencia inversa de palabra, y el ensamblador almacena cada palabra en secuencia inversa de
byte. As MULTCND, que tiene un valor definido de 32062521H, es almacenado como 21250632H.
TITLE
BEGIN:
MULTCND
MULTPLR
PRODUCT
MAIN
MAIN
P 1 3 D W M U L (COM)
Multiplicacin
.MODEL SMALL
.CODE
100H
ORG
JMP
SHORT MAIN
E10XMUL
palabras
dobles
DW
DW
DW
DW
DW
DW
DW
DW
2521H
3206H
0A26H
64 OOH
0
0
0
0
Datos
PROC
CALL
CALL
CALL
MOV
INT
ENDP
NEAR
E10XMUL
Z10ZERO
F10XMUL
AX.4C00H
21H
Procedimiento
principal
Llama a la p r i m e r a m u l t i p l i c a c i n
limpia el producto
L l a m a a la segunda m u l t i p l i c a c i n
Sale al DOS
Palabra
E10XMUL
de
PROC
MOV
MUL
MOV
MOV
MOV
MUL
ADD
ADC
RET
ENDP
doble
por palabra
AX,MULTCND
MULTPLR+2
PRODUCT,AX
PRODUCT+2,DX
/Multiplica la palabra
;
del multiplicando
/Almacena el producto
AX,MULTCND+2
MULTPLR+2
PRODUCT+2,AX
PRODUCT+4,DX
Multiplica la palabra de la
del multiplicando
Suma e l p r o d u c t o a l m a c e n a d o
Figura 13-4
de
la
izquierda
derecha
229
F10XMUL
PROC
MOV
MUL
MOV
MOV
AX, MULTCND
MULTPLR
PRODUCT+0,AX
PRODUCT+2, DX
MOV
MUL
ADD
ADC
ADC
AX,MULTCND
MULTPLR+2
PRODUCT+2, AX
PRODUCT+4 , DX
PRODUCT+6,00
MOV
MUL
ADD
ADC
ADC
AX,MULTCND+2
MULTPLR
PRODUCT+2, AX
PRODUCT+4,DX
PRODUCT+6,00
MOV
MUL
ADD
ADC
RET
ENDP
AX,MULTCND+2
MULTPLR+2
PRODUCT+4,AX
PRODUCT+6, DX
Limpia el
Z10ZERO
ZlOZERO
doble:
PROC
MOV
MOV
MOV
MOV
RET
ENDP
END
/Suma
con acarreo
rea del p r o d u c t o :
PRODUCT,0000
PRODUCT+2, 0000
PRODUCT+4,0000
PRODUCT+6,0000
/Limpia las p a l a b r a s
/ de izquierda a derecha
BEGIN
Figura 13-4B
(continuacin)
0000
0E80
Producto 2:
+138A
5800
138A
6680
Total:
E400
E400
Como el primer ADD puede provocar un acarreo, la segunda suma es ADC (suma con acarreo).
Ya que los datos numricos estn almacenados en formato inverso de bytes, PRODUCT en realidad contiene 00E4 8066 8A13. La rutina necesita que la primer palabra de PRODUCT al principio contenga cero.
Palabra doble por palabra doble
La multiplicacin de dos palabras dobles en procesadores anteriores al 80386 implica cuatro
multiplicaciones:
Aritmtica: I P r o c e s a m i e n t o d e d a t o s b i n a r i o s
230
MULTIPLICANDO
palabra
palabra
palabra
palabra
Captulo 1 3
MULTIPLICADOR
2
2
1
1
x
x
x
x
palabra
palabra
palabra
palabra
2
1
2
1
IMUL
registro,inmediato
IMUL
registro,memoria,inmediato
231
[etiqueta:]
IMUL
registro,{registro/memoria}
IMUL DX,25
32-bit IMUL:
IMUL ECX,MULTCAND,25
DX
25
DX
MULTCAND
25
ECX
BX
CX
BX
SHL AX,03
;80286 y posteriores
C20:
MOV
CX,04
;Inicializa para
cuatro
ciclos
SHL
AX,01
/Corrimiento del AX
RCL
DX,01
/Rota el DX a la izquierda
LOOP
C2 0
/Repite
DX,04
MOV
BL, AH
Almacena el AH en el BL
SHL
AX,04
SHR
BL,04
OR
DL,BL
Inserta el BL 4 bits en el DL
Aritmtica: I P r o c e s a m i e n t o d e d a t o s b i n a r i o s
232
Capitulo 13
DIVISIN
Para la divisin, la instruccin DIV (dividir) maneja datos sin signo y la IDIV (divisin entera)
maneja datos con signo. Usted es responsable de seleccionar la instruccin apropiada. El formato
general para DIV/IDIV es
[etiqueta:]
IDIV/DIV
{registro/memoria}
Las operaciones de divisin bsicas son palabra entre byte, palabra doble entre palabra y (para
80386 y posteriores) palabra cudruple entre palabra doble.
Palabra entre byte
Aqu, el dividendo est en el AX y el divisor es un byte en memoria o en otro registro. Despus
de la divisin, el residuo est en el AH y el cociente est en el AL. Ya que un cociente de un byte
es muy pequeo si es sin signo, un mximo de + 2 5 5 (FFH) y con signo + 1 2 7 (7FH) esta
operacin tiene un uso limitado.
AX
Antes de la divisin:
- Dividendo AH
AL
Residuo
Cociente
Despus de la divisin:
DX
AX
Residuo
Cociente
Antes de la divisin:
Despus de la divisin:
DX
AX
Residuo
Cociente
Divisin
233
Tamaos del campo
El operando de DIV o de IDIV hace referencia al divisor, que especifica el tamao del campo. En
los ejemplos siguientes de DIV, los divisores estn en un registro, que determina el tipo de operacin:
DIVISOR
OPERACIN
DIVIDENDO COCIENTE
RESIDUO
DIV CL
byte
AX
AL
AH
DIV CX
palabra
DX:AX
AX
DX
DIV
palabra
EDX: EAX
EAX
EDX
EBX
doble
DB
WORDl
DW
DWORD1
DD
DIVISOR
DIVIDENDO
COCIENTE
RESIDUO
DIV
BYTEl
BYTEl
AX
AL
AH
DIV
WORDl
WORDl
DX:AX
AX
DX
DIV
DWORD1
DWORD1
EDX:EAX
EAX
EDX
Aritmtica: I P r o c e s a m i e n t o d e d a t o s b i n a r i o s
234
TITLE
(COM)
SMALL
BEGIN:
P13DIV
.MODEL
.CODE
ORG
JMP
100H
SHORT
BYTE1
BYTE 3
WORD1
WORD2
WORD3
DB
DB
DW
DW
DW
80H
16H
2000H
0010H
1000H
MAIN
PROC
CALL
CALL
MOV
INT
ENDP
MAIN
Operaciones DIV
D10DIV
;
E10IDIV
E10IDIV
PROC
MOV
DIV
MOV
SUB
DIV
/Datos
NEAR
D10DIV
E10IDIV
AX,4C00H
21H
Procedimiento principal
L l a m a a la r u t i n a D I V
L l a m a a la r u t i n a IDIV
Sale al DOS
de
DIV:
AX,WORDl
BYTE1
AL,BYTE1
AH, A H
BYTE3
Palabra / byte
residuo:cociente en AH AL
Byte / byte
extiende el dividendo en DX:AX
residuo cociente en AH : AL
MOV
DX,WORD2
MOV
AX,WORD3
DIV
WORD1
MOV
AX,WORDl
SUB
DX,DX
DIV
WORD 3
RET
ENDP
Ejemplos de IDIV:
PROC
MOV
IDIV
MOV
CBW
IDIV
MOV
MOV
IDIV
MOV
CWD
IDIV
RET
ENDP
END
IDIV
MAIN
Ejemplos
D10DIV
AX.WORD1
BYTE1
AL,BYTE1
Palabra / byte
residuo:cociente en AH AL
Byte / byte
extiende el dividendo en AH
residuo:cociente en AH AL
Palabra doble / palabra
dividendo en DX:AX
r e s i d u o : c o c i e n t e e n D X :AX
BYTE3
DX,WORD2
AX,WORD3
WORD1
AX.WORDl
Palabra / palabra
extiende el dividendo en DX
r e s i d u o : c o c i e n t e e n D X :AX
WORD3
BEGIN
Figura 13-5
RESIDUO
EE
1000
(-18)
(4096)
COCIENTE
FB
0080
(-5)
(128)
Captulo 1 3
235
Divisin
Slo el cuarto ejemplo da el mismo resultado que el que dio DIV. En efecto, si el dividendo y el
divisor tienen el mismo bit de signo, DIV e IDIV generan el mismo resultado. Pero si el dividendo
y el divisor tienen bits de signo diferentes, DIV genera un cociente positivo, mientras que IDIV
genera un cociente negativo.
Puede encontrar til usar DEBUG para rastrear estos ejemplos.
Desboradamientos e interrupciones
Las operaciones DIV e IDIV suponen que el cociente es mucho menor que el dividendo original.
Como consecuencia, la operacin puede causar con facilidad un desbordamiento; cuando lo hace,
ocurre una interrupcin con resultados impredecibles. La divisin entre cero siempre provoca una
interrupcin. Pero la divisin entre uno genera un cociente igual al dividendo y tambin podra
causar una interrupcin.
sta es una regla til: si el divisor es un byte, su contenido debe ser mayor que el byte
izquierdo (AH) del dividendo; si el divisor es una palabra, su contenido debe ser mayor que la
palabra izquierda (DX) del dividendo; si el divisor es una palabra doble, su contenido debe ser
mayor que la palabra doble izquierda (EDX) del dividendo. Veamos un ejemplo que utiliza 1
como divisor, aunque tambin pueden servir otras cifras:
LA OPERACIN DIVIDE
DIVIDENDO
DIVISOR
COCIENTE
0123
01
(1)23
0001 4026
0001
(1)4026
En ambos casos, el cociente generado excedera su espacio disponible. Puede ser prudente incluir
una prueba antes de las operaciones DIV o IDIV, como se muestra en los dos ejemplos siguientes.
En el primero, DIVBYTE es un divisor de un byte, y el dividendo ya est en el AX:
CMP
AH, DIVBYTE
JNB
Rutina-desbordamiento
DIV
DIVBYTE
DX,DIVWORD
JNB
Rutina-desbordamiento
DIV
DIVWORD
Para IDIV, la lgica debe tener en cuenta que el dividendo o el divisor pueden ser negativos.
Ya que el valor absoluto del divisor debe ser el menor de los dos, puede utilizar la instruccin
NEG para convertir temporalmente un nmero negativo en positivo y despus de la divisin restaurar el signo.
Divisin por medio de restas
Si un cociente es demasiado grande para el divisor, puede realizar la divisin por medio de restas
sucesivas. Esto es, restar el divisor del dividendo, incrementar en uno el cociente y continuar
Aritmtica: I P r o c e s a m i e n t o d e d a t o s b i n a r i o s
236
Capitulo 13
restando hasta que el dividendo sea menor que el divisor. En el ejemplo siguiente, el dividendo
est en el AX, el divisor est en el BX y el cociente se desarrolla en el CX:
C20 :
C3 0 :
SB
CX, CX
;Inicia
CMP
AX, BX
;Si
JB
C3 0
SUB
AX, BX
,-Restar
INC
CX
/Sumar
JMP
C2 0
/Repetir
RET
el
dividendo
entonce
,-El
cociente
<
en
cero
divisor,
salir
el
uno
divisor
al
cociente
del
dividendo
cociente
est
en
CX,
el
residuo
Al final de la rutina, el CX contiene el cociente y el AX, el residuo. Con toda intencin el ejemplo
es muy simple para demostrar slo la tcnica. Si el cociente est en la pareja DX:AX, incluya
estas dos operaciones:
1. En C20, comparar AX con BX slo si DX es cero.
2. Despus de la instruccin SUB, insertar SBB DX,00.
Observe que un cociente muy grande y un divisor muy pequeo pueden provocar que se
realicen miles de ciclos a un gran costo en tiempo de procesamiento.
SHR
AX,oi
MOV
CL,03
SHR
AX,CL
SHR
CL,03 ,-80286
,-8088/8086
y posteriores
CX.04
SAR
DX,01
RCR
AX.01
LOOP
D2 0
Inicializa
para
Corrimiento
Rota
el
Repite
AX
del
a
la
cuatro
DX
derecha
ciclos
237
NEG
{registro/memoria}
AX
15 bits
NEG
BL
8 bits
NEG
BINAMT
NEG
ECX
32 bits
Invertir el signo de un nmero de 32 (o ms) bits implica ms pasos. Suponga que el par
DX:AX contiene un nmero binario de 32 bits. NEG no puede actuar sobre el par DX:AX de
manera concurrente, y usarla en ambos registros significara sumar 1 a ambos. En lugar de eso,
utilice NOT para cambiar los bits, utilice ADD y ADC para sumar el uno para el complemento a dos:
NOT
DX
NOT
AX
ADD
AX, 1
Suma 1 al AX
ADC
DX,0
Queda un problema menor: todo est muy bien para realizar aritmtica con datos binarios
que el programa se define o con datos que ya estn en forma binaria den un archivo de disco. Sin
embargo, los datos que introduce un programa desde una terminal estn en formato ASCII. Aunque los datos ASCII son adecuados para desplegar e imprimir informacin, requieren de un ajuste
especial para la aritmtica, un tema que se estudia en el captulo siguiente.
238
Captulo 1 3
exponente
79
mantisa
78
64
63
nmero
15
2.
14
nmero
31
30
nmero
62
31
mantisa
exponente
s
30
23
22
6.
mantisa
exponente
62
52
51
mantisa
exponente
78
64
63
Preguntas
239
7.
79
ceros
78
mantisa
72
71
Los tipos 1, 2 y 3 son los formatos comunes de binarios en complemento a dos. Los tipos 4,
5 y 6 representan nmeros de punto flotante. El tipo 7 contiene 18 dgitos decimales de 4 bits cada
uno. Puede cargar cualquiera de estos formatos desde memoria a un registro del coprocesador y
almacenar el contenido de un registro en la memoria. Sin embargo, el coprocesador convierte para
sus clculos todos los formatos en sus registros a real temporal. Los datos estn almacenados en
memoria en secuencia inversa de byte.
El procesador solicita una operacin especfica y enva datos numricos al coprocesador,
que realiza la operacin y regresa el resultado. Para ensamblar, utilice la directiva .80x86 apropiada.
La instruccin INT 11H puede ayudar a determinar la presencia de un coprocesador. La
operacin enva el estado del equipo al AX, en donde un bit en 1 significa que est presente un
coprocesador.
PUNTOS CLAVE
Los nmeros con signo mximos para acumuladores de un byte son + 1 2 7 y - 1 2 8 .
Para sumar en varias palabras mltiples, utilice ADC para tomar en cuenta cualquier acarreo
de un ADD anterior. Si la operacin se realiza dentro de un ciclo, utilice CLC para inicializar
la bandera de acarreo en cero.
Utilice M U L para datos sin signo e IMUL para datos con signo.
Con M U L , si un multiplicador est definido como un byte, el multiplicando es AL; si el
multiplicador es una palabra, el multiplicando es AX; si el multiplicador es una palabra
doble, el multiplicando es EAX.
Utilice corrimiento a la izquierda (SHL o SAL) para multiplicar por potencias de 2.
Utilice DIV para datos sin signo e IDIV para datos con signo.
En la divisin tenga cuidado especial del desbordamiento. El divisor debe ser mayor que
el contenido del AH si el divisor es un byte, que el DX si el divisor es una palabra, o que el
EDX si el divisor es una palabra doble.
Con DIV, si el divisor est definido como un byte, el dividendo es AX; si el divisor es una
palabra, el dividendo es DX: AX; si el divisor es una palabra doble, el dividendo es EDX:EAX.
Utilice corrimiento a la derecha para dividir entre potencias de 2:SHR para campos sin
signo y SAR para campos con signo.
PREGUNTAS
13-1.
(a) Cules son los nmeros mximos en un byte para datos con signo y para datos sin signo? (b)
Cul es el nmero mximo en una palabra para datos con signo y sin signo?
13-2. Escriba la diferencia entre un acarreo y un desbordamiento.
Aritmtica: I P r o c e s a m i e n t o d e d a t o s b i n a r i o s
240
Captulo 1 3
Las preguntas 13-3 hasta la 13-7 se refieren a los datos siguientes, con palabras definidas en orden inverso:
DATAX
DATAY
DATAZ
13-3.
13-4.
DW
0148H
DW
2316H
DW
0237H
DW
4052H
DW
DW
DW
Codifique las instrucciones para sumar lo siguiente: (a) la palabra DATAX a la palabra DATAY; (b)
la palabra doble que empieza en DATAX a la palabra doble en DATAY.
Explique el efecto de las instrucciones siguientes relacionadas:
STC
MOV
BX, D A T A X
ADC
BX, D A T A Y
13-5. Codifique las instrucciones para multiplicar (MUL) lo siguiente: (a) la palabra DATAX por la palabrz
DATAY; (b) la palabra doble que empieza en DATAX por la palabra doble en DATAY. Almacene e
producto en DATAZ.
13-6. Adems del cero, qu divisores provocan un error por desbordamiento?
13-7. Codifique las instrucciones para dividir (DIV) lo siguiente: (a) la palabra DATAX entre 23; (b) h
palabra doble que empieza en DATAX entre la palabra DATAY.
13-8. Corrija el programa de la figura 13-2 de modo que la rutina sume tres pares de palabras en lugar di
dos. Ponga por nombre WORD3 y WORD3B, a las palabras adicionales.
13-9. Refirase a la seccin "Multiplicacin por corrimiento". La segunda parte contiene un mtodo m;
eficiente de corrimiento a la izquierda de cuatro bits. Corrija el ejemplo para un corrimiento a 1
derecha de cuatro bits.
CAPTULO 14
Aritmtica: IIProcesamiento
de datos ASCII y BCD
OBJETIVO
Examinar los formatos de datos A S C I I y B C D para realizar aritmtica, y estudiar las conversiones entre estos formatos y el
binario.
INTRODUCCIN
En las computadoras el formato natural para la aritmtica es el binario. Como se vio en el captulo
13, el formato binario no causa mayores problemas, siempre y cuando el programa defina sus
datos. Sin embargo, para muchos propsitos, los datos numricos se introducen desde el teclado
como caracteres ASCII, en formato de base 10. De manera similar, el despliegue de valores
numricos en la pantalla es en formato ASCII.
Un formato relacionado, decimal codificado en binario (BCD), tiene uso ocasional y aparece como desempaquetado y empaquetado. La PC proporciona varias instrucciones que facilitan la
aritmtica sencilla y la conversin entre formatos. Este captulo tambin trata las tcnicas para
la conversin de datos ASCII a binario para aplicar la aritmtica, as como las tcnicas para
convertir los resultados binarios de regreso a formato ASCII para su visualizacin. El programa
final del captulo combina mucho del material que se ha estudiado en los captulos 1 a 13.
Si ha programado en un lenguaje de alto nivel, como C, usted est acostumbrado a que el
compilador tome en cuenta el punto base (decimal o binario). Sin embargo, la computadora no
reconoce un punto base en un campo aritmtico, as que como programador tiene que tener en
cuenta su posicin.
241
242
Captulo 14
DATOS EN F O R M A T O DECIMAL
Hasta este punto, hemos manejado valores numricos en formatos binario y ASCII. El sistema de
la PC tambin permite usar formato decimal codificado en binario (BCD), que facilita algunas
operaciones aritmticas limitadas. Dos usos del formato BCD son:
1. EL BCD permite un redondeo apropiado de nmeros sin prdida de precisin, una
caracterstica que es particularmente til para manejo de cantidades monetarias (pesos y
centavos). (El redondeo de nmeros binarios que representan pesos y centavos puede provocar
una prdida en la precisin.)
2. Con frecuencia es ms sencillo realizar aritmtica con nmeros pequeos introducidos desde
el teclado o que son escritos en la pantalla o en la impresora.
Un dgito BCD consiste en cuatro bits que pueden representar los dgitos decimales desde el
0 hasta el 9:
Binario
Dgito BCD
Binario
Dgito BCD
0000
0001
0010
0011
0
1
2
3
0101
0110
0111
1000
5
6
7
8
0100
1001
243
AAA
[etiqueta:]
AAS
sumar
Estas instrucciones estn codificadas sin operandos y ajustan de manera automtica un valor
ASCII que se encuentre en el registro AX. El ajuste ocurre porque un nmero ASCII representa
un nmero de base 10 desempaquetado, mientras que el procesador realiza aritmtica en base dos.
Suma ASCII
Considere el efecto de sumar los nmeros ASCII 8 (38H) y 4 (34H):
38
34
hex
hex
6C
hex
igual a 006CH
AAA
igual a 0102H
Ya que el dgito hexadecimal en la extrema derecha del AL es C, AAA suma 6 al AL, suma 1 al
AH, pone en uno las banderas de acarreo y de acarreo auxiliar y pone en cero el dgito hexadecimal
en la extrema izquierda del AL. El resultado en el AX ahora es 0102H.
Para restaurar la representacin ASCII, slo inserte 3 en los dgitos hexadecimal en la
extrema izquierda del AH y del AL para obtener 3132H o 12 decimal:
OR
AX.3030H
Todo esto est muy bien para sumar nmeros ASCII de un byte. Sin embargo sumar nmeros ASCII de varios bytes necesita un ciclo que procese de derecha a izquierda (de orden bajo a
Aritmtica: I I P r o c e s a m i e n t o d e d a t o s A S C I I y B C D
244
TITLE
BEGIN:
P 1 4 A S C A D (COM)
Suma
.MODEL SMALL
. CODE
ORG
100H
JMP
SHORT MAIN
de nmeros
ASCI
ASC2
ASCSUM
DB
DB
DB
'578'
'694 '
'0000'
MAIN
PROC
CLC
LEA
LEA
LEA
MOV
NEAR
MOV
MOV
ADC
AAA
MOV
DEC
DEC
DEC
LOOP
MOV
A H , 00
A L , [SI]
A L , [DI]
[BX] , A L
SI
DI
BX
A2 0
[BX] , A H
R e a l i z a el ciclo 3 v e c e s
,-Al f i n a l , a l m a c e n a e l a c a r r e o
LEA
MOV
BX,ASCSUM+3
CX, 04
;Convierte
a ASCII
OR
DEC
LOOP
MOV
INT
ENDP
END
B Y T E P T R [ B X ] ,3 OH
BX
A3 0
AX,4C00H
21H
Captulo 1 4
ASCII
;Datos
SI,ASCl+2
DI,ASC2+2
BX, A S C S U M + 3
C X , 03
Limpia bandera de
Inicializacin de
nmeros ASCII
acarreo
;I n i c i a l i z a c i n d e
ciclos
A20 :
Limpia el AH
Carga un byte ASCII
Suma
(con a c a r r e o )
Ajusta para ASCII
Almacena la suma
ASCSUM
A30 :
MAIN
,-Realiza
;Sale al
el c i c l o
DOS
veces
BEGIN
alto) y tome en cuenta los acarreos. El cdigo en la figura 14-1 suma dos nmeros ASCII de tres
bytes cada uno, ASCI y ASC2, y produce una suma de cuatro bytes, ASCSUM. Observe los
puntos siguientes:
Una instruccin CLC al empezar inicializa la bandera de acarreo en cero.
A continuacin en A20, ADC es utilizada para sumar ya que un ADD puede provocar un
acarreo que debe ser aadido al siguiente byte (de la izquierda).
Una instruccin MOV limpia el AH en cada ciclo, ya que cada AAA puede sumar uno al
AH. Sin embargo, ADC toma en cuenta cualquier acarreo. Note que el uso de XOR o SUB
para limpiar el AH cambiara la bandera de acarreo.
Cuando el ciclo se ha completado, la rutina mueve el AH (que contiene un 00 final o 01) al
byte en la extrema izquierda de ASCSUM.
Al final, ASCSUM contiene 01020702H. Para insertar el 3 ASCII en cada byte, el programa
pasa a travs de ASCSUM en memoria y realiza un OR en cada byte con 30H. El resultado
es 31323732H o 1272 decimal.
245
AL,[DI]
AAA
PUSHF
OR
AL.30H
;Inserta el 3 ASCII
POPF
MOV
;Restaura
[BX] , AL
las banderas
,-Almacena la suma
Resta ASCII
La instruccin AAS funciona igual que AAA. El AAS verifica el dgito hexadecimal (cuatro bits)
de ms a la derecha del AL. Si el dgito est entre A y F o la bandera auxiliar de acarreo est en
uno, la operacin resta 6 del AL, resta uno del AH y pone en uno las banderas auxiliar (AF) y de
acarreo (CF). En todos los casos, AAS pone en cero el dgito de ms a la izquierda del AL.
Los dos ejemplos siguientes suponen que ASCI contiene 38H y ASC2 contiene 34H. El primer
ejemplo resta ASC2 (34H) de ASCI (38H). AAS no necesita hacer un ajuste, ya que el dgito de
la derecha es menor que A:
AX
AF
MOV
AL, ASCI
,-003 8
SUB
AL,ASC2
;0004
,-0004
AAS
OR
AL,30H
;0034
El segundo ejemplo resta ASCI (38H) de ASC2 (34H). Como el dgito de ms a la derecha
es C hex, AAS resta 6 del AL, resta uno del AH y pone en uno las banderas AF y CF. La
respuesta, que debe ser - 4 , es FF06H, su complemento a 10, que tiene valor pequeo:
AX
MOV
AL,ASC2
,-0034
SUB
AL,ASCI
;00FC
AAS
AF
;FF0 6 1
Aritmtica: I I P r o c e s a m i e n t o d e d a t o s A S C I I y B C D
246
[etiqueta:]
AAM
/Ajusta
ASCII despus
[etiqueta:]
AAD
/Ajusta
ASCII antes
de
de
Captulo 1 4
multiplicar
dividir
Multiplicacin ASCII
La instruccin AAM corrige el resultado de la multiplicacin de datos ASCII en el registro AX.
Sin embargo, usted primero debe limpiar el 3, de cada byte, en el dgito hexadecimal de ms a la
izquierda, as se convierte el valor en BCD desempaquetado. Por ejemplo, el nmero ASCII
31323334 se convierte en 01020304 como BCD desempaquetado. Tambin, ya que el ajuste no es
sino de un byte a la vez, slo puede multiplicar campos de un byte y tiene que realizar la operacin
de forma repetida en un ciclo. Slo utilice la operacin MUL, no la operacin IMUL.
AAM divide el AL entre 10 (OAH) y almacena el cociente en el AH y el residuo en el AL.
Por ejemplo, suponga que el AL contiene 35H y el CL contiene 39H. El cdigo siguiente multiplica el contenido del AL por el de CL y convierte el resultado a formato ASCII:
INSTRUCCIN
COMENTARIO
AX
CL
09
AND
CL.0FH
/Convierte
CL
09
0035
AND
AL, OFH
/Convierte
AL
05
0005
MUL
CL
/Multiplica
AAM
OR
A X . 3 03 0 H
AL
por
/Convierte
BCD
/Convierte
ASCII
CL
desempaquetado
002D
0405
3435
La operacin M U L genera 45 (002DH) en el AX. AAM divide este nmero entre 10, generando
un cociente de 04 en el AH y un residuo de 05 en el AL. Despus, la instruccin OR convierte el
valor BCD desempaquetado a formato ASCII.
La figura 14-2 describe la multiplicacin de un multiplicando de cuatro bytes por un
multiplicador de un byte. Ya que AAM tiene capacidad para operaciones con un byte, la rutina
pasa por el multiplicando un byte a la vez, de derecha a izquierda. Al final, el producto BCD
desempaquetado es 0108090105, que un ciclo convierte a un formato real ASCII como 3138393135,
o 18,915 decimal.
Si el multiplicador es mayor que un byte, tiene que proporcionar otro ciclo ms que pase por
el multiplicador. Puede ser ms sencillo convertir el dato ASCII a formato binario, como se
estudia en una seccin posterior.
Divisin ASCII
La instruccin AAD proporciona una correccin de un dividendo ASCII antes de hacer la divisin. Igual que con AAM, primero usted debe limpiar los 3 de la izquierda de los bytes ASCII
para crear un formato BCD desempaquetado. ADD permite un dividendo de dos bytes en el AX.
El divisor slo puede ser un nico byte con 01 a 09.
Suponga que el AX contiene el valor ASCII 28 (3238H) y el CL contiene al divisor, 7
ASCII (37H). Las instrucciones siguientes realizan el ajuste y la divisin:
BEGIN:
P14ASCMU (COM)
.MODEL SMALL
.CODE
ORG
100H
JMP
MAIN
247
M u l t i p l i c a c i n de nmeros ASCII
MULTCND DB
MULTPLR DB
PRODUCT DB
3783'
5
5 DUP(O)
MAIN
PROC
MOV
LEA
LEA
AND
NEAR
CX, 04
SI,MULTCND+3
DI,PRODUCT+4
MULTPLR, OFH
MOV
AND
MUL
AAM
ADD
AAA
MOV
DEC
MOV
DEC
LOOP
A L , [SI]
AL,OFH
MULTPLR
[DI] , A L
DI
[DI] , A H
SI
A2 0
LEA
MOV
BX,PRODUCT+4
CX, 05
Convierte
a ASCII
OR
DEC
LOOP
MOV
INT
ENDP
END
Datos
Inicializa 4
ciclos
/Limpia el 3 ASCII
A20 :
Carga el carcter ASCII
Limpia el 3 ASCII
Multiplica
A j u s t a para ASCII
Suma para
almacenar
el producto
A L , [DI]
PRODUCT
A30 :
MAIN
BEGIN
COMENTARIO
AX
AND
CL,0FH
AND
AX,0F0FH
0208
Convierte a binario
001C
Divide entre 7
0004
AAD
DIV
CL
3 23 8
CL
07
Aritmtica: I I P r o c e s a m i e n t o d e d a t o s A S C I I y B C D
248
TITLE
de
BEGIN:
P 1 4 A S C D V (COM)
Divisin
.MODEL SMALL
. CODE
ORG
100H
JMP
SHORT MAIN
nmeros
DIVDND
DIVSOR
QUOTNT
DB
DB
DB
'3698'
4'
4 DUP(0)
/Datos
MAIN
PROC
MOV
SUB
AND
LEA
LEA
NEAR
CX,04
AH, A H
DIVSOR,OFH
SI,DIVDND
DI,QUOTNT
Capitulo 14
ASCII
A20 :
MAIN
LODSB
AND
AAD
DIV
STOSB
LOOP
INT
ENDP
END
AL,OFH
DIVSOR
A2 0
21H
DOS
BEGIN
Figura 14-3
Divisin ASCII
[etiqueta:]
DAA
/Ajuste
decimal
despus
de
la
suma
[etiqueta:]
DAS
/Aj u s t d e c i m a l
despus
de
la
resta
DAA corrige el resultado de la suma de dos nmeros BCD empaquetados en el AL, y DAS
corrige el resultado de su resta. Una vez ms, tiene que procesar los campos un byte a la vez.
El programa en la figura 14-4 ejemplifica la suma BCD. El procedimiento B10CONV
convierte los nmeros ASCII ASCI y ASC2 a nmeros BCD empaquetados BCD1 y BCD2,
respectivamente. El procesamiento, que es de derecha a izquierda, podra ser tan fcil de izquierda a derecha. Tambin el procesamientotle palabras es ms fcil que el procesamiento de bytes,
ya que necesita dos bytes ASCII para generar un byte BCD empaquetado. Sin embargo, el uso de
palabras requiere de un nmero par de bytes en el campo ASCII.
El procedimiento C10ADD realiza un ciclo tres veces para sumar los nmeros BCD empaquetados a BCDSUM. El total final es 00127263.
249
BEGIN:
P14BCDAD (COM)
Conversin de ASCII a BCD y suma
.MODEL
SMALL
.CODE
ORG
100H
SHORT MAIN
JMP
ASCI
ASC2
BCD1
BCD2
BCDSUM
DB
DB
DB
DB
DB
'057836
'069427'
'000'
000'
4 DUP(0)
MAIN
PROC
LEA
LEA
CALL
LEA
LEA
CALL
CALL
MOV
INT
ENDP
NEAR
SI,ASCl+4
DI,BCDl+2
B10CONV
SI,ASC2+4
DI,BCD2+2
B10CONV
C10ADD
AX,4C00H
21H
TITLE
MAIN
Convierte
B10CONV
PROC
MOV
MOV
;DatOS
;Inicializa
ASCI
ASCII a BCD
CL, 04
DX, 03
,-Factor de corrimiento
/Nm. de palabras a convertir
AX, [SI]
AH, AL
AL, CL
AX, CL
[DI] , AH
SI
SI
DI
DX
B20
B20 :
B10CONV
10ADD
MOV
XCHG
SHL
SHL
MOV
DEC
DEC
DEC
DEC
JNZ
RET
ENDP
PROC
XOR
LEA
LEA
LEA
MOV
CLC
/Corrimiento de
/ 3 ASCII
/Almacena los dgitos BCD
AH, AH
SI,BCD1+2
DI.BCD2+2
BX,BCDSUM+3
CX, 03
/Limpia el AH
, Inicializa
/ direcciones de
/ BCD
/campos de 3 bytes
C20 :
C10ADD
MOV
ADC
DAA
MOV
DEC
DEC
DEC
LOOP
RET
ENDP
END
AL, [SI]
AL, [DI]
[BX] , AL
SI
DI
BX
C2 0
BEGIN
Figura 14-4
250
Captulo 14
4 x 1
3 x 10
2 x 100
1 x 1000
Total:
=
=
=
=
Hexadecimal
Producto
Paso
4
30
200
1000
4 X 01H
3 x OAH
2 x 64H
1 x 3E8H
1234
04D2H
Producto
=
=
=
=
4H
1EH
C8H
3E8H
Verifique que la suma 04D2H sea en realidad igual a 1234 decimal. En la figura 14-5, el programa convierte el nmero ASCII 1234 a su equivalente binario. Una instruccin LEA inicializa la
direccin del byte ms a la derecha del campo ASCII, A S C V A L + 3 , en el registro SI. La instruccin en B20 que mueve el byte ASCII al AL es
MOV AL,
[SI]
Corrimiento y redondeo
TITLE
251
BEGIN:
P14ASCBI (COM)
Conversin de formato ASCII a binario
.MODEL SMALL
.CODE
ORG
100H
JMP
SHORT MAIN
ASCVAL
BINVAL
ASCLEN
MULT10
DB
DW
DW
DW
1234'
0
4
1
MAIN
PROC
MOV
MOV
LEA
NEAR
BX, 10
CX, 04
SI,ASCVAL+3
MOV
AND
MUL
ADD
MOV
MUL
MOV
DEC
LOOP
MOV
INT
ENDP
END
AL, [SI]
AX,000FH
MULT10
BINVAL,AX
AX.MULT10
BX
MULT10,AX
SI
B20
AX,4C0OH
21H
Datos
Procedimiento principal
Factor de multiplicacin
Contador del ciclo
Direccin de ASCVAL
B20 :
MAIN
BEGIN
Figura 14-5
que slo puede ser del 0 al 9, generan de manera sucesiva el nmero ASCII. Como un ejemplo,
convierta 4D2H de regreso a formato decimal:
DIVIDE ENTRE 10
COCIENTE
RESIDUO
A ! 4D2
7B
A 7B~~
A fC
Como el cociente (1) ahora es menor que el divisor (OAH) la operacin est terminada. Los
residuos, junto con el ltimo cociente, forman el resultado BCD, de derecha a izquierda: 1234.
Todo lo que resta por hacer es almacenar estos dgitos en memoria, con los 3 ASCII, como
31323334.
El programa de la figura 14-6 convierte el nmero binario 04D2H a formato ASCII. La
rutina divide el nmero binario de manera sucesiva entre 10, hasta que el cociente que queda sea
menor que 10 (OAH) y almacena los dgitos hexadecimales generados en formato ASCII como
31323334. Si no completamente divertido, puede encontrar til reproducir este programa y rastrear su ejecucin paso por paso.
CORRIMIENTO Y REDONDEO
Suponga que usted est redondeando a dos decimales un producto que contiene tres posiciones
decimales. Si el producto es 12.345, sume 5 a la posicin decimal de ms a la derecha y recorra
un dgito a la derecha:
252
TITLE
BEGIN:
P 1 4 B I N A S (COM)
Conversin
.MODEL
SMALL
.CODE
ORG
100H
JMP
SHORT MAIN
ASCVAL
BINVAL
DB
DW
4 DUP(
04D2H
MAIN
PROC
MOV
LEA
MOV
NEAR
CX,0010
SI,ASCVAL+3
AX,BINVAL
Procedimiento
principal
Factor de divisin
Direccin de ASCVAL
Obtiene campo binario
CMP
JB
XOR
DIV
OR
MOV
DEC
JMP
AX, CX
C3 0
DX.DX
CX
DL,30H
[SI] , D L
SI
C20
El n m e r o es m e n o r a 10?
s, e n t o n c e s salir
Limpiar el cociente superior
Divide entre 10
OR
MOV
MOV
INT
ENDP
END
AL,30H
[SI] , A L
AX.4C00H
21H
de
formato
binario
Captulo 14
ASCII
Datos
C20 :
Almacena
el
carcter
ASCII
C30 :
MAIN
BEGIN
Figura 14-6
Producto:
12.345
Sumar 5 :
+5
Producto redondeado:
12.350 = 12.35
12.34555
50
12.3505 = 12.35
500
12.35055 = 12.35
Adems, un nmero con seis lugares decimales necesita sumar 5,000 y recorrer cuatro
dgitos, y as sucesivamente. Ahora, ya que por lo regular una computadora procesa datos binarios,
12.345 aparece como 3039H. Sumando 5 a 3039H da 303EH, o 12350 en formato decimal. Hasta
ahora todo va bien. Pero, del corrimiento de un dgito binario resulta 181FH, o 6175, de hecho el
corrimiento slo divide entre dos al nmero. Nosotros necesitamos un corrimiento que sea equivalente a recorrer a la derecha un dgito decimal. Puede realizar este corrimiento dividiendo el
valor redondeado entre 10, o A hex: 303E hex dividido entre A hex = 4D3H, o 1235 decimal. La
conversin de 4D3H a un nmero decimal da 1235. Ahora slo inserte un punto decimal en la
posicin correcta y puede desplegar un valor redondeado como 12.35.
De esta manera, puede redondear y recorrer cualquier nmero binario. Para tres lugares
decimales, sume 5 y divida entre 10, para cuatro lugares decimales, sume 50 y divida entre 100.
253
Tal vez haya notado un patrn: el factor de redondeo (5, 50, 500, etc.) siempre es la mitad del
factor de corrimiento (10, 100, 1,000, etctera).
Por supuesto, el punto decimal en un nmero binario es implicado y en realidad no est presente.
P R O G R A M A P A R A C O N V E R T I R D A T O S ASCII
El programa de la figura 14-7 permite a los usuarios ingresar el nmero de horas trabajadas y el
sueldo por hora de los empleados y despliega el salario calculado. Por brevedad, el programa
omite algunas verificaciones de error que de otra forma seran incluidas. Los procedimientos son
como sigue:
B10INPT
Desde el teclado, acepta horas y sueldo por hora en formato ASCII. Estos
valores pueden tener punto decimal.
Inicializa la conversin de horas ASCII a binario.
Inicializa la conversin del sueldo ASCII a binario
Realiza la multiplicacin, redondeo y corrimiento. Un salario con cero, uno
D10HOUR
E10RATE
F10MULT
TITLE
page 60,132
P14SCREMP (EXE)
.MODEL SMALL
.STACK 64
LEFCOL
RITCOL
TOPROW
BOTROW
.DATA
EQU
EQU
EQU
EQU
HRSPAR
MAXHLEN
ACTHLEN
HRSFLD
LABEL
DB
DB
DB
BYTE
6
RATEPAR
MAXRLEN
ACTRLEN
RATEFLD
LABEL
DB
DB
DB
BYTE
6
p
6 DUP(?)
MESSG1
MESSG2
MESSG3
ASCWAGE
MESSG4
DB
DB
DB
DB
DB
'Horas trabajadas
'Sueldo por hora
'Salario =
10 D U P ( 3 0 H ) , 13, ;10, '$
'Presione cualquier tecla para
ADJUST
BINVAL
BINHRS
BINRATE
COL
DECIND
MULT10
NODEC
ROW
SHIFT
TENWD
DW
DW
DW
DW
DB
DB
DW
DW
DB
DW
DW
BEGIN
28
52
10
14
despl
Equivalencia para la p;
, Lista de parmetros de
;.
6 DUP(?)
;Lista de parmetros de
;
;
<
continuar
;Datos
00
00
00
00
00
01
00
00
10
.CODE
PROC
MOV
MOV
MOV
CALL
FAR
AX,@data
DS, AX
ES, AX
Q10SCR
Figura 14-7
,-Inicializa los
, registros DS y ES
;Limpia
la pantalla
Aritmtica: I I P r o c e s a m i e n t o d e d a t o s A S C I I y B C D
254
Captulo 1 4
A20LOOP:
BEGIN
CALL
CALL
CALL
CALL
CALL
CALL
CALL
CALL
CALL
CMP
JNE
Q15WIN
Q20CURS
B10INPT
D10HOUR
ElORATE
F10MULT
G10WAGE
K10DISP
L10PAUS
AL,1BH
A20LOOP
CALL
MOV
INT
ENDP
Q10SCR
AX,4C00H
21H
Ingreso
B10INPT
PROC
MOV
MOV
CALL
INC
MOV
LEA
INT
MOV
LEA
INT
MOV
CALL
INC
MOV
LEA
INT
MOV
LEA
INT
RET
B10INPT
Limpia la ventana
Coloca el cursor
A c e p t a las horas y el sueldo por
Convierte las horas a binario
C o n v i e r t e el s u e l d o a b i n a r i o
Calcula el salario,
redondeado
Convierte salario a ASCII
Despliega el salario
Pausa para el usuario
Presion Esc?
no, entonces continuar
s, e n t o n c e s fin de la e n t r a d a
Limpia la pantalla
Sale al DOS
de
D10HOUR
sueldo
por
,-Coloca
AH,09H
DX,MESSG1
21H
AH, OAH
DX, HRSPAR
21H
COL.LEFCOL+3
Q20CURS
ROW
AH,09H
DX,MESSG2
21H
AH, OAH
DX,RATEPAR
21H
el
/Indicacin
/Acepta
el
/Designa
cursor
del
el
nmero
nmero
la
/Indicacin
/Acepta
hora
de
de
horas
horas
columna
del
sueldo
sueldo
por
por
hora
hora
ENDP
PROC
MOV
MOV
SUB
LEA
ADD
CALL
MOV
MOV
RET
las
horas:
NEAR
NODEC,0 0
CL,ACTHLEN
CH,CH
SI,HRSFLD-1
SI,CX
M10ASBI
AX,BINVAL
BINHRS,AX
/Designa la posicin
/
de h o r a s
/Convierte a binario
derecha
ENDP
Procesa
E10RATE
NEAR
ROW,TOPROW+l
COL,LEFCOL+3
Q2 0CURS
ROW
Procesa
D10HOUR
horas
PROC
MOV
SUB
LEA
ADD
CALL
MOV
MOV
RET
el
sueldo
NEAR
CL, A C T R L E N
CH,CH
SI,RATEFLD-1
SI,CX
M10ASBI
AX,BINVAL
BINRATE, AX
Figura 14-7
por
hora:
(continuacin)
hora
ENDP
Multiplica,
F10MULT
redondea y recorre:
PROC
NEAR
MOV
CX, 05
LEA
DI.ASCWAGE
MOV
AX,3030H
CLD
REP STOSW
MOV
MOV
MOV
CMP
JA
DEC
DEC
JLE
MOV
MOV
SHIFT,10
ADJUST,00
CX,NODEC
CL, 06
F4 0
CX
CX
F30
NODEC,02
AX, 01
MUL
LOOP
MOV
SHR
MOV
TENWD
F20
SHIFT,AX
AX, 1
ADJUST,AX
MOV
MUL
ADD
ADC
CMP
JB
AX,BINHRS
BINRATE
AX, ADJUST
DX, 0 0
DX,SHIFT
SUB
JMP
AX,AX
F70
CMP
JZ
DIV
SUB
RET
ENDP
ADJUST,00
F80
SHIFT
DX,DX
;Si hay ms de 6
,- decimales, error
,-Si hay 0,
1, 2 decimales, saltar
F20 :
;Calcula el
factor de corrimiento
F30 :
,-Calcula el salario
/Redondea el salario
;El p r o d u c t o es muy grande
; para DIV?
F50
F40 :
F50 :
F70 :
F80 :
F10MULT
Se requiere corrimiento?
no, entonces saltar
/Corrimiento de salario
,-Limpiar el residuo
Conversin a A S C I I
G10WAGE
PROC
LEA
MOV
ADD
NEAR
SI,ASCWAGE+7
BYTE PTR [SI] , i
SI,NODEC
CMP
JNE
DEC
BYTE P T R [ S I ] ,
G4 0
SI
Si est en la p o s i c i n dec,
CMP
JNZ
CMP
JB
DX, 00
G50
AX,0010
G60
DIV
OR
MOV
DEC
SUB
JMP
TNWD
DL,30H
[SI] , DL
SI
DX.DX
G30
G30 :
enton
G4 0 :
operacin terminada
G50 :
/El residuo es un dgito ASCII
/Almacenar el
/Limpiar el
Figura 14-7
carcter ASCII
residuo
(continuacin)
Aritmtica: I I P r o c e s a m i e n t o d e d a t o s A S C I I y B C D
256
Captulo 141
G 6 0 :
G10WAGE
OR
MOV
RET
ENDP
Despliega
K10DISP
/Almacena el ltimo
/
carcter ASCII
AL,30H
[SI] , A L
el
salario:
PROC
MOV
CALL
MOV
LEA
NEAR
COL,LEFCOL+3
Q20CURS
CX, 09
SI,ASCWAGE
CMP
JNE
BYTE
K3 0
P T R [SI] , 3 0 H
MOV
INC
LOOP
BYTE
SI
K2 0
PTR[SI],20H
MOV
'LEA
INT
RET
ENDP
AH,09H
DX,MESSG3
21H
K20:
/Designa
la
/Elimina
los
columna
ceros
cambindolos
iniciales
por blancos
K30 :
K10DISP
Pausa
LIOPAUS
PROC
MOV
MOV
CALL
MOV
LEA
INT
MOV
INT
RET
ENDP
para
el
de
/Coloca
el
cursor
/Despliega
/Peticin
ASCII
PROC
MOV
MOV
MOV
SUB
NEAR
MULT10,0001
BINVAL,0 0
DECIND,00
BX, BX
MOV
CMP
JNE
MOV
JMP
A L , [SI]
AL, .'
M4 0
DECIND,01
M90
AND
MUL
ADD
MOV
MUL
MOV
CMP
JNZ
INC
AX,0OOFH
MULT10
BINVAL,AX
AX.MULT10
TENWD
MULT10,AX
DECIND,0 0
M90
BX
DEC
LOOP
CMP
JZ
ADD
SI
M2 0
DECIND, 00
M100
NODEC,BX
despliegue
usuario:
NEAR
COL,20
ROW,22
Q2 0CURS
A H , 0 9H
DX,MESSG4
21H
AH,10H
1SH
Convierte
M10ASBI
/Peticin
;Salario
pausa
de
despliegue
binario:
M20 :
1
M40 :
lleg
s,
al
punto
entonces
decimal?
sumar
la
cuenta
M90 :
Figura 14-7
(continuacin)
RET
ENDP
Recorre toda la pantalla:
Q10SCR
Q10SCR
PROC
MOV
MOV
SUB
MOV
INT
RET
ENDP
NEAR
AX, OSOOH
BH,3 OH
CX,CX
DX,184FH
10H
,-Atributo
Q15WIN
PROC
MOV
MOV
MOV
MOV
MOV
MOV
INT
RET
ENDP
NEAR
AX,0605H
BH,1SH
CH,TOPROW
CL,LEFCOL
DH,BOTROW
DL,RITCOL
10H
;Cinco renglones
, Atributo
Coloca el cursor:
Q2 0CRS
Q2 0CURS
PROC
MOV
SUB
MOV
MOV
INT
RET
ENDP
END
NEAR
AH,02H
BH, BH
DH.ROW
DL,COL
10H
;Designa el rengln
/Designa la columna
BEGIN
Figura 14-7
(continuacin)
Aritmtica: I I P r o c e s a m i e n t o d e d a t o s A S C I I y B C D
258
Captulo 1 4
PUNTOS CLAVE
Un campo ASCII necesita un byte para cada carcter. Para un campo numrico, la mitad
derecha del byte contiene el dgito y la mitad izquierda un 3.
Cambiando los 3 ASCII a ceros se convierte el campo a formato decimal codificado en
binario (BCD) desempacado.
Comprimir los caracteres ASCII a dos dgitos por byte convierte el campo a dato decimal
codificado en binario (BCD) empacado.
Despus de una suma ASCII, utilice AAA para ajustar la respuesta: despus de una resta
ASCII, utilice AAS para ajustar la respuesta.
Antes de una multiplicacin ASCII, convierta el dividendo y divisor a BCD desempacado
poniendo los 3 hex de la izquierda en cero. Despus de una multiplicacin, emplee AAM
para ajustar el producto.
Antes de una divisin ASCII, convierta el dividendo y el divisor a BCD desempacado
limpiando los 3 hex de la extrema izquierda y use AAD para ajustar el dividendo.
Para casi todos los propsitos aritmticos, convierta los nmeros ASCII a binario. Cuando
convierta de formato ASCII a binario, verifique que los caracteres ASCII sean vlidos: de
30 hasta 39, un punto decimal y tal vez un signo menos.
Preguntas
259
PREGUNTAS
14-1. Suponga que el AX contiene 9 ASCII (0039H) y que el BX contiene 7 ASCII (0037H). Explique los
resultados exactos de las operaciones independientes siguientes:
(a)
ADD
AX.33H
(b)
AAA
(C)
SUB
AAS
ADD
AX,BX
AAA
AX,BX
(d)
SUB
AX,0DH
AAS
14-2. Un campo BCD desempacado llamado UNPAK contiene 01040705H. Codifique un ciclo que haga
que su contenido sea el apropiado ASCII 31343735H.
14-3. Un campo llamado ASCA contiene el nmero decimal ASCII 173 y otro campo llamado ASCB
contiene el 5 ASCII. Codifique instrucciones para multiplicar los nmeros ASCII juntos y almacenar
el producto en ASCPRO.
14-4. Utilice los mismos campos de la pregunta 14-3 para dividir ASCA entre ASCB y almacene el
cociente en ASCQUO.
14-5. Proporcione los clculos manuales para lo siguiente: (a) Convertir el nmero decimal ASCII 46328 a
binario y mostrar el resultado en formato hexadecimal; (b) convertir el valor hexadecimal de regreso
a ASCII.
14-6. Codifique y corra un programa que determine el tamao de la memoria de la computadora (vase la
INT 12H en el captulo 3), convierta el tamao a formato ASCII y despliegelo en pantalla como se
muestra:
El tamao de la memoria es de nnn bytes
CAPTULO 15
Procesamiento de tablas
OBJETIVO
Cubrir los requisitos necesarios para definir tablas, realizar bsquedas en tablas y ordenar tablas.
INTRODUCCIN
Muchas aplicaciones de programas necesitan tablas que contengan datos como nombres, descripciones, cantidades y precios. La definicin y el uso de tablas requiere mucho de la aplicacin de
lo que usted ya ha aprendido. Este captulo empieza por definir algunas tablas convencionales y
despus trata mtodos para buscar en ellas. Las tcnicas para esta bsqueda estn sujetas a la
manera en que las tablas estn definidas, y son posibles muchos otros mtodos para definir y
buscar adems de los dados aqu. Otras caractersticas muy usadas son el ordenamiento, que
reacomoda la secuencia de datos en la tabla, y el uso de listas ligadas, que utilizan apuntadores
para localizar elementos en una tabla.
La nica instruccin introducida en este captulo es XLAT (Traducir).
DEFINICIN DE TABLAS
Para facilitar la bsqueda en ellas, se acomoda la mayora de las tablas de manera consistente:
cada entrada se define con el mismo formato (carcter o numrico), con la misma longitud y en
orden ascendente o descendente.
260
Definicin de tablas
261
Una tabla que ya se ha usado a lo largo del libro es la pila, que en lo que sigue es una tabla
de 64 palabras no inicializadas (el nombre STACK se refiere a la primera palabra de la tabla):
STACK DW 64 DUP(?)
Las dos tablas siguientes, MONTAB y EMPTAB, inicializan valores de carcter y numricos, respectivamente. MONTAB define abreviaturas alfabticas de Tos meses, mientras que
EMPTAB define una tabla de nmeros de empleado:
MONTAB
DB
EMPTAB DB
'Jan',
'Feb',
205, 208,
'Mar',
'Dec'
...
Todas las entradas en MONTAB son de tres caracteres, y todas las entradas en EMPTAB son de
tres dgitos. Pero observe que el ensamblador convierte los nmeros decimales a formato binario,
y si no exceden de 255, almacena cada uno de ellos en un byte.
Una tabla tambin puede tener una mezcla de valores numricos y de caracteres, con tal de
que estn definidos de manera consistente. En la tabla siguiente de elementos en existencia, cada
entrada numrica (nmero de existencia) es de dos dgitos (un byte) y cada entrada de carcter
(descripcin de la existencia) es de nueve bytes. Los cuatro puntos que siguen a "Paper" son para
mostrar que deben aparecer espacios; esto es, deben teclearse espacios, y no puntos, en la descripcin:
STOKTBL
DB
12,
Computers',14,
P a p e r 1 7 ,
'Diskettes',
...
Por claridad, tambin puede codificar las entradas de la tabla en lneas separadas:
STOKTBL DB 12,
'Computers'
DB 14 ,
'Paper. ...'
DB 17,
'Diskettes'
El ejemplo siguiente define una tabla con 50 entradas, cada una inicializada a 20 blancos:
STORETAB
DB
50
DUP(20 D U P ( '
'))
Un programa podra usar esta tabla para almacenar hasta 50 valores que se hayan generado de
manera interna o para almacenar hasta 50 entradas que se lean de un archivo en disco.
Tablas en disco
En situaciones del mundo real, muchos programas estn dirigidos por medio de tablas. Las tablas
son almacenadas en archivos en disco, que cualquier nmero de programas puede leer de ah a su
segmento de datos para procesamiento. La razn de esta prctica es que el contenido de las tablas
cambia con el tiempo. Si cada programa define su propia tabla, cualquier cambio requerira que
todos los programas redefinieran las tablas y que se reensamblaran. Con tablas en archivos en
disco, slo necesita cambiar el contenido del archivo. En el captulo 17 hay un ejemplo de un
archivo de tabla.
Ahora examinemos maneras diferentes de utilizar tablas en programas.
Procesamiento de tablas
262
Captulo 1 5
DB
January..
DB
February.'
DB
"March...."
DB
'December.'
Esta tcnica es conocida como direccionamiento directo de tabla. Como el algoritmo calcula de forma directa la direccin de la tabla que se necesita, el programa no tiene que buscar de
forma sucesiva en cada entrada de la tabla.
Direccionamiento directo, ejemplo 1: Tabla de meses
El programa de la figura 15-1 proporciona un ejemplo de acceso directo a una tabla con los
nombres de los meses. El procedimiento C10CONV utiliza 12 (December) como entrada y convierte el mes as (los nmeros estn en hexadecimal):
Carga el mes ASCII en AX:
Utiliza 3030 para XOR:
3132
3030
Desempaqueta el mes:
Si el byte de ms a la izquierda n es cero,
limpiar y sumar OAH (10 decimal)
0102
0002
OOOC
(12 decimal)
Una manera de mejorar este programa es aceptar meses numricos desde el teclado y verificar que sus valores estn entre 01 y 12, inclusive.
TITLE
BEGIN:
NINE
MONIN
ALFMON
MONTAB
. 386
MAIN
MAIN
P15DIREC (COM)
D i r e c c i o n a m i e n t o directo de tablas
.MODEL SMALL
.CODE
100H
ORG
JMP
SHORT MAIN
DB
DB
DB
DB
DB
DB
DB
9
' 12 '
9 DUP (20H),
January
,
'April
',
'July
' ,
October
,
PROC
CALL
CALL
CALL
MOV
INT
ENDP
NEAR
C10CONV
D10LOC
F10DISP
AX,4C00H
21H
'$'
'February ', 'March
'
' , 'June
'
'May
'August
', 'September'
'November ', 'December '
Procedimiento principal
Convierte a b i n a r i o
Localiza el mes
Despliega mes en forma alfabtica
Sale al DOS
10CONV PROC
MOV
MOV
XOR
CMP
JZ
SUB
ADD
C20 :
RET
C10CONV ENDP
Configura el mes
AH,MONIN
AL,MONIN+l
AX,3030H
AH, 00
C20
AH, AH
AL, 10
D10LOC
D10LOC
PROC
LEA
SI,MONTAB
AL
DEC
MUL
NINE
SI,AX
ADD
MOVZX
CX.NINE
CLD
DI,ALFMON
LEA
REP MOVSB
RET
ENDP
Despliega
F10DISP PROC
MOV
LEA
INT
RET
F10DISP ENDP
END
AH,09H
DX,ALFMON
21H
Mueve 9 caracteres
el mes
(alfabtico):
Peticin de
despliegue
BEGIN
Figura 15-1
Procesamiento de tablas
264
TITLE
SAVEDAY
SAVEMON
TEN
ELEVEN
TWELVE
DAYSTAB
MONTAB
BEGIN
BEGIN
B10DAYWK
B10DAYWK
C10MONTH
P 1 5 D I S D A (EXE)
.MODEL
SMALL
. STACK
64
.DATA
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
. CODE
PROC
MOV
MOV
MOV
MOV
CALL
CALL
MOV
INT
MOV
MOV
CALL
CALL
CALL
CALL
CALL
MOV
INT
ENDP
PROC
MUL
LEA
ADD
MOV
INT
RET
ENDP
PROC
MOV
DEC
MUL
LEA
ADD
C10MONTH
MOV
INT
RET
ENDP
Despliega
el
da
de
la
semana
el
7
7
10
11
12
'Sunday, $
, 'Monday, $
'
'Tuesday, $
, ' W e d n e s d a y , $'
'Thursday, $
, 'Friday, $
'Saturday, $
'January $
',
February $ ,
'March $
'
'April $
,
'May $
' , ' June $
'
'August $
',
S e p t e m b e r $'
'July $
'October $
' N o v e m b e r $ ', ' D e c e m b e r $
1
FAR
AX,data
DS,AX
ES,AX
AX,0600H
Q10SCR
Q2 0CURS
AH,2AH
21H
SAVEMON,DH
SAVEDAY,DL
B10DAYWK
C10MONTH
D10DAYMO
E10INPT
Q10SCR
AX,4C00H
21H
NEAR
TWELVE
DX, D A Y S T A B
DX, A X
AH,09H
21H
NEAR
AL,SAVEMON
AL
ELEVEN
DX,MONTAB
DX, AX
AH,09H
21H
Inicializa
registro
de
segmentos
Limpia la p a n t a l l a
,-Coloca e l c u r s o r
/Obtiene la fecha de
'
hoy
Guarda el mes
Guarda el da del mes
Despliega el da de la
Despliega el mes
Despliega el da
Espera por una entrada
Limpia la pantalla
Sale al DOS
semana
Despliega el da de la semana
D a (en A L ) x 1 2
Direccin de la tabla
ms el desplazamiento
Despliega
Despliega el mes
Obtiene el mes
Disminuye en uno
Multiplica por la longitud
Direccin de la tabla
ms desplazamiento
Despliega
de
. J O O
D10DAYMO
PROC
MOVZX
DIV
OR
MOV
NEAR
AX,SAVEDAY
TEN
AX,3030H
BX, AX
Figura 15-2
mes
Captulo 15
D10DAYMO
E10INPT
E10INPT
QIOSCR
Q10SCR
Q2 0CURS
Q2 0CURS
265
MOV
MOV
INT
MOV
MOV
INT
RET
ENDP
AH,02H
DL, BL
21H
AH,02H
DL, BH
21H
PROC
MOV
INT
RET
ENDP
NEAR
AH,10H
16H
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
NEAR
AX,0600H
BH,17H
CX,0000
DX,184FH
10H
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
END
NEAR
AH,02H
BH, 00
DH, 10
DL, 24
10H
/Despliega
segundo dgito
/Recorre la pantalla
Blanco sobre azul
Llama al BIOS
BEGIN
Figura 15-2
AL
CX
DH
DL
/Despliega
primer dgito
(continuacin)
Procesamiento de tablas
266
Captulo 15
mes en uno de manera que, por ejemplo, el mes 01 se convierte en la entrada cero en MONTAB.
Despus multiplica el mes por 11 (la longitud de cada entrada en MONTAB). El producto est en
un desplazamiento de la tabla donde January est en M O N T A B + 0 , February en MONTAB + 1 1 ,
etc. El mes es desplegado directamente de la tabla.
El procedimiento D10DAYMO divide el da del mes entre 10 para convertirlo de formato
binario a ASCII. Como el nmero mximo para da es 3 1 , tanto el cociente como el residuo slo
pueden ser de un dgito. (Por ejemplo, 31 dividido entre 10 da un cociente de 3 y un residuo de 1.)
La funcin 02H del DOS despliega cada uno de estos dos caracteres, incluyendo el cero inicial
para los das menores a 10; la supresin del cero inicial implica algunos pequeos cambios en el
programa.
Al final, el programa espera a que el usuario presione una tecla antes de salir al DOS.
Aunque el direccionamiento directo de tabla es muy eficiente, funciona mejor cuando las
entradas son secuenciales y en un orden predecible. Por tanto, funcionara bien para entradas que
estn en el orden 1, 2, 3,
o 106, 107, 108,
o a n p a r a 5 , 10, 15, .... Desafortunadamente, I
pocas aplicaciones proporcionan un arreglo tan ordenado de valores en la tabla. Una seccin j
posterior examina tablas con valores que son secuenciales, pero no en un orden particular.
j
1
BSQUEDA EN UNA T A B L A
j
Algunas tablas consisten en nmeros nicos sin patrn aparente. Un ejemplo tpico es una tabla de j
elementos en existencia con nmeros no consecutivos como 134, 138, 141, 239 y 245. Otro tipo i
de tabla como una tabla de ingresos gravables contiene mrgenes de valores. Las siguientes
secciones examinan ambos tipos de tablas y los requisitos para buscar en ellas.
Tablas con e n t r a d a s nicas
En la mayor parte de las compaas, los nmeros de inventario por lo comn no estn en orden
consecutivo. En lugar de eso, tienden a estar agrupadas en categoras, con un nmero inicial para
indicar mueble o accesorio o para sealar que est localizado en cierto departamento. Adems,
con el tiempo algunos elementos son eliminados del inventario y otros son agregados. Como
ejemplo, definamos una tabla con nmeros de inventario y sus descripciones relativas. stas
podran ser definidas en tablas separadas, como
STOKNOS
DB
'05','10','12',
STOKDESC
DB
'Excavators',
...
'Lifters',
'Presses...'
...
Cada paso en la bsqueda podra incrementar en dos la direccin de la primera tabla (la longitud
de cada entrada en STOKNOS) y la direccin de la segunda tabla en 10 (la longitud de cada
entrada en STOKDESC). Otro procedimiento podra mantener un conteo del nmero de ciclos
ejecutados y encontrar una coincidencia con cierta llave de nmero de existencia, multiplicar el
contador por 10 y utilizar el producto como un desplazamiento de la direccin de STOKDESC.
Por otra parte, puede ser ms claro definir nmeros de inventario y descripciones en la
misma tabla, con una lnea para cada par:
STOKTAB
DB
'05','Excavators'
DB
'10' , 'Lifters'
DB
'12','Presses...'
267
El programa en la figura 15-3 define esta tabla con seis pares de nmeros de inventario y
descripciones. El ciclo de bsqueda en A20 compara el primer byte del nmero de inventario de
entrada, STOKNIN, con el primer byte de los nmeros de inventario en la tabla. Si la comparacin es igual, la rutina compara los segundos bytes. Si estos son iguales, el nmero de inventario
ha sido encontrado y en A50 el programa copia la descripcin de la tabla a DESCRN, donde es
desplegada.
Si la comparacin del primero o segundo byte es menor, se sabe que el numero de inventario
no est en la tabla y, en A40, el programa puede desplegar un mensaje de error (no codificado).
Si la comparacin del primero o segundo byte es alta, el programa tiene que continuar la
bsqueda; para comparar el nmero de inventario de entrada con el siguiente nmero de inventario en la tabla, incrementa el SI, que contiene la direccin de la tabla. El ciclo de bsqueda realiza
un mximo de seis comparaciones. Si el ciclo excede a seis, se sabe que el nmero de inventario
no est en la tabla.
Verificamos esta lgica comparando de forma sucesiva los nmeros de inventario 0 1 , 06 y
10 con los elementos en la tabla:
j
I
|
\
i
<
j
]
i
j
j
I
]
I
j
j
\
j
j
|
La tabla tambin puede definir precios unitarios. El usuario ingresa un nmero de inventario y la cantidad vendida. El programa podra localizar el elemento del inventario en la tabla,
calcula la cantidad de la venta (cantidad vendida por precio por unidad) y despliega la descripcin
y la cantidad de la venta.
En la figura 15-3, el nmero de elemento es de dos caracteres y la descripcin es de 10. La
programacin de detalles vara para diferentes nmeros de entradas y diferentes longitudes de
entradas. Por ejemplo, para comparar campos de tres bytes podra utilizar REPE CMPSB, aunque
la instruccin implica al registro CX, el cual LOOP ya utiliza.
j
\
i
j
1
~
j
Los ingresos gravables proporcionan un ejemplo caracterstico de una tabla con intervalos de
valores. Considere la siguiente tabla hipottica de ingresos gravables, tasas de impuesto y factores
de ajuste:
INGRESO GRAVABLE ($)
TASA
0-1,000.00
. 10
FACTOR DE AJUSTE
0 .00
1,000.01-2,500.00
. 15
050 . 00
2,500.01-4,250.00
. 18
125.00
4,250.01-S,000.00
.20
260.00
6,000.01 y ms
.23
390.00
]
j
P r o c e s a m i e n t o de t a b l a s
268
TITLE
BEGIN:
STOKNIN
STOKTAB
DESCRN
MAIN
P 1 5 T A B S R (COM)
Tabla
SMALL
.MODEL
.CODE
ORG
100H
JMP
SHORT MAIN
de
DB
DB
DB
DB
DB
DB
DB
DB
' 12 '
'05','Excavators'
'10','Lifters
'12','Presses
'
15','Valves
'
'23', Processors'
27 ,'Pumps
10 D U P ( ? ) , '$'
PROC
MOV
LEA
NEAR
CX, 06
SI,STOKTAB
MOV
CMP
JNE
MOV
CMP
JE
AL,STOKNIN
A L , [SI]
A30
AL,STOKNIN+l
A L , [SI + 1]
A50
JB
ADD
LOOP
A40
SI,12
A2 0
bsqueda
que
utiliza
Captulo 1 !
CMP
Entrada de nm. de
Inicio de la tabla
inventario
Fin de la
rea para
Inicializa
tabla
guardar
comparacin
A20:
tExistencia(1) : tabla
No es igual, salir
Igual:
#Existencia(2) : tabla
igual,
encontrada
A30:
;Menor,
/Mayor,
no se encuentra en la tabla
obtener la siguiente entrada
No est
,-Mostrar
A40 :
;
JMP
en la tabla
mensaje de error
A90
A50:
MOV
LEA
INC
INC
REP
MOV
LEA
INT
A90 :
MAIN
MOV
INT
ENDP
END
Longitud de la descripcin
Direccin de la descripcin
CX, 05
DI,DESCRN
SI
SI
MOVSW
AH,09H
DX, DESCRN
21H
Extraer la descripcin
de la t a b l a
Peticin para desplegar
descripcin de la existencia
AX,4CO0H
21H
Sale
al
DOS
BEGIN
Figura 15-3
En la tabla de impuestos, las tasas se incrementan conforme lo hacen los ingresos gravables. I
factor de ajuste compensa nuestro impuesto calculado en tasas altas, mientras que las tasas baje
se aplican a niveles menores de ingresos. Las entradas para los ingresos gravables contienen <
ingreso mximo para cada paso:
TAXTAB
DD
100000,
10,
00000
DD
250000,
15,
05000
DD
425000,
18,
12500
DD
600000,
20,
26000
DD
999999,
23 , 3 9 0 0 0
269
Para realizar una bsqueda en la tabla, el programa compara el ingreso gravable del contribuyente
con las entradas en la tabla y hace lo siguiente, de acuerdo con los resultados de la comparacin:
Mayor: Incrementa para la entrada siguiente de la tabla.
Menor o igual: Utiliza la tasa y el factor de ajuste asociados.
Calcula la deduccin de impuesto como (ingreso gravable x tasa de la tabla) - factor de
ajuste. Observe que la ltima entrada en la tabla contiene el valor mximo (999999), que
siempre finalizara de manera correcta la bsqueda.
Bsqueda en una tabla usando comparaciones de cadenas
REPE CMPS es til para comparar nmeros que son de dos o ms bytes de longitud. El programa
de la figura 15-4 define STOKTAB, pero esta vez corregido como un nmero de inventario de tres
bytes. Ya que STOKNIN es el primer campo en el rea de datos y STOKTAB es el siguiente,
aparecen en el segmento de datos como sigue:
STOKNIN STOKTAB
I
I
Data:
010
OD
La ltima entrada de la tabla contiene '999' para que termine la bsqueda, ya que REPE hace que
el CX no est disponible para la instruccin LOOP. La rutina de bsqueda compara STOKNIN
(definido de manera arbitraria con 123) con cada entrada de la tabla, como sigue:
STOKNIN
123
123
123
123
123
ENTRADA DE LA TABLA
035
038
049
102
123
RESULTADO DE LA COMPARACIN
270
Procesamiento de tablas
TITLE
0000
0003
0010
001D
002A
0037
0044
0051
005E
0000
0000
0003
0005
0007
0008
oooc
oooc
OOOF
0013
0015
0017
0019
001B
001E
0020
0020
0023
0025
0029
002B
002D
0031
0033
0036
31 32
3 0 33
61 76
73
30 33
74 65
20
30 34
73 73
20
31 30
7 6 65
20
31 32
63 6 5
73
31 32
7 0 73
20
39 39
000A[
000A[
24
STOKNIN
STOKTAB
Bsqueda
.DATA
DB
' 123
' 035 , Excavators
DB
45
74
78
6F
63
72
38
72
4C
73
69
20
66
20
DB
'038','Lifters
39
65
50
73
72
20
65
20
DB
32
73
56
20
61
20
6C
20
DB
33
73
50
73
72
6F
6F
72
DB
37
20
50
20
75
20
6D
20
DB
DB
39
20
]
?? ]
DESCRN
0003
04 9. , ' P r e s s e s
999 ' ,
10
DB
10 D U P (
;Inicio
de
la
,-Fin de
la
tabla
')
DUP(?),'$'
-CODE
FAR
PROC
MOV
AX,@data
MOV
DS, AX
ES, AX
MOV
CLD
DI, STOKTAB
LEA
MOV
LEA
REPE
JE
JB
ADD
ADD
JMP
CMPSB
CX, 0 3
SI,STOKNIN
CMPSB
A30
A4 0
DI,CX
D I , 10
A20
tabla
'
A20 :
B9 0003
8 D 36 0 0 0 0
F 3 / A6
74 09
72 ID
03 F9
83 C 7 O A
EB EC
utilizando
33
35
61
BEGIN
B8
8E D8
8 E CO
FC
8D 3E
page
60,132
P 1 5 S T R S R (EXE)
.MODEL
SMALL
.STACK
64
Capitulo 15
;rea
para
Inicializa
registros
segmentos
guardar
de
Inicializa
direccin
de la tabla
Compara 3 bytes
Inic. direccin de #Exist
#Exist : tabla
igual, salir
menor, no hay entrada
Sumar CX al desplazamiento
S i g u i e n t e e l e m e n t o de la tab
A3 0 :
B9 0005
8B F7
8D 3E 005E
F3/ A5
B4
8D
CD
EB
09
16
21
01
005E
90
CX, 05
SI,DI
DI,DESCRN
MOVSW
MOV
LEA
INT
JMP
AH,09H
DX,DESCRN
21H
A90
/Establecer
para
Ir
salir
<D e s p l i e g a m e n s a j e
de
error>
A90 :
4C00
21
BEGIN
Figura 15-4
MOV
INT
RET
ENDP
END
AX,4C00H
21H
palabras
;Direc. de descrip.
;Obtener descripcin
de la tabla
;Peticin de desplegar
;
d e s c r i p . de e x i s t e n c i a
A40 :
;
0036
0036 B8
0039 CD
003B CB
003C
MOV
MOV
LEA
REP
;Sale
al
BEGIN
DOS
271
004H
+ 02H
+ OAH
010H
Ya que el CX contiene el nmero de bytes que quedan por comparar (si existen), la aritmtica
funciona para todos los casos y termina despus de una, dos o tres comparaciones. En una comparacin que resulte igual, el CX contiene 00 y el DI ya est incrementado a la direccin de la
descripcin requerida. Entonces, una operacin REP MOVSW copia la descripcin en DESCRN,
donde es desplegada.
Tablas con entradas de longitud variable
Es posible definir una tabla con entradas de longitud variable. Un carcter delimitador especial,
como 00H, puede seguir a cada entrada, y FFH podra distinguir el final de la tabla. Sin embargo,
debe asegurarse de que ningn byte dentro de una entrada contenga la configuracin de bits de un
delimitador; por ejemplo, una cantidad aritmtica binaria puede contener cualquier configuracin
posible de bits. Utilice la instruccin SCAS para buscar los delimitadores.
XLAT
;Sin operandos
El ejemplo siguiente convierte los nmeros 0-9 ASCII a EBCDIC. Como la representacin
en ASCII es 30-39 y en EBCDIC es F0-F9, puede utilizar una operacin OR para realizar el
cambio. Sin embargo, tambin convertir todos los otros caracteres en blanco, EBCDIC 40H.
Para XLAT, se define una tabla de traduccin que toma en cuenta todos los 256 posibles caracteres, con cdigos EBCDIC insertados en las posiciones ASCII:
XLTBL
DB
4 8 DUP(4 0H)
DB
0F0H,0F1H,0F2H,0F3H,
DB
198 DUP(4OH)
, 0F9H
; EBCDIC 0-9
;espacios en blanco EBCDIC
XLAT espera que la direccin de la tabla est en el registro BX y el byte que se va a traducir
(llammoslo ASCNO) est en el AL. Lo siguiente realiza la inicializacin y traduccin:
LEA
BX,XLTBL
MOV
AL, A S C N O
XLAT
Traduce a EBCDIC
P r o c e s a m i e n t o de t a b l a s
272
TITLE
BEGIN:
P15XLATE
(COM)
.MODEL
SMALL
.CODE
ORG
100H
JMP
MAIN
Traduce ASCII
EBCDIC
ASCNO
EBCNO
XLTAB
DB
DB
DB
DB
DB
DB
DB
DB
'-31.5 '
Elemento ASCII a convertir
6 DUP(
)
Elemento EBCDIC convertido
45 DUP(40H)
Tabla de traduccin
60H, 4BH
40H
OFOH,0F1H,0F2H,0F3H,0F4H
0F5H,0F6H,0F7H,0F8H,0F9H
198 DUP(40H)
MAIN
PROC
LEA
LEA
MOV
LEA
NEAR
SI,ASCNO
DI,EBCNO
C X , 06
BX,XLTAB
Direccin de ASCNO
;Direccin de EBCNO
,-Longitud d e l o s e l e m e n t o s
,-Direccin de la t a b l a
A2 0
Obtener carcter en AL
Traducir el carcter
Almacenar AL en EBCNO
Repetir 6 veces
Captulo 1 5
A20 :
LODSB
XLAT
STOSB
LOOP
MAIN
MOV
INT
ENDP
END
AX,4C00H
21H
Salir
al
DOS
BEGIN
Figura 15-5
TITLE
BEGIN:
273
page 60,132
P15ASCHX (COM)
Despliega caracteres ASCII y hexadecimales
.MODEL SMALL
. CODE
ORG
100H
JMP
SHORT MAIN
DISPROW
HEXCTR
XLATAB
DB
DB
DB
DB
MAIN
PROC
CALL
LEA
16 DUP(5 D U P (
) ) , 13
00
3 OH,31H,32H,33H,34H,35H,3 6H,37H,3 8H,3 9H
41H,42H,43H,44H 45H,46H
/Procedimiento princip
,-Limpia la pantalla
NEAR
Q10CLR
SI,DISPROW
A2 0LOOP:
A50 :
MAIN
C10HEX
C10HEX
D10DISP
CALL
CALL
CMP
JE
INC
JMP
MOV
INT
ENDP
C10HEX
D10DISP
HEXCTR,OFFH
A5 0
HEXCTR
A2 0LOOP
AX,4C00H
21H
/Traduce
/ y despliega
/Es el ltimo nmero
/ s, termina
/ no, obtener el sigu
PROC
MOV
MOV
MOV
SHR
LEA
XLAT
MOV
NEAR
AH, 00
AL, HEXCTR
CL, 04
AX, CL
BX,XLATAB
/Convierte
MOV
AND
XLAT
MOV
RET
ENDP
PROC
MOV
MOV
CMP
JE
CMP
JB
CMP
JAE
AL,HEXCTR
AL,OFH
MOV
BYTE PTR
ADD
LEA
CMP
JNE
SI, 05
DI,DISPROW+80
DI, SI
D4 0
MOV
MOV
MOV
LEA
INT
LEA
AH.40H
BX, 01
CX, 81
DX,DISPROW
21H
SI,DISPROW
[SI] +1,AL
D2 0 :
a hexadecimal
[SI] , AL
NEAR
AL,HEXCTR
[SI] +3 , AL
AL, 1AH
D20
AL,07H
D30
AL,10H
D3 0
/Salir al DOS
/Despliega
D30 :
Figura 15-6
/Siguiente
lugar en rengln
/Est lleno el
/ no, pasar
rengln?
Procesamiento de tablas
274
D40 :
D10DISP
RET
ENDP
Q10CLR
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
END
Q10CLR
NEAR
AX,0600H
BH,61H
CX,0000
DX,184FH
10H
la
pantalla
;atributo
BEGIN
Figura 15-6
00 01 02
;Limpia
Captulo 15
(continuacin)
03
04 05 06 07
08 09 0 A 0 B 0C 0 D 0E 0 F
F 0 F l F 2 F3
F 4 F 5 F 6 F7
F8 F9 F A F B FC F D F E FF
Como vio en la figura 8-1, desplegar smbolos ASCII no causa problemas graves. Sin
embargo, desplegar la representacin hexadecimal de un valor ASCII es ms complicado. Por
ejemplo, para desplegar un hexadecimal como ASCII, tiene que convertir OOH a 3030H, 01H a
3031H, etctera.
El programa inicializa HEXCTR a 00 y por cada ciclo lo incrementa en 1 de manera sucesiva. El procedimiento C10HEX divide HEXCTR en dos dgitos hexadecimales. Por ejemplo,
suponga que HEXCTR contiene 4FH. La rutina extrae el 4 hex y lo utiliza junto con una tabla
para una traduccin. El nmero que regresa al AL es 34H. Despus, la rutina extrae la F y la
traduce a 46H. El resultado, 3446H, se despliega como 4F.
El procedimiento D10DISP convierte caracteres no ASCII en blancos. Ya que la funcin
40H de la INT 21H del DOS trata a 1AH como un carcter de fin de archivo, el programa
tambin lo cambia a espacio en blanco. Cuando un rengln est lleno con 16 caracteres, el procedimiento lo despliega; el procedimiento termina despus de desplegar el rengln decimosexto.
Existen muchas otras maneras de convertir dgitos hexadecimales en caracteres ASCII; por
ejemplo, puede experimentar con corrimientos y comparaciones.
275
la entrada 3, y as hasta el final de la tabla, intercambiando las entradas cuando sea necesario. Si
realiza algn intercambio de entradas, repita el proceso desde el inicio de la tabla, comparando la
entrada uno con la entrada dos, otra vez. Si no se realiza ningn intercambio, la tabla ya est en
secuencia y se puede terminar el ordenamiento.
En el seudocdigo siguiente, SWAP es un elemento que indica si se realiz un intercambio
(S) o no (NO).
G10 :
G20:
G30:
Intercambiar entradas
Hacer SWAP igual a S
Pasar a G3 0
S:
Es SWAP = S?
S:
No:
Pasar a G20
(repetir el ordenamiento)
y
Terminar el ordenamiento
El programa de la figura 15-7 permite al usuario ingresar hasta 30 nombres desde el teclado,
que el programa almacena de manera sucesiva en una tabla llamada NAMETAB. Cuando se han
ingresado todos los nombres, el usuario slo presiona la tecla Enter, sin ningn nombre. Entonces, el programa ordena la tabla de nombres en secuencia ascendente y los desplega en la pantalla.
Observe que las entradas de la tabla son todas de longitud fija de 20 bytes. Una rutina para
ordenar informacin de longitud variable sera ms complicada.
276
Procesamiento de tablas
TITLE
page 60,132
P15NMSRT
(EXE)
.MODEL SMALL
. S T A C K 64
AME PAR
MAXNLEN
NAMELEN
NAMEFLD
.DATA
LABEL
DB
DB
DB
CRLF
ENDADDR
MESSG1
NAMECTR
NAMETAB
NAMESAV
SWAPPED
DB
DW
DB
DB
DB
DB
DB
BEGIN
.CODE
PROC
MOV
MOV
MOV
CLD
CALL
CALL
LEA
Ordena
BYTE
21
p
21 D U P (
13,
7
10,
' )
nombres
ingresados
desde
la
Capitulo 15
terminal
para
el
'$'
FAR
AX,@data
DS,AX
ES,AX
' ) ) /Tabla
1 0 , '$'
de
Inicializa
DS y ES
la
el
nombres
los
registros
Q10CLR
Q20CURS
DI,NAMETAB
Limpia
;Coloca
pantalla
cursor
CALL
CMP
JZ
CMP
JE
CALL
JMP
B10READ
NAMELEN,0 0
A3 0
NAMECTR, 3 0
A3 0
D10STOR
A2 0LOOP
,-Acepta u n n o m b r e
Existen ms nombres?
n o , ir a o r d e n a r
Han ingresado 3 0 nombres?
s, ir a o r d e n a r /
/Almacenar en la tabla el nombre
CALL
CALL
CMP
JBE
CALL
CALL
MOV
INT
ENDP
Q10CLR
Q2 0CURS
NAMECTR,01
A4 0
G10SORT
K10DISP
AX,4C00H
21H
A2 0LOOP:
A30 :
A40 :
BEGIN
Acepta
BlOREAD
nombres
PROC
MOV
LEA
INT
MOV
LEA
INT
MOV
LEA
INT
AH,09H
DX,MESSG1
21H
AH, OAH
DX,AMEPAR
21H
AH,09H
DX,CRLF
21H
MOV
MOV
MOV
SUB
B H , 00
BL,NAMELEN
CX, 21
CX.BX
Figura 15-7
Fin de la entrada
Limpiar la pantalla
y c o l o c a r el c u r s o r
Se i n g r e s u n o o n i n g n nombre?
s, salir
Ordenar los nombres almacenados
Mostrar los nombres ordenados
Salir al DOS
como
entrada:
/Despliega
/Acepta
indicacin
nombre
/Retorno/avance
de
lnea
/Limpia los
/Obtiene el
caracteres despus
contador de cars.
/Calcula
longitud
la
restante
ingresado
277
B20 :
BIOREAD
MOV
INC
LOOP
RET
ENDP
NAMEFLD[BX] ,2OH
BX
B2 0
D10STOR
G10SORT
PROC
INC
NAMECTR
Suma al n m e r o de nombres
CLD
LEA
SI,NAMEFLD
MOV
CX, 10
Diez p a l a b r a s
REP MOVSW
Nombre (SI) a la tabla (DI)
RET
ENDP
Ordena los nombres de la tabla:
PROC
SUB
MOV
DI,40
ENDADDR,DI
MOV
LEA
SWAPPED, 0 0
SI, NAMETAB
Designa el inicio
de la tabla
G20 :
G3 0 :
MOV
CX, 20
MOV
DI,SI
ADD
DI, 20
MOV
AX, DI
MOV
BX,SI
REPE CMPSB
JBE
G4 0
CALL
H10XCHG
Longitud de
Nombre
comparacin
intercambia
siguiente
G40 :
G10SORT
MOV
CMP
JBE
CMP
JNZ
RET
ENDP
SI, AX
SI,ENDADDR
G3 0
SWAPPED,0 0
G2 0
Intercambia
H10XCHG
Es el fin de la tabla?
; no, continuar
Hubo algn intercambio?
s, continuar
no, fin del ordenamiento
entradas de la tabla:
PROC
MOV
CX, 10
LEA
DI,NAMESAV
MOV
SI,BX
REP MOVSW
K10DISP
caracteres
MOV
CX, 10
MOV
DI,BX
MOVSW
REP
H10XCHG
Nmero de
caracteres
MOV
CX, 10
SI,NAMESAV
LEA
REP MOVSW
Mueve el guardado al elemento mayor
MOV
SWAPPED,01
Seala que se realiz un intercambio
RET
ENDP
Despliega los nombres o r d e n a d o s :
PROC
LEA
SI,NAMETAB
Figura 15-7
(continuacin)
P r o c e s a m i e n t o de tablas
278
Captulo 1 5
K20 :
K10DISP
Q10CLR
Q10CLR
LEA
DI, NAMESAV
;Inicializa el p r i n c i p i o
,-Cuenta l o s c i c l o s
MOV
CX,10
REP MOVSW
MOV
AH,09H
/Peticin de despliegue
DX,NAMESAV
LEA
2
1
H
INT
Es el l t i m o ?
NAMECTR
DEC
;
no, r e p e t i r el c i c l o
K2 0
JNZ
/
s, s a l i r
RET
ENDP
Limpia la pantalla:
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
AX,0600H
BH,61H
CX, 00
DX,184FH
10H
Coloca
Q20CURS
Q2 0CURS
PROC
MOV
MOV
MOV
INT
RET
ENDP
END
/Atributo
/Pantalla
el
de
la
tabla
completa
cursor:
AH,02H
B H , 00
DX, 00
10H
Peticin de colocar
Pgina 0
Posicin 00:00
el
cursor
BEGIN
Figura 15-7
(continuacin)
lista. La lista ligada inicia en el desplazamiento 0000, el segundo elemento en la serie est en
0024, el tercero en 0032, y as sucesivamente:
DESPLAZAMIENTO
0000
0008
0016
0024
0032
NO. PARTE
0103
1720
1827
0120
0205
PRECIO
12.50
08.95
03.75
13.80
25.00
SIG. DIRECCIN
0024
0016
0000
0032
0008
El elemento del desplazamiento 0016 contiene cero como la direccin siguiente, para indicar que
es el final de la lista o para crear una lista circular.
El programa en la figura 15-8 utiliza el contenido de la lista ligada definida, LINKLST, para
localizar un nmero de parte especfico, en este caso 1720. La bsqueda empieza con el primer
elemento de la tabla. La lgica para usar CMPSB es similar a la de la figura 15-4. El programa
compara el nmero de parte (1720) con cada elemento de la tabla y hace lo siguiente, de acuerdo
con el resultado de la comparacin:
Igual: La bsqueda ha terminado.
Menor: El elemento no est en la tabla.
Mayor: El programa obtiene el desplazamiento de la tabla para el elemento siguiente a ser
comparado. Si el desplazamiento no es cero, la comparacin se repite para el siguiente
elemento; si el desplazamiento es cero, la bsqueda termina sin encontrar al elemento.
Puntos clave
279
DW
10 DUP (?)
El programa puede usar el operador TYPE para determinar la definicin (en este caso DW), el
operador L E N G T H para determinar el factor D U P (10) y el operador SIZE para determinar
el nmero de bytes (10 x 2, o 20). Los ejemplos siguientes ilustran los tres operadores:
MOV AX, TYPE TABLEX
; AX = 0002
(2 bytes)
MOV
BX,LENGTH TABLEX
;BX = 0 00A
(10 bytes)
MOV
CX,SIZE TABLEX
;CX = 0014
(20 bytes)
Puede utilizar los valores que LENGTH y SIZE regresan para terminar una bsqueda o
clasificacin de una tabla. Por ejemplo, si el registro SI contiene la direccin de desplazamiento
incrementada de una bsqueda, puede examinar este desplazamiento por medio de
CMP
SI,SIZE TABLEX
PUNTOS CLAVE
Para la mayora de los propsitos, se definen tablas de manera que sus entradas estn
relacionadas y tengan la misma longitud y formato de datos.
Disee tablas con base en su formato de datos. Por ejemplo, las entradas de la tabla pueden
ser caracteres o numricas y cada una de uno, dos o ms bytes de longitud.
Recuerde que el nmero mximo para un DB es 256 y que los DW y DD invierten los bytes.
Adems, CMP y CMPSW suponen que las palabras contienen bytes en secuencia inversa.
Si una tabla est sujeta a cambios frecuentes, o si varios programas hacen referencia a la
tabla, almacnela en disco. Un programa de actualizacin puede manejar los cambios en
la tabla. Entonces, cualquier programa puede cargar la tabla del disco y los programas no
necesitan ser modificados.
Bajo direccionamiento directo, el programa calcula la direccin de una entrada en la tabla
y la accesa de manera directa.
P r o c e s a m i e n t o de tablas
280
TITLE
PARTNO
LINKLST
BEGIN
P 1 5 L N K L S (EXE)
.MODEL
SMALL
.STACK
64
. DATA
DB
DB
DW
DB
DW
DB
DW
DB
DW
DB
DW
.CODE
PROC
MOV
MOV
MOV
CLD
LEA
Uso
1720
' 0103
1250 ,
1720
0895,
' 1827
0375,
' 0120
1380,
' 0205
2500,
de
una
lista
Captulo 1 5
ligada
/Define
la
pila
/Nmero de parte
Tabla de la lista
ligada
24
16
00
32
08
/Define
segmento
FAR
AX,data
DS,AX
ES, AX
Designa
en el
y ES
DI,LINKLST
Inicializa
de
cdigo
direccin de
registro DS
la
DATASG
direccin
de
la
tabla
A20 :
MOV
LEA
REPE
JE
JB
ADD
ADD
MOV
LEA
ADD
CMP
JNE
JMP
C X , 04
SI, PARTNO
CMPSB
A3 0
A4 0
DI, CX
D I , 02
D X , [DI]
DI,LINKLST
DI, DX
D X , 00
A2 0
A4 0
Es
la
ltima
entrada
de
la
tabla?
A3 0 :
<Elemento
JMP
encontrado
A90
A4 0 :
/
<Despliega
mensaje
de
error>
A90 :
BEGIN
MOV
INT
ENDP
END
AX,4C00H
21H
/Sale
al
DOS
BEGIN
Figura 15-8
Lista ligada
Cuando busca en una tabla, un programa compara de manera sucesiva un elemento contra
cada entrada en la tabla hasta que encuentra la que coincida.
La instruccin XLAT facilita la traduccin de datos de un formato a otro.
PREGUNTAS
15-1. D las diferencias entre el procesamiento de una tabla para direccionamiento directo y para bsqueda.
15-2. Defina una tabla llamada TABLEX con 50 palabras, inicialcela con blancos.
Preguntas
281
15-3. Defina tres diferentes tablas relacionadas que contengan los datos siguientes: (a) los nmeros 06,
10, 14, 21 y 24; (b) las descripciones de una videocinta, receptores, mdem, teclados y discos
flexibles; (c) los precios 93.95, 82.25, 90.67, 85.80 y 13.85.
15-4. Codifique un programa que permita al usuario ingresar, desde el teclado, los nmeros de elementos
(ITEMIN) y cantidades (QTYIN). Utilice las tablas definidas en la pregunta 15-3, e incluya una
rutina de bsqueda que utilice ITEMIN para localizar el nmero de elemento en la tabla. Extraiga
las descripciones y precios de la tabla. Calcule el valor de cada venta (cantidad x precio) y despliegue
la descripcin y valor en la pantalla.
15-5. Usando la tabla de descripcin definida en la pregunta 15-3, codifique lo siguiente: (a) una rutina
que mueva el contenido de la tabla a otra tabla (inicialmente vaca); (b) una rutina que ordene el
contenido de esta nueva tabla en secuencia ascendente de descripcin.
15-6. Se necesita un programa que proporcione un cifrado sencillo de informacin. Defina un rea de
datos de 80 bytes llamada CRYPTEXT con cualesquiera datos ASCII. Arregle una tabla de traduccin
para convertir los datos de manera un poco aleatoria, por ejemplo, A a X, B a E, C a R, etc.
Proporcione todos los posibles valores de byte. Arregle una segunda tabla de traduccin que invierta
(descifre) la informacin. El programa debe realizar las acciones siguientes:
Desplegar el contenido original de CRYPTEXT en una lnea.
Cifrar CRYPTEXT y desplegar la informacin cifrada en una segunda lnea.
Descifrar CRYPTEXT y desplegar la informacin descifrada en una tercer lnea. (Debe
mostrar la misma informacin que la primer lnea.)
INTRODUCCIN
En algn momento, un programador serio tiene que estar familiarizado con los detalles tcnicos
de la organizacin en disco, en particular para el desarrollo de programas de utileras que examinan el contenido de los discos flexibles o los discos duros. En este libro, en donde se necesite
hacer referencia a un disco o a un disco flexible se usar el trmino general disco.
Este captulo explica los conceptos de pistas, sectores y cilindros y da las capacidades de
algunos dispositivos usados.
Tambin se cubre la organizacin de importante informacin registrada al inicio de un disco,
incluyendo el registro de arranque (que ayuda al sistema a cargar los programas del DOS desde disco
y hacia la memoria); el directorio (que contiene el nombre, ubicacin y estado de cada archivo en el
disco) y la tabla de asignacin de archivos (o FAT, que asigna espacio de disco para los archivos).
CARACTERSTICAS DE LOS DISCOS
Para procesar registros en discos, es til estar familiarizados con los trminos y caractersticas de
su organizacin. Un disco flexible tiene dos lados (o superficies), mientras que un disco duro
contiene varios discos de dos lados.
282
283
Pistas y sectores
Cada lado de un disco flexible o de un disco duro contiene varias pistas concntricas, numeradas
iniciando con 00, la pista ms externa. Cada pista est formateada en sectores de 512 bytes, en
donde se almacena la informacin.
Los dispositivos de discos flexibles y de discos duros se hacen funcionar por un controlador
que maneja la colocacin de las cabezas de lectura/escritura sobre la superficie del disco y la
transferencia de informacin entre el disco y la memoria. Existe una cabeza de lectura/escritura
por cada superficie del disco. Para ambos, disco duro y disco flexible, una peticin de lectura o
una de escritura hace que el controlador del disco mueva las cabezas de lectura/escritura (si es
necesario) a la pista requerida. Despus, el controlador espera a que el sector que se necesita,
sobre la superficie que est girando, llegue a la cabeza. En ese momento la operacin de lectura
o escritura tiene lugar. La figura 16-1 ilustra este procedimiento.
Existen dos diferencias principales entre una unidad de disco duro y una de disco flexible.
En disco duro, las cabezas de lectura/escritura se encuentran sobre la superficie del disco sin
tocarla, mientras que en un disco flexible la cabeza de lectura/escritura realmente toca la superficie. Adems, un dispositivo de disco duro gira de manera constante, mientras que un dispositivo
de disco flexible gira y se detiene con cada operacin de lectura/escritura.
Cilindros
El cilindro es el conjunto vertical de todas las pistas con el mismo nmero en cada superficie de un
disco flexible o de un disco duro. Por tanto el cilindro 0 es el conjunto de pistas numeradas con 0,
el cilindro 1 es el conjunto de pistas con nmero 1, y as sucesivamente. Entonces, en un disco
flexible el cilindro 0 consiste en la pista 0 en el lado 1 y la pista 0 en el lado 2; el cilindro 1 consiste
en la pista 1 en el lado 1 y la pista 1 en el lado 2, etc. Cuando se escribe un archivo, el sistema llena
todas las pistas de un cilindro y despus avanza las cabezas de lectura/escritura al cilindro siguiente.
Una referencia a las caras (cabezas) de un disco, pistas y sectores es por medio de un
nmero. Los nmeros de lado y pista empiezan con 0, pero los sectores pueden ser numerados de
una de dos formas:
1. Direccin pista-cilindro: Los nmeros de sector en cada pista inician con 1, as que el
primer sector en el disco tiene la direccin cilindro 0, pista 0, sector 1.
Organizacin d e l a l m a c e n a m i e n t o e n d i s c o
284
2.
Captulo 1 6
Nmero de sector relativo: Los sectores pueden ser numerados de manera relativa al inicio
del disco, de modo que el primer sector en el disco que est sobre el cilindro 0, pista 0,
tiene la direccin de sector relativo 0.
Controlador de disco
El controlador de disco est localizado entre el procesador y la unidad de disco y maneja toda la
comunicacin entre ellos. El controlador acepta informacin del procesador y la convierte una
forma que pueda usar el dispositivo. Por ejemplo, el procesador puede enviar una peticin de
datos de un cilindro, cabeza de disco y sector especficos. El papel del controlador es proporcionar los comandos apropiados para mover el brazo de acceso al cilindro necesario, seleccionar la
cabeza de lectura/escritura y aceptar la informacin del sector cuando sta llegue a la cabeza de
lectura/escritura.
El procesador est liberado para otras tareas mientras el controlador realiza su trabajo. Bajo
este enfoque, el controlador maneja slo un byte a la vez. Sin embargo, el controlador tambin
puede realizar E/S ms rpidas evitando al procesador por completo y transfiriendo la informacin de manera directa a la memoria y desde ella. El mtodo de transferir un bloque grande de
datos de esta manera es conocido como acceso directo a memoria (DMA). Para este fin, el
procesador proporciona al controlador con el comando de lectura o escritura, la direccin del
bfer de E/S en memoria, el nmero de sectores a transferir y el nmero de cilindro, cabeza y
sector inicial. Con este mtodo, el procesador tiene que esperar hasta que el DMA est completo,
ya que slo un componente a la vez puede utilizar la ruta a la memoria.
Grupos
Un grupo es un conjunto de sectores que el DOS trata como una unidad de espacio de almacenamiento. El tamao de grupo siempre es una potencia de 2, como 1, 2, 4 u 8 sectores. Por lo comn
un disco duro tiene cuatro sectores por grupo. En un dispositivo de disco que utiliza un sector por
grupo, sector y grupo son lo mismo. Un archivo empieza en una frontera de grupo y necesita un
mnimo de un grupo aunque el archivo slo ocupe uno de los cuatro sectores.. Un grupo se puede
traslapar de una pista a otra.
Un disco con dos sectores por grupo se vera as:
sector
sector
sector
grupo
sector
sector
sector
grupo
grupo
sector
sector
grupo
sector
sector
sector
sector
sector
grupo
Capacidad
5.25"
5.25"
3.5"
3.5"
3.5"
285
Pistas por
lado
(cilindros)
Sectores
por pista
Bytes
por
sector
Total,
dos
lados
Sectores
por
grupo
40
80
80
80
80
9
15
9
18
36
512
512
512
512
512
368,640
1,228,800
737,280
1,474,560
2,949,120
2
1
2
1
360KB
1.2MB
720KB
1.44MB
2.88MB
En los discos duros, las capacidades varan considerablemente por dispositivo y por particin. Las operaciones tiles para la determinacin del nmero de cilindros, sectores por pista o
cabezas de lectura/escritura incluyen las funciones 1FH y 440DH con cdigo secundario 60H,
ambas de la INT 21H, y tratadas en el captulo 18.
FAT
Directorio
Archivos de sistema
Archivos de
sistema
Archivos
de usuario
rea de datos
Organizacin d e l a l m a c e n a m i e n t o e n d i s c o
286
Dispositivo
5.25"
5.25"
3.5"
3.5"
360KB
1.2MB
720KB
1.44MB
Arranque
FAT
Directorio
0
0
0
0
1-4
1-14
1-6
1-18
5-11
15-28
7-13
19-32
Captulo 1 6
Sector/Grupo
2
1
2
1
En los discos duros, las ubicaciones del registro de arranque y de la FAT por lo comn son
las mismas que para un disco flexible; el tamao de la FAT y la ubicacin del directorio varan por
dispositivo.
rea de datos
El rea de datos en un disco o disco flexible de arranque empieza con los archivos del sistema
DOS llamados IOSYS.SYS y MSDOS.COM (para MS-DOS) o IBMBIO.COM e IBMDOS.COM
(para IBM PC DOS). Cuando utiliza FORMAT /S para formatear un disco, el DOS copia sus
archivos de sistema a los primeros sectores del rea de datos. Los archivos del usuario siguen de
manera inmediata a los archivos de sistema o, si no existen archivos de sistema, empiezan al inicio
del rea de datos.
Un disco flexible de dos lados formateado con nueve sectores por pista contiene la informacin siguiente:
Lado O,
Lado O,
Lado O,
Lado 1,
Lado 1,
pista O,
pista O,
pista O,
pista O,
pista O,
sector 1
sectores
sectores
sectores
sectores
2-3
4-7
1-3
4 y sig.
Registro de arranque
Tabla de asignacin de archivos (FAT)
Directorio
Directorio
rea de datos
Los registros para los archivos de datos empiezan en el lado 1, pista O, sector 3 al 9. El
sistema almacena los registros siguientes en el lado O, pista 1, despus en el lado 1, pista 1,
despus lado O, pista 2, y as sucesivamente. Esta caracterstica de llenado de datos en pistas
opuestas (en el mismo cilindro) antes de proceder con el siguiente cilindro reduce el movimiento
de la cabeza del disco y es el mtodo usado en ambos tipos de discos, flexibles y duros.
Para otros dispositivos, la FAT y el directorio pueden ser de longitudes diferentes. Las
secciones siguientes estudian en detalle el registro de arranque, directorio y la FAT.
REGISTRO DE ARRANQUE
El registro de arranque contiene las instrucciones que cargan (o "arrancan") los archivos del
sistema IOS YS. SYS, MSDOS.COM y COMMAND.COM (si est presente) desde el disco a la
memoria. Todos los discos formateados tienen este registro aun cuando no estn almacenados en
ellos los archivos de sistema. El registro de arranque contiene la informacin siguiente, en orden
de direccin de desplazamiento:
OOH
03H
OBH
ODH
Directorio
287
OEH
10H
11H
13H
15H
Sectores reservados
Nmero de copias de la FAT (1 o 2)
Nmero de entradas en el directorio raz
Si el volumen es menor que 32 MJ3, nmero total de sectores
Byte de descripcin de medio (igual al primer byte de la FAT, descrita posteriormente)
16H
Nmero de sectores para la FAT
18H
Nmero de sectores por pista
1AH Nmero de cabezas (lados o superficies) de lectura/escritura
1CH Nmero de sectores ocultos
1EH Cargador de la rutina de arranque para las versiones del DOS hasta la 3.3
20H
Si el volumen es menor que 32 MB, nmero total de sectores
24H
Nmero de unidad fsica (para discos flexibles, A = 0; para disco duro, 80H =
unidad C, etc.)
25H
Reservado por el DOS
26H
Sector ampliado de arranque (contiene 29H)
27H
Identificacin del volumen
2BH Etiqueta del volumen
36H
Reservado por el DOS
3EH-1FFH A partir de DOS 4.0, el cargador de arranque inicia aqu.
El DOS 4.0 ampla el registro de arranque con campos adicionales desde 20H hasta 1FFH.
Por tanto, el registro original de arranque es de 20H (32) bytes, mientras que la versin ampliada
es de 200H (512) bytes.
DIRECTORIO
Todos los archivos en un disco empiezan en una frontera de grupo, que es el primer sector del
grupo. Para cada archivo, el DOS crea una entrada de directorio de 32 (20H) bytes que describe
el nombre del archivo, la fecha en que fue creado, su tamao y la ubicacin de su grupo inicial.
Las entradas del directorio tienen el formato siguiente:
BYTE
PROPSITO
00H-07H
08H-0AH
Organizacin d e l a l m a c e n a m i e n t o e n d i s c o
288
Captulo 1 6
04H
08H
0CH-15H
16H-17H
18H-19H
1AH-1BH
1CH-1FH
Para campos numricos que excedan un byte en el directorio, los bytes son almacenados en
secuencia inversa de bytes.
FOH
FOH
F8H
F9H
F9H
FCH
FDH
FFH
289
Observe que FOH y F9H identifican, cada uno, a dos diferentes formatos de disco.
Segunda entrada de la FAT
La segunda entrada de la FAT contiene FFFFH para FAT de discos flexibles que permiten el uso
de entradas de la FAT de 12 bits y FFFFFFH para discos duros que permiten el uso de entradas
de la FAT de 16 bits. Las primeras dos entradas de la FAT se ven as:
Disco
flexible
1.44MB
Disco duro
FO
FF
FF
F8
FF
FF
FF
rea de datos
u. de asig. n
^
Esperara que el rea de datos estuviera en el punto inicial para los grupos, pero en lugar de
eso, los primeros dos nmeros del grupo (0 y 1) apuntan al directorio, de modo que el rea de datos
para almacenar archivos de datos empieza en el grupo nmero 2. La razn de este estado de cosas
pronto se ver clara.
Apuntadores a entradas de apuntadores en la FAT
Despus de las primeras dos entradas de la FAT estn las entradas de apuntadores que relacionan
a cada grupo en el rea de datos. El directorio (en 1AH-1BH) contiene la ubicacin del primer
grupo para un archivo y la FAT contiene una cadena de entradas de apuntadores para cada uno de
los grupos que le suceden.
Desde el DOS 3.0, la longitud de la entrada para discos flexibles es de tres dgitos
hexadecimales (IVi byte, o 12 bits) pero para disco duro es de cuatro dgitos hexadecimales (2
bytes o 16 bits). Cada entrada de apuntador de la FAT indica el uso de un grupo particular de
acuerdo con el formato siguiente:
12 bits
16 bits
ooo
nnn
FF0-FF6
FF7
0000
nnnn
FFF0-FFF6
FFF7
FFF
FFFF
Explicacin
Grupo referenciado, actualmente sin usarse
Nmero relativo al grupo que sigue de un archivo
Grupo reservado
No se puede usar (pista daada)
ltimo grupo del archivo
Organizacin d e l a l m a c e n a m i e n t o e n d i s c o
290
Captulo 1 6
Las primeras dos entradas en un disco flexible de 1.44MB (12 bits) se ven as:
FOF
U.
de
asignacin
relativa:
FF.
...
fin
de a s i g n a c i n r e l a t i v a :
FFF
1
003
2
004
FFF
...
fin
Para las dos primeras entradas de la FAT, F0 indica un disco de dos caras con nueve sectores
(1.44MB), seguido por FFFFH. Para leer CUSTOMER.FIL del disco y enviarlo a memoria, el
sistema realiza los pasos siguientes:
En el directorio del disco, busca el nombre de archivo CUSTOMER y la extensin FIL. El
DOS extrae del directorio la ubicacin del primer grupo relativo (2) del archivo y enva su
contenido (datos de los sectores) al programa en la memoria principal.
Accesa la entrada de apuntador de la FAT que representa el grupo relativo 2. Segn el
diagrama, esta entrada contiene 003, lo que significa que el archivo contina en el grupo
relativo 3. El DOS enva el contenido de este grupo al programa.
Accesa la entrada de apuntador de la FAT que representa el grupo relativo 3. Esta entrada
contiene 004, y significa que el archivo contina en el grupo relativo 4. El DOS enva el
contenido de este grupo al programa.
La entrada de la FAT para el grupo relativo 4 contiene FFFH para indicar que no hay ms
grupos asignados para este archivo. Ahora el DOS ya ha enviado todos los datos del archivo,
desde los grupos 2, 3 y 4.
Slo hemos visto el principio de funcionamiento de las entradas de la FAT; ahora veamos
cmo funcionan en trminos de secuencia inversa de bytes, en donde se requiere un poco ms de
ingenio.
291
de asignacin relativa:
FOF
FFF
034
000
FFO
F'xx
Pero ahora es preciso para descifrar las entradas representarlas segn el byte relativo, y no el
grupo:
Entrada de la FAT:
Byte
relativo:
FO
FF
FF
03
40
00
FF
OF
F8FF
FFFF
0300
0400
0500
FFFF
de asignacin relativa:
La entrada de la FAT para el grupo relativo 2, 0300, se invierte como 0003 para el grupo siguiente. La entrada de la FAT para el grupo relativo 3, 0400, se invierte como 0004 para el grupo
Organizacin d e l a l m a c e n a m i e n t o e n d i s c o
292
Captulo 16
siguiente. Contine con la cadena de entradas restantes de esta manera hasta la entrada para el
nmero de grupo 5.
Si su programa ha determinado el tipo de disco que est instalado, puede verificar el descriptor
de medio directamente en el sector de arranque o, de preferencia, emplear la funcin 1BH o 1CH de
la INT 21H del DOS.
100
20
(para
la
u n i d a d B,
utilice
100
20)
293
F9
FF
FF
FF
4F
00
FF
OF
relativo:
F9 es el descriptor de medio.
FF FF en bytes 1 y 2 es el contenido del segundo campo.
Los apuntadores a entradas que inician en el byte 3 pueden ser calculados como:
Para el primer archivo, multiplique 2 (su primer grupo) por 1.5 para obtener 3. Accese los
bytes con desplazamiento 3 y 4 en la FAT, que contienen FF 4F, e invierta los bytes para
obtener 4 F F F . Como el grupo 2 fue un nmero par, utilice los ltimos tres dgitos, FFF,
que le indican que no existen ms grupos para este archivo.
Para el segundo archivo, multiplique por 3 (su primer grupo) por 1.5 para obtener 4. Accese
los bytes con desplazamiento 4 y 5 en la FAT, que contienen 4F 00, e invierta los bytes para
obtener 004F. Como el grupo 3 fue un nmero impar, utilice los primeros tres dgitos, 004,
que identifican el grupo siguiente en la serie. Multiplique el nmero de grupo, 4, por 1.5
para obtener 6. Accese los bytes con desplazamiento 6 y 7 en la FAT, los cuales contienen
FF 0F, e invierta los bytes para obtener 0FFF. Como el grupo 4 fue un nmero par, utilice
los primeros tres dgitos, FFF, que indican el final de los datos.
Discos de 1.44MB. Ahora inserte el disco flexible de 1.44MB en la unidad A, e ingrese el
comando L 100 0 0 30 de DEBUG. (Carga 30H sectores porque hay ms FAT en los discos de
1.44MB.) Despliegue el registro de arranque de este disco y observe que el byte del descriptor de
medio en 115H es F0 y el nmero de sectores por grupo (en 10DH) es 1. Los directorios en 2700H
y 2720H deben mostrar que el grupo inicial para el primer archivo es 2 y para el segundo es 4. (El
grupo inicial para el segundo archivo en el disco de 720 K fue 3 porque el formato tiene dos
sectores por grupo.)
Despliegue la FAT en 300H, que aparece como
Entrada de la FAT:
Byte
relativo:
| FO
FF
FF
03
FO
FF
05
60
00
07
FO
FF
10
11
Ya que el primer archivo inicia en el grupo 2, multiplique 2 por 1.5 para obtener el byte
relativo 3. Los bytes 3 y 4 contienen 03 F0, que se invierten como F003. Como el grupo 2 fue un
nmero par, utilice los ltimos tres dgitos, 003. Grupo 3 x 1.5 es 4; los bytes relativos 4 y 5
contienen F0 F F , que se invierten como FFF0. Puesto que el grupo 3 fue un nmero impar, utilice
los primeros tres dgitos, FFF, que indican que el archivo ya no contina. Ahora sabemos que el
archivo reside en los grupos 2 y 3.
Utilice la misma tcnica para seguir la pista de la cadena del segundo archivo, que inicia con
el grupo 4, byte relativo 6.
El DOS proporciona algunos servicios de soporte de programas para accesar informacin
acerca del directorio y de la FAT. Las funciones 47H (obtener el directorio actual) y 1BH y 1CH
(obtener informacin de la FAT) son descritas en el captulo 18.
Organizacin d e l a l m a c e n a m i e n t o e n d i s c o
294
Captulo 16
nombre
nombre
Preguntas
295
Sin importar el tamao, todos los archivos inician en una frontera de grupo.
El registro de arranque contiene las instrucciones que cargan (o "arrancan") los archivos de
sistema IOSYS.SYS, MSDOS.COM y COMMAND.COM del disco a la memoria.
El directorio contiene una entrada para cada archivo en un disco e ndica el nombre del
archivo, la extensin, atributo de archivo, hora, fecha, sector de inicio y tamao del archivo.
El propsito de la tabla de asignacin de archivos (FAT) es asignar espacio en disco para los
archivos. La FAT inicia en el sector 2 inmediatamente despus del registro de arranque y
contiene una entrada por cada grupo para cada archivo en el directorio.
PREGUNTAS
16-1.
16-2.
16-3.
16-4.
CAPTULO 17
Procesamiento en disco:
IEscritura y lectura de archivos
OBJETIVO
INTRODUCCIN
Los servicios originales del DOS para procesamiento de archivos en disco usaban un mtodo
llamado bloques de control de archivo (FCB). Este mtodo, aunque el DOS le da soporte, puede
direccionar unidades y nombres de archivo pero no subdirectorios. Las versiones subsecuentes
del DOS introdujeron varios servicios ampliados ms simples que sus contrapartes originales, y
en general son recomendables. Algunas de estas operaciones implican el uso de una cadena ASCIIZ
para identificar inicialmente una unidad, una rufa y un nombre de archivo; un manejador de
archivo para acceso subsecuente del archivo; y un cdigo de regreso especial para identificar
errores. Como un recordatorio, el trmino grupo denota a un conjunto de uno o ms sectores de
datos, dependiendo del dispositivo.
Aunque no se requiere ninguna instruccin de lenguaje ensamblador, este captulo introduce varios servicios de la interrupcin 21H del DOS para procesamiento de archivos en disco. Aqui
estn ordenadas por categora:
OPERACIONES QUE USAN MANEJADORES DE ARCHIVO
3CH
3DH
3EH
296
Crea archivo
Abre archivo
Cierra archivo
OFH
10H
14H
Abre archivo
Cierra archivo
Lee registro
Manejadores de archivo
3FH
40H
42H
297
Lee registro
Escribe registro
Mueve apuntador de archivo
15H
16H
21H
Escribe registro
Crea archivo
Lectura directa de registro
INT 25H
INT 26H
27H
28H
Lectura absoluta
Escritura absoluta
El captulo trata los servicios del DOS para escribir y leer archivos en disco. El captulo 18 cubre
los diferentes servicios que se requieren para el manejo de unidades de disco, directorios y archivos.
CADENAS ASCIIZ
Cuando emplee muchos de los servicios ampliados para procesamiento de disco, primero indique
al DOS la direccin de un cadena ASCIIZ que contenga la ubicacin del archivo: unidad de disco,
ruta al directorio y nombre de archivo (todas opcionales y entre apstrofos), seguidos por un byte
de ceros hexadecimales; de ah el nombre de cadena ASCIIZ (zeros, en ingls). La longitud
mxima de la cadena es de 128 bytes.
El cdigo siguiente define una unidad y un nombre de archivo:
PATHNMl DB ' D : \TEST . ASM' , 0 0H
DB
D:\UTILITY\NU.EXE',00H
La diagonal inversa tambin puede ser diagonal derecha, acta como un separador de ruta. Un
byte de ceros termina la cadena. Para interrupciones que necesiten de una cadena ASCIIZ, cargue
su direccin de desplazamiento en el registro DX por ejemplo, como
LEA
DX,PATHNAME.
MANEJADORES DE ARCHIVO
Como se estudi en el captulo 9, puede usar manejadores de archivos de manera directa para
ciertos dispositivos estndar: 00 = entrada, 01 = salida, 02 = error de salida, 03 = dispositivo
auxiliar y 04 = impresora. Muchos de los servicios del DOS tambin implican el uso de un manejador de archivo para operaciones que accesan archivos, y usted debe solicitar un nmero de
manejador de archivo desde el DOS. Un archivo en disco primero debe ser abierto; a diferencia
de la transferencia de informacin desde el teclado o a la pantalla, el DOS tiene que direccionar
los archivos en disco por medio de su directorio y entradas de la FAT y debe actualizar estas
entradas. Durante la ejecucin del programa, cada archivo referenciado debe ser asignado a su
propio y nico manejador de archivo.
El DOS enva un manejador de archivo cuando usted abre un archivo para entrada o crea un
archivo para salida. Las operaciones implican el uso de una cadena ASCIIZ y la funcin 3CH o
3DH del DOS. El manejador de archivo es un nmero nico de una palabra regresado en el AX
que usted guarda en un elemento del rea de datos y que utiliza para todas las peticiones subsecuentes
de acceso al archivo. En forma comn, el primer manejador de archivo que se regresa es 05, el
segundo es 06 y as sucesivamente.
298
Captulo 1 7
El PSP contiene una tabla de manejadores de archivo por omisin que proporciona 20
manejadores (y por tanto el lmite nominal para archivos abiertos), pero la funcin 67H de la INT
21H puede ser usada para aumentar el lmite, como se explica en el captulo 24.
CDIGOS DE ERROR DE REGRESO
Las operaciones de manejador de archivo en disco regresan un estado de terminacin por medio
de la bandera de acarreo y el registro AX. Una operacin exitosa pone en cero la bandera de
acarreo y realiza otras funciones apropiadas. Una operacin no exitosa pone en uno a la bandera
de acarreo y regresa un cdigo de error en el AX, dependiendo de la operacin. La figura 17-1
lista los cdigos de error 01-36; otros cdigos se refieren a redes.
Si estos errores no son suficientes, tambin puede usar la INT 59H para informacin adicio
nal acerca de errores (vase el captulo 18).
La seccin siguiente cubre los requisitos para crear, escribir y cerrar archivos en disco par
el DOS ampliado.
01
02
03
04
05
06
07
08
09
10
11
12
13
15
16
17
18
19
Figura 17-1
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Unidad desconocida
Unidad no preparada
Comando desconocido
Error de datos CRC
Longitud incorrecta en la estructura
Error de bsqueda
Tipo de medio desconocido
Sector no encontrado
Impresora sin papel
Falla al escribir
Falla al leer
Falla generalizada
Violacin de comparticin
Violacin de bloqueo
Cambio no vlido de disco
FCB no disponible
Desbordamiento del bfer compartido
APUNTADORES DE ARCHIVO
El DOS mantiene un apuntador de archivo separado para cada archivo que un programa est
procesando. Las operaciones de crear y abrir fijan el valor del apuntador de archivo en cero, 1
posicin inicial del archivo. El apuntador de archivo toma en cuenta de manera subsecuente (
desplazamiento de la ubicacin actual dentro del archivo.
Cada operacin de lectura/escritura hace que el DOS incremente el apuntador de archivo pe
el nmero de bytes transferidos. Entonces, el apuntador de archivo apunta a la posicin del registr
siguiente a ser accesado. Los apuntadores de archivo facilitan tanto el procesamiento secuenci;
como el directo. Para procesamiento directo, puede usar la funcin 42H del DOS (estudiada en ]
ltima seccin) para colocar el apuntador de archivo en cualquier posicin en un archivo.
USO DE MANEJADORES DE ARCHIVO PARA CREAR ARCHIVOS EN DISCO
El procedimiento para escribir en un archivo es el siguiente:
1. Utilice una cadena ASCIIZ para obtener manejador de archivo del DOS.
299
DB
'D:\ACCOUNTS.FIL' , 00H
HANDLE1
DW
MOV
AH,3 CH
MOV
CX, 0 0
,-Atributo normal
LEA
DX,PATHNMl
;Cadena ASCIIZ
INT
21H
;Llama al DOS
JC
error
MOV
HANDLE1,AX
sale
Para operacin vlida, el DOS crea una entrada de directorio con el atributo dado, limpia la
bandera de acarreo y establece el manejador para el archivo en el AX. Utilice este manejador de
archivo para todas las operaciones subsecuentes del disco. El archivo nombrado est abierto con
su apuntador de archivo fijado en cero y ahora est preparado para escritura. Si un archivo con el
nombre dado ya existe en la ruta, la operacin configura a cero la longitud para sobreescribir
el nuevo archivo en el anterior.
En condicin de error, la operacin pone en uno la bandera de acarreo y regresa un cdigo
en el AX: 0 3 , 04 o 05 (vase la figura 17-1). El cdigo 05 significa que o bien el directorio est
lleno o bien el nombre de archivo referenciado tiene el atributo de slo lectura. Asegrese de
examinar primero la bandera de acarreo. Por ejemplo, la creacin de un archivo tal vez enva el
manejador 05 al AX, lo cual con facilidad puede ser confundido con el cdigo de error 05, acceso
denegado. Los servicios relacionados para crear un archivo son 5AH y 5BH, estudiados en el
captulo 18.
I N T 21H, funcin 40H: Escribe registro
Para escribir registros en disco, utilice la funcin 40H del DOS. Cargue el BX con el manejador
de archivo almacenado, el CX con el nmero de bytes a escribir y el DX con la direccin del rea de
salida. El ejemplo siguiente utiliza el manejador de archivo de operacin de creacin precedente para escribir un registro de 256 bytes desde OUTREC:
HANDLEl
DW
OUTREC
DB
255 D U P ( '
MOV
AH,4 0H
MOV
BX,HANDLEl
Manejador de archivo
MOV
CX,256
Longitud del
DX,OUTREC
21H
Llama al DOS
LEA
INT
')
;rea de salida
registro
salida
300
JC
error2
/Prueba
CMP
AX,256
/Se
JNE
por
han
Captulo 1 7
error
escrito
todos
los
bytes?
error3
Una operacin vlida escribe los registros en el disco, incrementa el apuntador de archivo y hace
el AX igual al nmero de bytes realmente escritos. Un disco lleno puede causar que el nmero de
escritos difiera del nmero requerido, aunque el DOS no reporta esta condicin como error. Una
operacin no vlida pone en uno la bandera de acarreo y regresa en el AX el cdigo de error 05
(acceso denegado) o 06 (nmero de manejador no vlido).
INT 21H, funcin 3EH: Cierra archivo
Cuando ha terminado de escribir en un archivo, tiene que cerrarlo. Cargue el manejador de
archivo en el BX y utilice la funcin 3EH del DOS:
MOV
AH,3EH
/Peticin
MOV
BX,HANDLE1
/Manejador
INT
21H
/Llama
al
para
de
cerrar
archivo
DOS
Una operacin correcta de cierre escribe cualquier registro restante en el bfer de la memoria y
actualiza la FAT y el directorio con la fecha y tamao del archivo. Una operacin no exitosa pone
en uno la bandera de acarreo y regresa el nico cdigo de error posible en el AX, 06 (manejador
no vlido).
Programa: Uso de manejador de archivo para crear un archivo
El programa de la figura 17-2 crea un archivo de nombres que un usuario ingresa desde un
teclado. Sus procedimientos principales son los siguientes.
C10CREA Utiliza la funcin 3CH para crear el archivo y guarda el manejador en un elemento de dato llamado HANDLE.
D10PROC Acepta entrada desde el teclado y limpia las posiciones desde el final del nombre
al final del rea de entrada.
F10WRIT
G10CLSE Al final del procedimiento, utiliza la funcin 3EH para cerrar el archivo a fin
de crear una entrada de directorio apropiada.
El rea de entrada es de 30 bytes, seguida por 2 bytes para los caracteres Enter (ODH) y
Avance de lnea (OAH), para un total de 32 bytes. El programa escribe los 32 bytes como un
registro de longitud fija. Puede omitir los caracteres Enter/Av. de lnea, pero debe incluirlos si
quiere ordenar los registros en el archivo, ya que el programa SORT del DOS necesita estos
caracteres para indicar el fin de los registros. Para este ejemplo, el comando SORT para ordenar
los registros de NAMEFILE.DAT en orden ascendente y dejarlo en NAMEFILE.SRT podra ser
SORT
D:<NAMEFILE.DAT
>NAMEFILE.SRT
TITLE
P17HANCR (EXE)
.MODEL
SMALL
.STACK
64
NAMEPAR
MAXLEN
NAMELEN
NAMEREC
.DATA
LABEL
DB
DB
DB
ERRCDE
HANDLE
PATHNAM
PROMPT
ROW
OPNMSG
WRTMSG
DB
DW
DB
DB
DB
DB
DB
BEGIN
.CODE
PROC
MOV
MOV
MOV
MOV
CALL
CALL
CALL
CMP
JZ
JMP
301
BYTE
30
7
30 DUPC ") ODH, OAH
Lista de p a r m e t r o s :
Longitud mxima
Longitud actual
Nombre ingresado,
CR/LF para escribir
00
Indicador de error
7
Manejador de archivo
'D:\NAMEFILE.DAT', 0
'ame ?
01
'*** Open error
***', ODH, OAH
'*** Write error ***', ODH, OAH
1
FAR
AX,@data
DS, AX
ES, AX
AX,0600H
Q10SCR
Q2 0CURS
C10CREA
ERRCDE,00
A2 0LOOP
A90
Inicializa el
segmento de datos
;Limpia la pantalla
,- Coloca el cursor
;Crea archivo; designa DTA
;Error al crear?
s, continuar
no, salir
A2 0LOOP:
A90 :
BEGIN
CALL
CMP
JNE
CALL
MOV
INT
ENDP
DIOPROC
NAMELEN, 0 0
A20LOOP
G10CLSE
AX,4C00H
21H
Fin de la entrada?
no, continuar
s, cerrar,
Salir al DOS
PROC
MOV
MOV
LEA
INT
JC
MOV
RET
NEAR
AH,3CH
CX,00
DX, PATHNAM
21H
C20
HANDLE, AX
LEA
CALL
RET
ENDP
DX,OPNMSG
X10ERR
C20 :
COCREA
Acepta
<
D10PROC
Hubo error?
no, guardar el manejador
s, desplegar
mensaje de error
entrada:
PROC
MOV
MOV
MOV
LEA
INT
NEAR
AH,40H
BX, 01
CX, 06
DX, PROMPT
21H
MOV
LEA
AH, OAH
DX, NAMEPAR
Figura 17-2
Peticin de despliegue
Manej ador
Longitud de la indicacin
Despliega la indicacin
Entrada de la p e t i c i n
Acepta nombre
302
INT
21H
NAMELEN,0 0
CMP
JZ
D90
AL,20H
MOV
CH,CH
SUB
MOV
CL,NAMELEN
LEA
DI,NAMEREC
DI,CX
ADD
NEG
CX
ADD
CX, 30
REP STOSB
CALL
F10WRIT
CALL
E10SCRL
Existe un nombre?
;
no, salir
Limpiar para almacenar
;Longitud
;Direccin + longitud
,-Calcula l a l o n g i t u d
restante
;Asigna blancos
, E s c r i b e r e g i s t r o a d i s c o
,-Verifica p a r a r e c o r r i d o
D90 :
D10PROC
RET
ENDP
Verifica
E10SCRL
PROC
CMP
JAE
INC
JMP
NEAR
ROW,18
E10
ROW
E90
MOV
CALL
CALL
RET
ENDP
AX,0601H
Q10SCR
Q20CURS
para
recorrido:
; S e l l e g a l a p a r t e inf<
;
s, continuar
;
no, s u m a r al r e n g l n
E10 :
E90 :
E10SCRL
PROC
MOV
MOV
MOV
LEA
INT
JNC
LEA
CALL
MOV
un
Restablecer
registro en
Escribe
F10WRIT
;Recorrer
NEAR
AH,40H
BX,HANDLE
CX, 32
DX,NAMEREC
21H
F20
DX,WRTMSG
X10ERR
NAMELEN,0 0
el
cursor
disco:
;Peticin
;30
rengln
para
de
el
escritura
nombre
/Escritura vlida?
; no,
;
l l a m a a la r u t i n a
de
pa
ei
F20 :
F10WRIT
RET
ENDP
Cierra
G10CLSE
PROC
MOV
CALL
MOV
MOV
INT
RET
ENDP
archivo
NEAR
NAMEREC,1AH
F10WRIT
AH,3EH
BX,HANDLE
21H
Recorre
Q10SCR
Q10SCR
PROC
MOV
MOV
MOV
INT
RET
ENDP
NEAR
BH,1EH
CX,0000
DX,184FH
10H
la
en
disco:
;Coloca
la
;Peticin
marca
para
EOF
cerrar
pantalla:
;AX e s t a b l e c e e n t r a d a
,-Designa a m a r i l l o s o b r e
Recorre
Figura 17-2
(continuacin)
azul
Captulo 1 7
Q2 0CURS
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
NEAR
AH,02H
BH, 00
DH,ROW
DL, 00
10H
303
cursor:
;Peticin
para colocar el
/Rengln
;Columna
cursor
X10ERR
PROC
MOV
MOV
MOV
INT
MOV
RET
ENDP
END
NEAR
AH,40H
BX, 01
CX, 21
21H
ERRCDE,01
,-DX contiene
,- direccin del mensaje
;Longitud
;Designa cdigo del
error
BEGIN
Figura 17-2
(continuacin)
facilitar el ordenamiento y de otra forma podran ser omitidos. (2) Los registros pueden ser de
longitud variable; esto implicara algo de programacin extra, como se ver posteriormente.
Utilice una cadena ASCIIZ para obtener un manejador de archivo del DOS.
Utilice la funcin 3DH del DOS para abrir el archivo.
Utilice la funcin 3FH del DOS para leer registros del archivo.
Al final, utilice la funcin 3EH del DOS para cerrar el archivo.
0-2
3
4-6
7
PETICIN
MOV
AH,3DH
AL, 00
archivo
304
LEA
INT
21H
JC
error4
MOV
Cadena
DX,PATHNM1
Llama
Si
hay
Guarda
HANDLE2,AX
Captulo 1 7
ASCIIZ
al
DOS
error,
el
sale
manejador
en
una
palabra
Si un archivo con el nombre dado existe, la operacin establece la longitud del registro en
uno (el cual puede pasarse por alto), asume el atributo actual del archivo, establece el apuntador
de archivo a cero (el inicio del archivo), pone en cero la bandera de acarreo y establece un manejador
para el archivo en el AX. Utilice este manejador de archivo para todas las operaciones subsecuentes.
Si el archivo no existe, la operacin pone en uno la bandera de acarreo y regresa un cdigo
de error en el AX: 02, 0 3 , 04, 05 o 12 (vase la figura 17-1). Asegrese de examinar primero la
bandera de acarreo. Por ejemplo, al crear un archivo tal vez enve el manejador 05 al AX, lo cual
podra con facilidad ser confundido con el cdigo d^ error 05, acceso denegado.
INT 21H, funcin 3FH: Lee registro
Para leer registros, utilice la funcin 3FH del DOS. Cargue el manejador de archivo en el BX, el
nmero de bytes a leer en el CX y la direccin del rea de entrada en el DX. El cdigo siguiente
lee un registro de 512 bytes:
DW
DB
512
MOV
AH,3FH
;Peticin
MOV
BX,HANDLE2
;Manejador
MOV
CX,512
, L o n g i t u d d e l r e g i s t r o
LEA
DX,INPREC
;Direccin
DUP(
')
INT
21H
:Llama
JC
error5
;Prueba
CMP
AX, 00
;Cero
JE
finarchv
al
de
lectura
de
de
registro
archivo
del
rea
de
entrada
DOS
por
error
bytes
por
leer?
Una operacin vlida enva el registro al programa, pone en cero la bandera de acarreo y establece
el AX al nmero de bytes que en realidad se ley. Cero en el AX significa un intento de leer despus
del fin de archivo; sta es un advertencia, no un error. Una lectora no vlida pone en uno la bandera de
acarreo y regresa al AX el cdigo de error 05 (acceso denegado) o 06 (manejador no vlido).
Ya que DOS limita el nmero de archivos abiertos al mismo tiempo, un programa que de
manera sucesiva lee varios archivos debe cerrarlos tan pronto como sea posible.
Programa: Uso de manejador de archivo para leer un archivo
El programa de la figura 17-3 lee el archivo creado por el programa de la figura 17-2 y ordenad(
por el comando SORT del DOS. A continuacin estn los procedimientos principales:
E10OPEN Utiliza la funcin 3DH del DOS para abrir el archivo y guarda el manejador ei
un elemento de datos llamado HANDLE.
F10READ
Emite la funcin 3FH del DOS, que utiliza el manejador para leer los registros
TITLE
ENDCDE
HANDLE
IOAREA
OPENMSG
PATHNAM
READMSG
ROW
BEGIN
P17HANRD (EXE)
.MODEL
SMALL
.STACK
64
.DATA
DB
DW
DB
DB
DB
DB
DB
32 D U P ( ')
* * * Open error ***', ODH, OAH
'D:\NAMEFILE. SRT ' , o
* * * Read error ***', ODH, OAH
00
.CODE
PROC
MOV
MOV
MOV
MOV
CALL
CALL
CALL
CMP
JNZ
FAR
AX,@data
DS, AX
ES, AX
AX,0600H
Q10SCR
Q2 0CURS
E10OPEN
ENDCDE, 00
A90
CALL
CMP
JNZ
CALL
JMP
F10READ
ENDCDE,00
A90
G10DISP
A2 0LOOP
MOV
INT
ENDP
AX,4C00H
21H
00
;Inicializa
; registros de
;
segmento
;Limpia la p a n t a l l a
, Coloca el cursor
,-Abre archivo, designa DTA
/Apertura vlida?
; no, salir
A2 0LOOP:
A90 :
BEGIN
Abre
;
lOOPEN
archivo
PROC
MOV
MOV
LEA
INT
JC
MOV
RET
NEAR
AH,3DH
AL, 00
DX,PATHNAM
21H
E20
HANDLE,AX
/Error?
/ no, guardar manejador
MOV
LEA
CALL
RET
ENDP
ENDCDE,01
DX,OPENMSG
X10ERR
/ s,
/ desplegar
/ mensaje de error
E20:
E10OPEN
FlOREAD
Lee
PROC
MOV
MOV
MOV
LEA
INT
JC
CMP
JE
CMP
JE
JMP
registro de disco:
NEAR
AH,3FH
BX,HANDLE
CX, 32
DX,IOAREA
21H
F20
AX, 00
F3 0
IOAREA, 1AH
F30
F90
Figura 17-3
/Peticin de
lectura
/Error en la lectura?
/Fin del archivo?
/Marcador EOF?
/ s, salir
306
F20 :
LEA
CALL
no,
lectura
DX,READMSG
X10ERR
no
Captulo 1 7
vlida
F3 0 :
F90 :
F10READ
MOV
RET
ENDP
Despliega
G10DISP
Fuerza
ENDCDE,01
PROC
MOV
MOV
MOV
LEA
INT
CMP
JAE
INC
JMP
NEAR
AH,40H
BX, 01
CX, 32
DX,IOAREA
21H
ROW,20
G80
ROW
G90
MOV
CALL
CALL
RET
ENDP
AX,0601H
Q10SCR
Q2 0CURS
la
terminacin
nombre:
Inferior de la pantalla?
s, pasar
no,
incrementar rengln
G80 :
G90 :
G10DISP
Recorrido
<
Q10SCR
Q10SCR
PROC
MOV
MOV
MOV
INT
RET
ENDP
Q2 0CURS
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
el
X10ERR
PROC
MOV
MOV
MOV
INT
RET
ENDP
END
la
pantalla:
AX se design
;Designa color
antes
-Peticin
recorrer
para
cursor:
NEAR
AH,02H
B H , 00
DH,ROW
D L , 00
10H
Despliega
X10ERR
de
NEAR
BH,1EH
CX,0 0 0 0
DX,184FH
10H
Coloca
Q2 0CURS
,- R e c o r r e r
;Colocar cursor
Peticin para
el cursor
rengln
columna
mensaje de
NEAR
AH,40H
BX, 01
CX, 2 0
21H
error
en
colocar
disco:
DX contiene la
Manej ador
Longitud
del mensaje
direccin
BEGIN
Figura 17-3
(continuacin)
G10DISP Despliega los registros y recorre la pantalla. Como los caracteres Enter y Avance
de lnea ya siguen a cada registro, el programa no tiene que avanzar el cursor cuando
despliega los registros.
PROCESAMIENTO DE ARCHIVOS
307
ASCn
Los ejemplos anteriores crearon archivos y los leyeron, pero tambin puede necesitar procesar
archivos ASCII creados por DOS o un editor. Todo lo que necesita saber es la organizacin del
directorio y de la FAT y la forma en que el sistema almacena datos en un sector. Por ejemplo, el
DOS almacena su informacin en un archivo .ASM, exactamente en la forma en que usted lo
teclea, incluyendo los caracteres par el tabulador (09H), Enter (ODH) y el Avance de lnea (OAH).
Para conservar espacio en disco, el DOS no almacena los espacios que aparecen en la pantalla
inmediatamente antes del carcter de tabulacin o los espacios en una lnea a la derecha de un
carcter Enter. Lo siguiente ilustra una instruccin de lenguaje ensamblador como se ingresara
en un teclado:
<Tab>MOV<Tab>AH,09<Enter>
en donde 09H es el Tab, ODH Enter y OAH es el Avance de lnea. Cuando el comando TYPE o un
editor lee el archivo, los caracteres Tab, Enter y Avance de lnea de manera automtica ajustan el
cursor en la pantalla.
Examinemos ahora el programa de la figura 17-4, el cual lee y despliega el archivo
P17HANRD.ASM (de la figura 17-3), un sector a la vez. El programa realiza muchas de las
funciones que el TYPE del DOS, en donde cada lnea despliega todo hasta los caracteres Enter/
Avance de lnea. Como las lneas en un archivo ASCII son de longitud variable, tiene que rastrear
hasta el final cada lnea antes de desplegarla. El recorrido de la pantalla puede ser un problema. Si
usted no realiza pruebas especiales para determinar si ya se ha alcanzado la parte inferior de la
pantalla, la operacin despliega de manera automtica nuevas lneas sobre las anteriores, y si una
de ellas es de mayor longitud, los caracteres anteriores aparecern a la derecha. Para un recorrido
apropiado de la pantalla, tiene que contar renglones y probar si est en la parte inferior de la
pantalla.
El programa lee un sector completo de datos y lo enva a SECTOR. El procedimiento
G10XFER transfiere un byte a la vez desde SECTOR a DISAREA, en donde los caracteres son
desplegados. Cuando se encuentra un Avance de lnea, la rutina despliega el contenido de DISAREA
hasta e incluyendo el Avance de lnea. (La pantalla de despliegue acepta caracteres de tabulacin
09H y coloca de manera automtica el cursor en la siguiente posicin divisible entre ocho.)
El programa tiene que verificar el final del sector (para leer otro sector) y el final del rea de
despliegue. Para archivos ASCII convencionales, como archivos .ASM, cada lnea es relativamente corta y es seguro que terminan con Enter/Avance de lnea. Archivos que no son ASCII,
como los archivos .EXE y .OBJ, no tienen lneas, de modo que el programa tiene que verificar
por el fin de DISAREA para evitar la cada del sistema. El programa est proyectado para desplegar slo archivos ASCII, pero la prueba del final debe asegurarse contra archivos no esperados.
stos son los pasos en G10XFER:
1. Inicializa la direccin de SECTOR y la direccin de DISAREA.
2. Si se lleg al final de SECTOR, lee el sector siguiente. Si se lleg al final del archivo, salir;
de otra forma inicializa la direccin de SECTOR.
308
TITLE
DISAREA
ENDCDE
HANDLE
OPENMSG
PATHNAM
ROW
SECTOR
BEGIN
P 1 7 A S C R D (EXE)
.MODEL
SMALL
.STACK
64
Lee
un
archivo
Capitulo 17
ASCII
.DATA
DB
DW
DW
DB
DB
DB
DB
rea de despliegue
1 2 0 D U P ( ' ' )
Indicador del fin del
00
Manejador de archivo
0
'*** O p e n e r r o r ***'
'D:\17HANRED.ASM', 0
00
512 D U P (
')
;rea de e n t r a d a
.CODE
PROC
MOV
MOV
MOV
MOV
CALL
CALL
CALL
CMP
JNE
FAR
AX,data
DS,AX
ES,AX
AX,0600H
Q10SCR
Q2 0CURS
E10OPEN
ENDCDE,0 0
A90
CALL
CMP
JE
CALL
RlOREAD
ENDCDE,0 0
A9 0
G10XFER
MOV
MOV
INT
MOV
INT
ENDP
AH,3EH
BX,HANDLE
21H
AX,4C00H
21H
proceso
Procedimiento principal
Inicializa
registros de
segmentos
Limpia la pantalla
Coloca el cursor
Abre archivo
Apertura vlida?
no, salir
s, continuar
Lee p r i m e r sector del disco
Fin del archivo, no hay datos?
s, salir
D e s p l i e g a y lee
A2 0LOOP:
A90:
BEGIN
Abre
E10OPEN
Peticin
Sale
archivo
PROC
MOV
MOV
LEA
INT
JNC
CALL
RET
NEAR
AH,3DH
AL, 00
DX, PATHNAM
21H
E20
XI0ERR
MOV
RET
ENDP
HANDLE, AX
en
al
para
cerrar
archivo
DOS
disco:
Peticin para
,-Slo l e c t u r a
abrir
E20 :
E10OPEN
;Guardar
Transfiere
G10XFER
PROC
CLD
LEA
NEAR
LEA
DI,DISAREA
datos a
la
,-De
manejador
lnea
de
izquierda
despliegue:
derecha
SI,SECTOR
G20 :
G30 :
LEA
CMP
JNE
CALL
CMP
DX,SECTOR+512
SI,DX
G4 0
Rl OREAD
ENDCDE,0 0
Figura 17-4
JE
LEA
G80
SI,SECTOR
LEA
CMP
JB
MOV
CALL
LEA
DX, DISAREA+8 0
DI.DX
G50
[DI],ODOAH
HIODISP
DI,DISAREA
;Fin de DISAREA?
; no, pasar
s, establecer CR/LF
; desplegar
s, salir
G40 :
G50 :
LODSB
STOSB
CMP
JE
CMP
JNE
CALL
JMP
AL,1AH
G8 0
AL, OAH
G30
HIODISP
G2 0
G80 :
G90 :
G10XFER
CALL
RET
ENDP
HIODISP
Despliega
HIODISP
PROC
MOV
MOV
LEA
NEG
ADD
LEA
INT
CMP
JAE
INC
JMP
NEAR
AH,40H
BX, 01
CX, DISAREA
CX
CX.DI
DX,DISAREA
21H
ROW,22
H20
ROW
H90
MOV
CALL
CALL
RET
ENDP
AX,0601H
Q10SCR
Q2 0CURS
;Despliega ltima
lnea
lnea
;Peticin de despliegue
;Manej ador
;Calcula
; la longitud
; de la lnea
/Inferior de
; no, salir
la pantal
H20 :
H90 :
HIODISP
;Recorre
Recorre la p a n t a l l a :
Q10SCR
Q10SCR
PROC
MOV
MOV
MOV
INT
RET
ENDP
NEAR
BH,1EH
CX,0000
DX,184FH
10H
Coloca el
Q20CURS
Q2 0CURS
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
NEAR
AH,02H
BH, 00
DH,ROW
DL, 00
10H
Lee
cursor:
;Peticin para
; colocar el cursor
Figura 17-4
(continuacin)
310
RlOREAD
RlOREAD
PROC
MOV
MOV
MOV
LEA
INT
MOV
RET
ENDP
NEAR
AH,3FH
BX,HANDLE
CX,512
DX,SECTOR
21H
ENDCDE,AX
Despliega
X10ERR
X10ERR
PROC
MOV
MOV
MOV
LEA
INT
MOV
RET
ENDP
END
Peticin para
Dispositivo
Longitud
Bfer
mensaje
NEAR
AH,40H
BX, 01
C X , 18
DX,OPENMSG
21H
ENDCDE,01
de
error
de
leer
disco:
Peticin para
Manej ador
Longitud
/Indicador
de
Captulo 1 7
desplegar
error
BEGIN
Figura 17-4
(continuacin)
311
record #21
record #22
record #23
Cuando el programa solicita el siguiente registro aleatorio, digamos el nmero 23, la operacin
examina primero el bfer. Como el registro ya se encuentra ah, lo transfiere de manera directa al
programa. Si el programa solicita un nmero de registro que no se encuentra en el bfer, la
operacin utiliza el directorio para localizar el registro, lee todo el sector y lo enva al bfer y
manda el registro al programa. De acuerdo con esto, por lo comn es ms eficiente solicitar
nmeros de registros que estn cercanos en el archivo.
INT 21H, funcin 42H: Mueve apuntador de archivo
El DOS mantiene un apuntador que la operacin de abrir inicializa en cero y las lecturas y escrituras subsecuentes incrementan por cada registro procesado. Usted puede usar la funcin del
DOS, 42H (Mover el apuntador del archivo), para colocar el apuntador del archivo en cualquier
posicin dentro de un archivo y despus usar otros servicios para recuperacin o actualizacin
directas.
Coloque el manejador de archivo en el BX y el desplazamiento necesario como bytes en el
CX:DX. Para un movimiento hasta de 65,535 bytes, establezca cero en el CX y el valor del
desplazamiento en el DX. Tambin establezca un cdigo de mtodo en el AL que indique a la
operacin el punto desde el cual se tomar el desplazamiento:
00
01 Toma el desplazamiento desde la posicin actual del apuntador del archivo, que puede
ser cualquiera dentro del archivo, incluso al inicio.
02 Toma el desplazamiento desde el final del archivo. Puede usar este cdigo de mtodo
para agregar registros al final del archivo. O puede determinar el tamao del archivo
estableciendo el CX:DX a cero y usando el cdigo de mtodo 02.
El ejemplo siguiente mueve el apuntador 1,024 bytes desde el inicio de un archivo:
MOV
AH,4 2H
MOV
AL, 0 0
LEA
BX,HANDLEl
MOV
CX, 00
MOV
DX,1024
INT
21H
JC
error
apuntador
/Desplazamiento de
/Llama al DOS
1,024
bytes
312
Captulo 1 7
Una operacin vlida pone en cero la bandera de acarreo y enva la nueva posicin del apuntador
en el DX: AX. Entonces se puede realizar una operacin de lectura o escritura para procesamiento
directo. Una operacin no vlida pone en uno la bandera de acarreo y regresa en el AX el cdigo
01 (cdigo no vlido de mtodo) o 06 (manejador no vlido).
P r o g r a m a : L e c t u r a directa de un archivo en disco
El programa de la figura 17-5 lee el archivo creado en la figura 17-2. Al teclear un nmero
relativo de registro que est dentro de los lmites del archivo, el usuario puede solicitar cualquier
registro en el archivo para que sea desplegado en la pantalla. Si el archivo contiene 24 registros,
entonces los nmeros vlidos de registro son desde 01 hasta 24. Un nmero ingresado desde el
teclado est en formato ASCII y en este caso slo debe ser de uno o dos dgitos.
El programa est organizado como sigue:
C10OPEN
D10RECN
G10DISP
Usa la funcin 42H y la posicin relativa del registro desde RECINDX para
colocar el apuntador del archivo y emitir la funcin 3FH para enviar el registro solicitado al programa en IOAREA.
Despliega el registro recuperado.
TITLE
P17RANRD (EXE)
.MODEL
SMALL
.STACK
64
HANDLE
RECINDX
ERRCDE
PROMPT
IOAREA
PATHNAM
OPENMSG
READMSG
ROW
COL
.DATA
DW
DW
DB
DB
DB
DB
DB
DB
DB
DB
RECDPAR
MAXLEN
ACTLEN
RECDNO
LABEL
DB
DB
DB
313
Manejador de archivo
7
ndice del registro
00
Indicador de error de lectura
' Record number? $ '
32 D U P ( )
rea de registro de disco
'D:\NAMEFILE.SRT',0
'*** Open error ***', ODH, OAH
'*** Read error ***', ODH, OAH
00
00
1
BYTE
3
3 DUP('
.CODE
.386
BEGIN
PROC
MOV
MOV
MOV
MOV
CALL
CALL
CALL
CMP
JNZ
FAR
AX.odata
DS, AX
ES, AX
AX,0600H
Q10SCRN
Q2 0CURS
C10OPEN
ERRCDE,0 0
A90
CALL
CMP
JE
CALL
CMP
JNZ
CALL
D10RECN
ACTLEN,0 0
A90
F10READ
ERRCDE, 0 0
A3 0
G10DISP
JMP
A2 0LOOP
MOV
INT
ENDP
AX,4CO0H
21H
Inicializa
registros de
segmentos
Limpia la pantalla
Coloca el cursor
Abre archivo
Apertura vlida?
no, salir
A2 0LOOP:
Peticin de #reg
Existen ms peticiones?
no, salir
Lee registro en disco
Lectura normal?
no, pasar
s, desplegar nombre,
A3 0 :
continuar
A90 :
BEGIN
Abre
C10OPEN
Salir al DOS
archivo:
PROC
MOV
MOV
LEA
INT
JC
MOV
RET
NEAR
AH,3DH
AL, 00
DX, PATHNAM
21H
C2 0
HANDLE, AX
MOV
LEA
CALL
RET
ERRCDE,01
DX,OPENMSG
X10ERR
P e t i c i n para abrir
Archivo normal
Error?
no, guardar manejador
C20 :
Figura 17-5
s,
desplegar
mensaje de error
314
C10OPEN
ENDP
Obtiene
D10RECN
Captulo 1 7
nmero
de
registro:
PROC
MOV
LEA
INT
AH,09H
DX,PROMPT
21H
NEAR
;Peticin
MOV
LEA
INT
CMP
JB
JA
XOR
MOV
JMP
AH, OAH
DX, RECDPAR
21H
ACTLEN,01
D4 0
D20
AH, A H
AL,RECDNO
D30
MOV
MOV
AH, RECDNO
AL.RECDNO+l
AND
AAD
DEC
SHL
MOV
AX,0F0FH
MOV
CALL
RET
ENDP
COL,20
Q2 0CURS
para
desplegar
,-Verifica
/Longitud
l o n g i t u d 0,
0, t e r m i n a
/Longitud
/Longitud
1,
indicacin
D20 :
D30 :
Limpia los 3 ASCII
Convierte a binario
A j u s t a (primer r e g i s t r o
Multiplica por 1S
Guarda el ndice
AX
AX, 05
RECINDX,AX
es
0)
D40 :
Lectura
FlOREAD
directa
PROC
MOV
MOV
MOV
MOV
MOV
INT
JC
NEAR
AX,4200H
A L , 00
BX,HANDLE
CX, 00
DX, RECINDX
21H
F20
MOV
MOV
MOV
LEA
INT
JC
CMP
JE
JMP
AH,3FH
BX,HANDLE
CX, 32
DX,IOAREA
21H
F2 0
IOAREA, 1AH
F3 0
F90
LEA
CALL
DX,READMSG
X10ERR
MOV
RET
ENDP
ERRCDE,01
de
registro
en
disco:
el
'Condicin de error?
si, p a s a r
Peticin de lectura
;30
para
el
nombre,
para
/Error en la lectura?
/Marcador EOF?
s, s a l i r
F20 :
no,
lectura
no
vlida
F30 :
F90 :
Fl OREAD
Despliega
G10DISP
PROC
MOV
MOV
MOV
NEAR
AH,40H
BX, 01
CX, 32
apuntador
/Fuerza
la
terminacin
nombre:
Figura 17-5
(continuacin)
CR/LF
de
archivo
DX,IOAREA
21H
COL,00
ROW,20
G80
ROW
G90
MOV
CALL
CALL
RET
ENDP
AX,0601H
Q10SCRN
Q20CURS
PROC
MOV
MOV
MOV
INT
RET
ENDP
NEAR
BH,1EH
CX,0000
DX,184FH
10H
315
Limpia la columna
Inferior de la pantalla?
s, p a s a r
no, incrementar rengln
380 :
390 :
310DISP
Q10SCRN
Q10SCRN
Recorre
;Recorre
;Coloca el
pantalla:
Coloca el
Q20CURS
Q20CURS
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
cursor
recorrer
cursor:
NEAR
AH, 02
BH, 00
DH,ROW
DL,COL
10H
Peticin para
el cursor
rengln
columna
colocar
X10ERR
PROC
MOV
MOV
MOV
INT
INC
RET
ENDP
END
NEAR
AH.40H
BX, 01
CX, 20
21H
ROW
DX contiene la direccin
Manej ador
Longitud
del mensaje
BEGIN
Figura 17-5
(continuacin)
1-8
9-11
Extensin del nombre de archivo. Una subdivisin del nombre del archivo para
identificacin posterior, como .DOC o .ASM, justificado a la izquierda si tiene
menos de tres caracteres. Cuando crea un archivo, el DOS almacena su nombre de
archivo y su extensin en el directorio.
316
Captulo 17
12-13
14-15
Tamao lgico del registro. Una operacin de abrir inicializa el tamao del registro en 128 (80H). Despus de abrir y antes de cualquier lectura o escritura, puede
cambiar esta entrada al tamao que usted necesite.
16-19
Tamao del archivo. Cuando un programa crea un archivo, el DOS calcula y almacena su tamao (nmero de registros x tamao del registro) en el directorio. Una
operacin de abrir de manera subsecuente extrae el tamao del directorio y lo
almacena en este campo. Su programa puede leer el campo, pero no cambiarlo.
20-21
22-31
32
33-36
Nmero relativo de registro. Para lectura/escritura directa, esta entrada debe contener un nmero relativo de registro. Por ejemplo, para leer de manera directa el
registro 25 (19H), establezca la entrada en 19000000H. Para procesamiento directo,
el sistema convierte de manera automtica el nmero relativo de registro al bloque
y registro actuales. A causa del lmite sobre el tamao mximo de un archivo
(1,073,741,824 bytes) un archivo con un tamao de registro ms pequeo puede
contener ms registros y puede tener un nmero relativo de registro mximo mayor
que un archivo con un tamao de registro ms grande. Si el tamao del registro es
mayor que 64, el byte 36 siempre contiene 00.
Precediendo al FCB est una extensin opcional de siete bytes, que puede ser usada para
procesamiento de archivos con atributos especiales. Para usar la extensin, codifique el primer
byte con FFH, el segundo byte con el atributo del archivo (descrito en el captulo 16) y el resto de
los cinco bytes con ceros hexadecimales.
317
AH.16H
LEA
DX,nombredeFCB
INT
21H
, Llama al DOS
un archivo en disco
El DOS busca en el directorio un nombre de archivo que coincida con la entrada del FCB. Si
encuentra uno, el DOS reutiliza el espacio en el directorio; si no se encuentra, busca una entrada
vaca. Despus la operacin inicializa el tamao del archivo en cero y abre el archivo. Al abrir
verifica un espacio disponible en disco y establece uno de los siguientes cdigos de regreso en el
AL: 00H = espacio disponible; FFH = no hay espacio disponible. Al abrir tambin inicializa el nmero
actual de bloque FCB a cero y establece un valor por omisin en el tamao del registro del FCB
a 128 bytes (80H). Antes de escribir un registro, puede hacer caso omiso de este valor por omisin
y usar su propio tamao de registro.
El rea de transferencia de disco
El rea de transferencia de disco (DTA) es el inicio de la definicin de su registro de salida. Ya
que el FCB contiene el tamao del registro, el DTA no necesita un delimitador para indicar el
final del registro. Antes de una operacin de escritura, utilice la funcin 1AH de FCB para dar al
DOS la direccin del DTA. Slo un DTA puede estar activo en cualquier momento. El cdigo
siguiente inicializa la direccin del DTA:
MOV
AH, 1AH
LEA
DX, nombredeDTA
; del DTA
INT
21H
;Llama al DOS
Si un programa slo procesa un archivo de disco, necesita inicializar el DTA slo una vez
para toda su ejecucin. Si un programa procesa ms de un archivo, debe inicializar el DTA
apropiado inmediatamente antes de cada lectura o escritura.
INT 21H, funcin 15H: Escribe registro
Para escribir un registro de disco de forma secuencial, utilice la funcin 15H para FCB:
MOV
AH,15H
LEA
DX,nombre de FCB
INT
21H
/Llama al DOS
de forma secuencial
318
Captulo 17
En una escritura exitosa, el DOS incrementa el campo del tamao tamao del FCB (aadiendo el tamao del registro) e incrementa el nmero actual de registro en uno. Cuando el
nmero actual de registro excede 127, la operacin lo pone en cero e incrementa el nmero actual
de bloque del FCB. (Tambin se puede cambiar el bloque actual y el nmero actual de registro.)
La operacin de escritura establece uno de los siguientes cdigos de regreso en el AL: OOH = la
escritura fue exitosa; 01H = disco lleno; 02H = DTA es muy pequea para el registro.
INT 21H, funcin 10H: Cierra archivo
Cuando ha terminado de escribir registros en el archivo, puede escribir un marcador de fin de
archivo (1AH en el primer byte de un ltimo registro especial; no lo confunda con la funcin
1AH) y despus utilice la funcin 10H para FCB a fin de cerrar el archivo:
MOV
AH,10H
;Peticin
LEA
DX,nombredeFCB
INT
21H
,-Llama
el
para
cerrar
archivo
al
DOS
La operacin para cerrar escribe en disco cualquier informacin parcial que an se encuentre en
el bfer del disco del DOS y actualiza el directorio con la fecha y el tamao del archivo. Uno de
los cdigos siguientes es regresado al AL: OOH = se cerr de manera exitosa; FFH = el archivo
no estaba en la posicin correcta en el directorio, tal vez provocado porque el usuario cambi por un
disco flexible.
AH,OFH
/Peticin
LEA
DX,nombredeFCB
INT
21H
/Llama
el
para
abrir
archivo
al
DOS
La operacin para abrir verifica que el directorio tenga una entrada con el nombre y extensin del
archivo definidos en el FCB. Si la entrada no est en el directorio, la operacin regresa el cdigo
FFH en el AL. Si est presente la entrada, la operacin regresa el cdigo 00 en el AL y establece
el tamao actual del archivo, la fecha, el nmero actual de bloque (0) y el tamao del registro
(80H) en el FCB. Despus de que se ejecuta la operacin de abrir, se puede hacer caso omiso del
tamao por omisin del registro.
El rea de transferencia de disco
El DTA define un rea para el registro de entrada, de acuerdo con el formato usado para crear el
archivo. Utilice la funcin 1AH para FCB a fin de fijar la direccin del DTA, igual que cuando
crea un archivo en disco.
319
LEA
DX,nombredeFCB
INT
21H
/Llama al DOS
secuencialmente un registro
La operacin establece uno de los siguientes cdigos de regreso en el AL: 00 = lectura exitosa;
01 = fin de archivo, ningn dato fue ledo; 02 = DTA es muy pequea para el registro; 03 = fin
del archivo, el registro se ley parcialmente y se rellen con ceros.
Para una lectura exitosa, la operacin utiliza la informacin en el FCB para enviar el registro de disco, iniciando en la direccin del DTA. Un intento de leer despus del ltimo registro del
archivo provoca que la operacin seale una condicin de fin de archivo que establece el AL con
01H, que usted debe examinar. Es una prctica recomendada cerrar un archivo de entrada despus
que se ha ledo completamente, ya que el DOS limita el nmero de archivos que pueden estar
abiertos al mismo tiempo.
/Peticin
LEA DX,nombredeFCB
INT
/Llama al DOS
21H
de lectura directa
La operacin de lectura regresa uno de los siguientes cdigos en el AL: 00 = lectura exitosa; 01 = fin
de archivo, no hay ms datos disponibles; 02 = DTA muy pequea para el registro; 03 = el
registro ha sido ledo de manera parcial y rellenado con ceros.
Una operacin exitosa convierte el nmero relativo de registro a bloque y registro actuales.
Utiliza este nmero para localizar el registro de disco que se necesita y lo enva al DTA. Respuestas errneas pueden ser causadas por un nmero relativo de registro no vlido o una direccin
incorrecta en el DTA o FCB.
INT 21H, funcin 22H: Escritura directa de un registro
La operacin de crear y establecer el DTA son las mismas para procesamiento directo y para
procesamiento secuencial. Con el nmero relativo de registro inicializado en el FCB, la escritura
directa utiliza la funcin 22H:
320
MOV
AH,22H
/Peticin
LEA
DX,nombredeFCB
INT
21H
/Llama
Captulo 1 7
escritura
directa
al
DOS
La operacin de escritura regresa uno de los cdigos siguientes en el AL: 00 = escritura exitosa;
01 = disco lleno; 02 = DTA muy pequeo para el registro.
AH,28H
/Peticin
de
MOV
CX,registros
/Fija
LEA
DX,nombredeFCB
/Direccin
INT
21H
/Llama
el
escritura
nmero
al
del
de
directa
de
bloque
registros
FCB
DOS
AH,27H
/Peticin
MOV
CX, r e g i s t r o s
,-Inicializa
LEA
DX,nombredeFCB
/Direccin
INT
21H
/Llama
al
para
lectura
nmero
del
de
directa
de
bloque
registros
FCB
DOS
La operacin de lectura regresa uno de los cdigos siguientes en el AL: 00 = lectura exitosa de
todos los registros; 01 = ha ledo un fin de archivo, el ltimo registro est completo; 02 = D T ^
muy pequeo para el registro, lectura no completa; 03 = fin de archivo, ha ledo un registre
parcialmente.
321
E/S A B S O L U T A D E D I S C O
Puede utilizar la INT 25H y la 26H del DOS para lecturas y escrituras absolutas para procesar un
disco de manera directa, por ejemplo, para recuperar un archivo daado. En este caso, no define
manejadores de archivo o FCB y pierde las ventajas de manejo de directorio y bloqueo y desbloqueo de registros que tiene con la INT 21H del DOS. Observe que la funcin 44H de la INT 21H
(estudiada en el captulo 18) proporciona un servicio similar y, de acuerdo con las revistas de
Microsoft, ha sustituido a las INT 25H y 26H.
Como estas operaciones tratan de leer todos los registros como si fueran el tamao de un
sector, accesa de manera directa a un sector completo o un bloque de sectores. El direccionamiento
de disco es en trminos de nmero relativo de registro (sector relativo). Para determinar un
nmero relativo de registro en discos flexibles de doble lado con nueve sectores por pista, cuente
cada sector desde la pista 0, sector 1, como sigue:
PISTA
0
0
1
1
2
SECTOR
1
2
1
9
9
Una frmula conveniente para determinar un nmero relativo de registro en discos flexibles
con nueve sectores es
Nmero relativo de sector = (pista 9) + (sector - 1 )
Por tanto, el nmero relativo de registro para la pista 2, sector 9 es
(2 x 9) + (9 - 1) = 18 + 8 = 26
A continuacin est el cdigo necesario para particiones de disco de menos de 32 MB:
MOV
AL,#unidad
,-0 para A,
MOV
BX.direcc
/Transfiere
MOV
CX, sector
MOV
DX,#sector
INT
25H o 26H
;DOS,
POPF
JC
1 para B, etc.
direccin
Las operaciones absolutas de lectura/escritura en disco destruyen todos los registros excepto
los registros de segmento y emplean la bandera de acarreo para indicar una operacin exitosa (0)
o no exitosa (1). Una operacin no exitosa regresa uno de los siguientes cdigos diferentes de cero
en el AL:
322
10000000
01000000
00001000
00000100
00000011
00000010
Otro error
Captulo 17
La operacin INT empuja las banderas en la pila. Puesto que las banderas originales an
estn en la pila antes de regresar de la operacin, debe sacarlas despus de examinar la bandera de
acarreo.
Desde la versin DOS 4.0 puede usar las INT 25H y 26H para accesar particiones de disco
que excedan 32MB. El AL y el CX todava son usados de la misma manera. El DX no es utilizado, y el BX apunta a un bloque de parmetros de 10 bytes descrito como sigue:
BYTES
DESCRIPCIN
00H-03H
04H-05H
06H-07H
08H-09H
ni
PUNTOS CLAVE
Muchos de los servicios de disco del DOS hacen referencia a una cadena ASCIIZ que
consiste en una ruta de directorio seguido por un byte de ceros hexadecimales.
Tras un error, muchas de las funciones de disco del DOS ponen en uno la bandera de
acarreo y regresan un cdigo de error en el AX.
El DOS mantiene un apuntador a archivo por cada archivo que un programa est procesando.
Las operaciones de creacin y apertura establecen el valor del apuntador de un archivo en
cero, la posicin de inicio del archivo.
Las funciones para crear y abrir regresan un manejador de archivo que se utiliza para
subsecuente acceso al archivo.
Cuando se escribe en un archivo se utiliza primero la funcin para crear 3CH; cuando se lee
un archivo se emplea inicialmente la funcin 3DH.
Un programa que ha terminado de escribir en un archivo debe cerrarlo, de modo que el DOS
pueda actualizar el directorio.
Un programa que utiliza las funciones originales de la INT 21H del DOS para E/S de disco
define un bloque de control de archivo (FCB) para cada archivo que accesa.
Un bloque de FCB consiste en 128 registros. El nmero del bloque actual, combinado con el
nmero de registro actual, indica el registro del disco que ser procesado. Las entradas en el
FCB para el bloque actual, tamao del registro y nmero de registro relativo son almacenados
en secuencia inversa de bytes.
Preguntas
323
El rea de transferencia del disco (DTA) es la localidad del registro que ser escrito o ledo.
Se tiene que inicializar cada DTA en un programa antes de ejecutar una operacin de lectura
o escritura.
Las INT 25H y 26H del DOS proporcionan operaciones absolutas de lectura y escritura en
disco, pero no proveen de manejo automtico del directorio, operaciones de fin de archivo
o bloqueo y desbloqueo de registros.
PREGUNTAS
De las preguntas siguientes, las primeras 10 conciernen a operaciones en disco que implican el
manejo de archivos y el resto implican operaciones de FCB en disco.
17-1. Cules son los cdigos de error que se regresan para (a) archivo no encontrado; (b) manejador no
vlido?
17-2. Defina una cadena ASCIIZ llamada PATH1 para un archivo con nombre CUST.LST en la unidad C.
17-3. Para el archivo de la pregunta 17-2, proporcione las instrucciones para (a) definir un elemento con
nombre CUSTHAN para el manejador del archivo; (b) crear el archivo; (c) escribir un registro
desde CUSTOUT (128 bytes), y (d) cerrar el archivo. Pruebe por si hay errores.
17-4. Para el archivo de la pregunta 17-3, codifique instrucciones para (a) abrir el archivo y (b) leer
registros a CUSTIN. Pruebe por si hay errores.
17-5. Bajo qu circunstancias debe cerrar un archivo que slo es usado para entrada?
17-6. Corrija el cdigo de la figura 17-4 de modo que el usuario pueda introducir desde el teclado un
nombre de archivo, el cual utilice el programa para localizar el archivo y desplegar su contenido.
Estipule cualquier nmero de peticiones y que con slo presionar la tecla Enter se indique fin de la
entrada.
17-7. Escriba un programa que permita al usuario ingresar desde una terminal nmeros de parte (tres
caracteres), descripciones de las partes (12 caracteres) y precios unitarios (xxx.xx). El programa es
para usar manejadores de archivo para crear un archivo en disco que contenga esta informacin.
Recuerde convertir el precio de ASCII a binario. A continuacin se ve una muestra de un archivo de
entrada:
PARTE
DESCRIPCIN
PRECIO
0 2 3
Ensambladores
| 00315|
0 2 4
Conexiones
|00430|
| 027 |
Compiladores
|00525|
| 049 |
Compresores
|00920|
Extractores
|11250|
Transporte
|00630|
Elevadores
|10520|
Procesadores
|21335|
Etiquetadores
|00960|
Depositarios
|05635|
I
1
1
1
1
1
1 1 4
1 1 7
1 2 2
1 2 4
1 2 7
2 3 2
1
1
1
1
1
1
| 999 |
|00000|
324
Captulo 17
17-8. Escriba un programa que muestre el contenido de los archivos de la pregunta 17-7. Tendr que
convertir el nmero binario a formato ASCII para el precio.
17-9. Utilice el archivo creado en la pregunta 17-7 para los siguientes requisitos: (a) que el programa lea
los registros en una tabla en memoria; (b) que el usuario pueda ingresar desde el teclado el nmero
de parte y la cantidad; (c) que el programa busque en la tabla el nmero de parte; (c) que si
encuentra el nmero de parte, el programa utilice la tabla de precios para calcular el valor de la parte
(cantidad x precio); (e) que el programa despliegue la descripcin y el valor calculado.
17-10. Corrija el programa de la pregunta 17-8, de manera que realice procesamiento directo. Defina una
tabla con los nmeros vlidos de nmeros de parte. Permita al usuario ingresar un nmero de parte,
que el programa localiza en la tabla. Utilice el desplazamiento en la tabla para calcular el desplazamiento
en el archivo y emplee la funcin 42H para mover el apuntador del archivo. Despliegue la descripcin
y el precio. Permita al usuario ingresar la cantidad vendida; calcule y despliegue el monto de la
venta (cantidad x precio).
17-11. Proporcione las operaciones completas de funciones del DOS para las operaciones siguientes con
FCB: (a) crear; (b) establecer DTA; (c) escritura secuencial; (d) abrir; (e) lectura secuencial.
17-12. Un programa utiliza el tamao de registro, que establece por omisin la operacin de abrir de FCB.
(a) Cuntos registros contendra un sector? (b) Suponiendo tres pistas con nueve sectores por pista,
cuntos registros contendra un disco? (c) Si el archivo del inciso (b) se fuera a leer de manera
secuencial, cuntos accesos fsicos a disco ocurriran?
CAPTULO 18
Procesamiento en disco:
IIOperaciones del DOS para
soporte de discos y archivos
OBJETIVO
INTRODUCCIN
Este captulo introduce varias operaciones tiles implicadas en el manejo de unidades de disco, el
directorio, la FAT y los archivos en disco.
OPERACIONES PARA MANEJO DE UNIDADES DE DISCO
ODH
OEH
19H
1BH, 1CH
1FH
2EH
32H
36H
4400H
4401H
326 P r o c e s a m i e n t o e n d i s c o : I I O p e r a c i o n e s d e l D O S p a r a s o p o r t e d e d i s c o s y a r c h i v o s
4404H
4405H
4406H
4407H
4408H
440DH,
440DH,
440DH,
440DH,
440DH,
440DH,
440DH,
54H
59H
Captulo 1 8
M A N E J A R EL D I R E C T O R I O Y LA FAT
29H
41H
43H
45H, 46H
4EH, 4FH
56H
57H
5AH, 5BH
39H
3AH
3BH
47H
Crear subdirectorio
Eliminar subdirectorio
Cambiar directorio actual
Obtener directorio actual
Los cdigos de error mencionados en este captulo se refieren a la lista de la figura 17-1.
AH,ODH
;Peticin
para
INT
21H
;Llama
DOS
al
restablecer
disco
327
MOV
AH,OEH
MOV
DL,02
; la unidad C
INT
21H
;Llama al DOS
La operacin regresa el nmero de unidades (todos los tipos, incluyendo los discos RAM virtuales)
al AL. Puesto que el DOS requiere al menos dos unidades lgicas A y B, regresa el nmero 02
para un sistema con una sola unidad. (Utilice la INT 11H para determinar el nmero real de
unidades.)
INT 21H, funcin 19H: Obtener la unidad de disco por omisin
La funcin 19H del DOS determina la unidad de disco por omisin:
MOV AH, 19H
INT
21H
L l a m a al DOS
AH,1BH
;Peticin de
INT
21H
;Llama al DOS
informacin
Ya que la operacin cambia el DS, debe guardarlo (PUSH) en la pila antes llamar a la interrupcin
y sacarlo (POP) despus de la interrupcin. La operacin ahora ha sido reemplazada por la funcin 36H. Una operacin 1BH exitosa regresa la informacin siguiente:
AL
BX
CX
DX
El producto del AL, CX y DX da la capacidad del disco. Una operacin 1BH no exitosa
regresa FFH en el AL.
INT 21H, funcin 1CH: Obtener informacin de una unidad especfica
Esta funcin regresa informacin acerca de una unidad especfica. Inserte el nmero de unidad
requerida en el DL, donde 0 = por omisin, 1 = A, y as sucesivamente:
MOV AH,1CH
;Peticin de
informacin
MOV
DL,drive
,-Nmero de dispositivo
INT
21H
;Llama al DOS
Captulo 18
La operacin es idntica a la funcin 1BH y tambin est reemplazada por la funcin 36H.
INT 21H, funcin 1FH: Obtener bloque de parmetros
de la unidad por omisin (DPB)
El bloque de parmetros de la unidad es un rea de datos que contiene la siguiente informacin de
bajo nivel acerca de la estructura de la unidad:
DESPLAZAMIENTO
TAMAO
OOH
01H
02H
04H
05H
06H
08H
09H
OBH
ODH
OFH
11H
13H
17H
18H
19H
1DH
1FH
CONTENIDO
Byte
Byte
Palabra
Byte
Byte
Palabra
Byte
Palabra
Palabra
Palabra
Palabra
Palabra
Palabra doble
Byte
Byte
Palabra doble
Palabra
Palabra
Guarde (PUSH) en la pila el DS antes de emitir esta funcin y squelo (POP) de la pila al regresar
de la funcin. La operacin no tiene parmetros. Una operacin vlida limpia el Al y regresa una
direccin en el DX:BX que apunta al DBP de la unidad por omisin. Si hay un error, el AL tiene
FFH. Vase tambin la funcin 32H.
AH, 2EH
,-Peticin
MOV
AL,01
;Activa
INT
21H
;Llama
la
al
para
verificar
verificacin
DOS
(o
MOV
AX,2E01H)
329
AH,3SH
MOV
DL,0
INT
21H
,-Llama al DOS
=
=
=
=
Nmero
Nmero
Nmero
Nmero
,-Peticin de
MOV
BX,handle
INT
21H
;Llama al DOS
330 P r o c e s a m i e n t o e n d i s c o : I I O p e r a c i o n e s d e l D O S p a r a s o p o r t e d e d i s c o s y a r c h i v o s
Captulo 1 8
Una operacin vlida pone en cero la bandera de acarreo y regresa un nmero en el DX, donde el ;
bit 7 = 0 significa que el manejador es de un archivo y bit 7 = 1 significa que es de un dispositivo, i
Los otros bits tienen este significado:
j
A R C H I V O ( B I T 7 = 0):
0-5
6
j
j
D I S P O S I T I V O (BIT 7 = 1):
0
1
2
3
4
5
6
i
j
]
j
I
j
1
Un error pone en uno la bandera de acarreo y regresa en el AX el cdigo 0 1 , 05 o 06.
INT 21H, funcin 4401H: Establece informacin del dispositivo
Esta funcin carga el manejador de archivo en el BX y el bit de configuracin en el DL para los
bits 0-7, como se mostr para la subfuncin OOH. La operacin establece la informacin del
dispositivo de acuerdo con esto. Un error pone en uno la bandera de acarreo y regresa el cdigo
0 1 , 05, 06 o ODH en el AX.
j
j
j
i
I
Este servicio verifica si un archivo o dispositivo est listo para entrada. Cargue el manejador en el J
BX. Una operacin vlida regresa uno de los siguientes cdigos en el AL:
j
Dispositivo: OOH = no est preparado, FFH = preparado
Archivo:
Este servicio verifica si un archivo o dispositivo est preparado para enviar salida de resultados, j
Una operacin vlida regresa uno de los siguientes en el AL:
j
331
AX,440DH
MOV
BX,drve
MOV
CH,08H
MOV
CL,41H
LEA
DX,devblock
INT
21H
,-Llama al DOS
1 = A,
etc.)
LABEL
BYTE
specfune
DB
/Funcin especial
rwhead
DW
cabeza
/Cabeza
rwcyl
DW
cilindro
/Cilindro
rwsectl
DW
sector
/Sector
rwsects
DW
nmero
/Nmero de sectores
rwbuffr
DW
bfer
/Desplazamiento del
DW
SEG DATA
/Direccin del
(cero)
lectura/escritura
inicial
bfer
segmento de datos
(?)
/Bfer de salida
332 P r o c e s a m i e n t o e n d i s c o : I I O p e r a c i o n e s d e l D O S p a r a s o p o r t e d e d i s c o s y a r c h i v o s
Captulo 1
Una operacin exitosa pone en cero la bandera de acarreo y escribe los datos. De otra manera, 1:
operacin pone en uno la bandera de acarreo y regresa el cdigo de error 0 1 , 02 o 05 en el AX
AX,44ODH
;Peticin
de
MOV
BX,drive
,-Unidad
MOV
CH, 08
, C a t e g o r a d e l d i s p o s i t i v o
MOV
CL,42H
;Cdigo
LEA
DX,block
;Direccin
INT
21H
;Llama
(0
servicio
disco
= por omisin,
secundario
al
de
del
= A,
(08)
formatear
bloque
etc
pista
(DS:DX)
DOS
LABEL
BYTE
specfun
DB
;Funcin
diskhd
DW
;Cabeza
cylindr
DW
;Cilindro
tracks
DW
;Nmero
especial,
de
cdigo
disco
de
pistas
Una operacin exitosa pone en cero la bandera de acarreo y formatea las pistas. De otn
forma, la operacin pone en uno la bandera de acarreo y regresa el cdigo de error 0 1 , 02 o 05 er
el AX.
INT 21H, funcin 440DH, cdigo secundario 46H: Establecer identificacin de medio
Para que esta funcin designe la identificacin de medio, designe estos registros:
MOV
AX,440DH
;Peticin
MOV
BX,drive
,-Unidad
MOV
C H , 08
;Categora
MOV
CL,46H
;Cdigo
LEA
DX,block
,-Direccin
INT
21H
, L l a m a al D O S
(0
de
=
servicio
de
disco
por omisin,
del
dispositivo
secundario
del
= A,
(08)
establecer
bloque
etc.)
ID
del
medio
(DS:DX)
LABEL
BYTE
infolev
DW
;Nivel
serialn
DD
??
,-Nmero
de
de
informacin
serie
DB
11 DUP
filetyp
DB
8 DUP
333
(?)
(?)
Etiqueta de volumen
;Tipo de FAT
El campo filetyp contiene el valor ASCII FAT12 o FAT16, con blancos al final. Una operacin
exitosa pone en cero la bandera de acarreo y establece la identificacin. De otra forma, la operacin pone en uno la bandera de acarreo y regresa el cdigo de error 0 1 , 02, 05 en el AX. (Vase
tambin la funcin 440DH, cdigo secundario 66H.)
INT 21H, funcin 440DH, cdigo secundario 60H:
Obtener parmetros del dispositivo
Para que esta funcin obtenga los parmetros de dispositivo, establezca estos registros:
MOV
AX,440DH
MOV
BX,device
MOV
CH, 08
MOV
CL,SOH
LEA
DX,block
INT
21H
;Llama al DOS
1 = A,
etc.)
(08)
(DS:DX)
, Funcin especial (0 o 1)
specfun
DB
devtype
DB
devattr
DW
/Atributo del
cylindr
DW
;Nmero de cilindros
medityp
DB
/Tipo de medio
bytesec
DW
secclus
DB
ressect
DW
fats
DB
;Nmero de FAT
rootent
DW
sectors
DW
mediads
DB
/Descriptor de medios
fatsecs
DW
sectrak
DW
heads
DW
/Nmero de cabezas
;Tipo de dispositivo
dispositivo
DD
Nmero
de
sectores
ocultos
exsects
DD
;Nmero
de
sectores
si
campo
de
Captulo 18
sectores
j
j
i
1
Esta operacin lee informacin de uno o ms sectores en disco y la enva a un bfer. Ponga el CL I
con el cdigo secundario 61H; los detalles tcnicos para la operacin son idnticos a aquellos para j
el cdigo secundario 41H, el cual escribe sectores. La figura 18-1 ilustra la funcin.
i
INT 21H, funcin 440DH, cdigo secundario 66H: Obtener identificacin de medios
Para que esta funcin obtenga la identificacin de medios, establezca estos registros:
MOV
AX,440DH
;Peticin
MOV
BX,device
;Unidad
MOV
CH, 08
,-Categora
MOV
CL,66H
;Cdigo
LEA
DX,block
/Direccin
INT
21H
/Llama
(0
de
servicio
por
del
al
disco
omisin,
dispositivo
secundario
del
de
= A,
etc.)
(08)
obtener
bloque
identificacin
de
medios
(DS:DX)
DOS
LABEL
BYTE
infolev
DW
Nivel
serialn
DD
Nmero
volabel
DB
DUP
(?)
Etiqueta
filetyp
DB
DUP
(?)
Tipo
de
de
informacin
de
serie
de
volumen
FAT
Una operacin exitosa pone en cero la bandera de acarreo y establece la identificacin. El campo
filetyp contiene el valor ASCII FAT12 o FAT16, con espacios en blanco al final. De otra manera,
la operacin pone en uno la bandera de acarreo y regresa el cdigo de error 0 1 , 02 o 05 eh el AX.
(Vase tambin la funcin 440DH, cdigo secundario 46H.)
INT 21H, funcin 440DH, cdigo secundario 68H: tipo de medio percibido
Para utilizar esta funcin a fin de obtener el tipo de medio, establezca estos registros:
MOV
AX,440DH
/Peticin
MOV
BX,drive
/Unidad
(0
de
=
servicio
de
por omisin,
disco
1
= A,
etc.)
335
MOV CH, 0 8
MOV
CL.68H
LEA
DX,block
INT
21H
;Llama al DOS
(08)
(DS:DX)
El DX apunta a un bloque de medio de dos bytes para recibir informacin en el formato siguiente:
default
medatyp
DB
DB
?
?
02 para otros
07 = 1.44MB,
09 = 2.88MB
Una operacin exitosa pone en cero la bandera de acarreo y establece el tipo. De otra forma, la
operacin pone en uno la bandera de acarreo y regresa el cdigo de error 01 o 05 en el AX.
Otras operaciones de la funcin 44H IOCTL concernientes a la comparticin de archivo
estn fuera del alcance de esta obra.
I N T 21H, funcin 54H: Obtener estado de verificacin
Este servicio determina el estado de la bandera de verificacin de escritura en disco. (Vase la
funcin 2EH para activar este interruptor.) La operacin regresa 00H al AL para verificacin
apagada o 01H para verificacin activada. No existe condicin de error.
I N T 21H, funcin 59H: Obtener error ampliado
Esta operacin proporciona informacin adicional acerca de los errores despus de la ejecucin de
los servicios de la INT 21H que ponen en uno la bandera de acarreo, los servicios de FCB que
regresan FFH y de error en los manejadores con la INT 24H. La operacin regresa lo siguiente:
AX
BH
BL
CH
=
=
=
=
Tambin, la operacin pone en cero la bandera de acarreo y destruye el contenido de los registros
CL, DI, DS, DX, ES y SI. Guarde en la pila (PUSH) todos los registros necesarios antes de esta
interrupcin y squelos de ella (POP) despus.
Cdigo de error ampliado (AX). Regresa alguno de los 90 o ms cdigos de error; 00
significa que la operacin anterior INT 21H no tuvo error.
Clase de error (BH). Proporciona la informacin siguiente:
01H
No hay recurso, como canal de almacenamiento
02H
Situacin temporal (no un error), como condicin de archivo bloqueado que debe
desaparecer
03H
Falta de autorizacin apropiada
04H
Error en el sistema de software, no de este programa
05H
Fallo en el hardware
336 P r o c e s a m i e n t o e n d i s c o : I I O p e r a c i o n e s d e l D O S p a r a s o p o r t e d e d i s c o s y a r c h i v o s
Captulo 1 8
06H
07H
08H
09H
OAH
OBH
OCH
ODH
Accin
01
02
03
04
05
06
07
P R O G R A M A : L E C T U R A D E I N F O R M A C I N DESDE L O S S E C T O R E S
El programa de la figura 18-1 ilustra el uso de IOCTL funcin 44H, subfuncin ODH, cdigo secundario 61H. El programa lee informacin desde un sector y la enva a un bfer en memoria y
despliega cada byte de entrada como una pareja de bytes hex. RDBLOCK en el segmento de datos de
manera arbitraria especifica una cabeza, cilindro y sector inicial, que usted puede cambiar para
sus propios propsitos. RDBUFFR define dos direcciones:
1. IOBUFFR es el desplazamiento del bfer de entrada, que proporciona un sector de datos.
2. S E G D A T A utiliza el operador SEG para identificar la direccin del segmento de dato;
para la operacin IOCTL.
Los procedimientos principales en el segmento de cdigo son:
B10READ
C10CONV
Utiliza la operacin IOCTL para leer el sector. La prueba por una lectun
vlida es hecha al regresar del procedimiento.
Convierte cada byte en IOBUFFR en dos caracteres hexadecimales para des
plegado. Dos instrucciones XLAT manejan la conversin de cada medio byte
La rutina despliega 16 renglones de 32 parejas de caracteres.
TITLE
ROW
COL
XLATAB
READMSG
RDBLOCK
RDHEAD
RDCYLR
RDSECT
RDNOSEC
RDBUFFR
IOBUFFR
P18RDSCT (EXE)
.MODEL
SMALL
.STACK
64
Lee
337
sector de disco
. DATA
DB
DB
DB
DB
DB
00
00
30H,31H,32H,33H,34H,35H,36H,37H,38H,3 9H
41H,42H,43H,44H,45H,46H
'*** Read error ***', ODH, OAH
DB
DW
DW
DW
DW
DW
DW
DB
0
0
0
8
1
IOBUFFR
SEG
DATA
512 D U P ( ' )
.CODE
PROC
MOV
MOV
MOV
CALL
CALL
CALL
JNC
LEA
CALL
JMP
FAR
AX,data
DS,AX
ES, AX
Q10SCR
Q2 0CURS
B10READ
A8 0
DX, READMSG
X10ERR
A90
CALL
C10CONV
Convertir y desplegar
MOV
INT
ENDP
AX,4C00H
21H
,-Salir al DOS
Estructura
del bloque
rea del
.386
MAIN
Inicializa
registros
de segmento
Limpia la p a n t a l l a
Coloca el cursor
Obtiene datos del sector
Si la lectura es vlida, pasar
lectura no vlida
A80 :
A90 :
MAIN
B10READ
PROC
MOV
MOV
MOV
MOV
LEA
INT
RET
ENDP
NEAR
AX,440DH
BX, 01
CH, 08
CL,61H
DX,RDBLOCK
21H
sector:
PROC
LEA
NEAR
SI,IOBUFFR
MOV
SHR
LEA
XLAT
CALL
INC
MOV
AL, [SI]
AL, 04
BX,XLATAB
C20 :
Correr a la derecha un dgito hex
Designar direccin de la tabla
Traducir el hex
Q30DISPL
COL
AL,[SI]
Figura 18-1
338 P r o c e s a m i e n t o e n d i s c o : I I O p e r a c i o n e s d e l D O S p a r a s o p o r t e d e d i s c o s y a r c h i v o s
AND
XLAT
CALL
INC
INC
CMP
C10CONV
JBE
INC
MOV
CALL
CMP
JBE
RET
ENDP
AL, OFH
,-Borrar e l d g i t o
, T r a d u c i r el h e x
Q10SCR
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
Q2 0CURS
Q30DISPL
Q3 0DISPL
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
PROC
MOV
MOV '
INT
RET
ENDP
PROC
MOV
MOV
MOV
XiOERR
INT
INC
RET
ENDP
END
la
izquierda
la
pantalla:
cursor:
NEAR
AH,02H
B H , 00
DH, ROW
DL,COL
10H
Peticin para
el cursor
rengln
columna
NEAR
AH,02H
DL, A L
21H
colocar
-
;Peticin para
;
imprimir carcter
Desplegar
X10ERR
de
NEAR
AX,0600H
BH,1EH
CX,0000
DX,184FH
10H
Establece
Q2 0CURS
de
Q30DISPL
SI
COL
COL,64
C2 0
ROW
COL,00
Q2 0CURS
ROW,16
C20
Recorrido
Q10SCR
hex
Captulo 18
mensaje
NEAR
AH,40H
BX, 01
CX, 20
21H
ROW
de
error
de
disco:
DX contiene la
Manej ador
Longitud
del mensaje
direccin
MAIN
Figura 18-1
(continuacin)
'd:\pathname'
339
,00H;Cadena A S C I I Z
MOV A H , 3 9 H
/Peticin para
crear
subdirectorio
LEA
DX,ASCstrg
INT
21H
(DS:DX)
Una operacin exitosa pone en cero la bandera de acarreo; un error la pone en uno y regresa el
cdigo 03 o 05 en el AX.
INT 21H, funcin 3AH: Eliminar subdirectorio
Este servicio elimina un subdirectorio, tal como lo hace el comando RMDIR del DOS. Cargue el
DX con la direccin de una cadena ASCIIZ con la unidad y la ruta al directorio (tome en cuenta
que no puede eliminar el directorio actual o un subdirectorio con archivos):
A S C s t r g DB
'd:\pathname'
,00H/Cadena A S C I I Z
MOV A H . 3 A H
LEA
DX,ASCstrg
/Direccin de la cadena A S C I I Z
INT
21H
(DS:DX)
Una operacin exitosa pone en cero la bandera de acarreo; un error la pone en uno y regresa el
cdigo 0 3 , 05 o 10H en el AX.
INT 21H, funcin 3BH: Cambiar de directorio actual
Este servicio cambia el directorio actual a uno que usted especifique, tal como lo hace el comando
CHDIR del DOS. Cargue el DX con la direccin de una cadena ASCIIZ con la nueva unidad y la
ruta del directorio:
A S C s t r g DB
'd:\pathname'
,00H
/Cadena A S C I I Z
MOV A H , 3 B H
LEA
DX,ASCstrg
/Direccin de la cadena A S C I I Z
INT
21H
(DS:DX)
Una operacin exitosa pone en cero la bandera de acarreo; un error la pone en uno y regresa el
cdigo 03 en el AX.
INT 21H, funcin 47H: Obtener el directorio actual
La funcin 47H del DOS determina el directorio actual en cualquier unidad. Defina un espacio
para el bfer suficientemente grande para contener el nombre de ruta ms largo (64 bytes) y
cargue su direccin en el SI. Identifique la unidad en el DL por 0 = por omisin, 1 = A, 2 = B,
y as sucesivamente:
340 P r o c e s a m i e n t o e n d i s c o : I I O p e r a c i o n e s d e l D O S p a r a s o p o r t e d e d i s c o s y a r c h i v o s
buffer
DB
64
MOV
AH,47H
MOV
DL,drive
/Unidad
LEA
SI,buffer
/Direccin
INT
DUP
(20H)
;Espacio
de
,-Peticin
64
para
del
bytes
para
obtener
bfer
el
el
Capitulo 18
bfer
subdirectorio
(DS:DI)
21H
Una operacin vlida pone en cero la bandera de acarreo y enva el nombre del directorio actual
(pero no la unidad) al bfer como una cadena ASCIIZ, como
ASSEMBLE\EXAMPLESO
Un byte con OOH identifica el final del nombre de la ruta. Si el directorio solicitado es el principal
(raz), el valor regresado es slo un byte de OOH. De esta manera, puede obtener el nombre de la
ruta actual a fin de accesar cualquier archivo en un subdirectorio. Un nmero no vlido de unidad
pone en uno la bandera de acarreo y regresa el cdigo de error OFH en el AX.
C10PATH
Utiliza la funcin 19H para obtener la unidad por omisin en el registro AL.
La unidad es regresada como 0 (para A), 1 (para B) y as sucesivamente. Para
adaptar el nmero a su equivalente alfabtico, slo sume 41H, de modo que 00
se convierta en 41H (A), 01 se convierta en 42H (B), y as sucesivamente.
Despus el procedimiento despliega la letra de la unidad seguida por dos puntos y diagonal inversa (n:\).
Utiliza la funcin 47H para obtener el nombre de la ruta al directorio actual. El
procedimiento prueba de forma inmediata por el delimitador OOH ASCIIZ, ya
que un valor por omisin al directorio raz enviara slo ese carcter. En otro
caso, la rutina despliega cada carcter hasta el OOH.
El programa de forma intencional slo contiene las caractersticas necesarias para que funcione; un programa completo incluira, por ejemplo, el borrado de la pantalla y la utilizacin de
colores.
TITLE
BEGIN:
PATHNAM DB
64 D U P ( '
MAIN
NEAR
B10DRIV
C10PATH
AH,10H
16H
AX,4C00H
21H
MAIN
341
PROC
CALL
CALL
MOV
INT
MOV
INT
ENDP
')
B10DRIV PROC
MOV
INT
ADD
MOV
CALL
MOV
CALL
MOV
CALL
RET
B10DRIV ENDP
NEAR;
AH,19H
21H
AL,41H
DL, AL
Q10DISP
DL,':'
Q10DISP
DL,'\'
Q10DISP
C10PATH PROC
MOV
MOV
LEA
INT
C20 :
CMP
JE
MOV
MOV
CALL
INC
JMP
C90 :
RET
C10PATH ENDP
NEAR;
AH,47H
DL, 00
SI,PATHNAM
21H
Q10DISP PROC
MOV
INT
RET
Q10DISP ENDP
END
actual
Peticin de
la unidad p o r omisin
BYTE PTR
C90
AL, [SI]
DL, AL
Q10DISP
SI
C2 0
[SI] , 00H
NEAR
AH,02H
21H
diagonal inversa
BEGIN
Figura 18-2
342 P r o c e s a m i e n t o e n d i s c o : I I O p e r a c i o n e s d e l D O S p a r a s o p o r t e d e d i s c o s y a r c h i v o s
Captulo 18
Cargue el registro SI (asociado con el DS) con la direccin de la especificacin del archivo
que ser analizado, el DI ( asociado con el ES) con la direccin de un rea en donde la operacin
genera el formato FCB y el AL con el valor en bit que controla el mtodo del anlisis gramatical:
MOV
A H , 2 9H
;Peticin
MOV
AL,code
/Mtodo
LEA
DI,FCBname
;Direccin
del
LEA
SI,filespec
,-Direccin
de
INT
21H
,-Llama
de
al
para
anlisis
anlisis
FCB
la
gramatical
del
nombre
de
archivo
gramatical
(ES:DI)
especificacin
de
archivo
(DS:SI)
DOS
VALOR
ACCIN
4-7
Para datos vlidos, la funcin 29H crea un formato FCB estndar para el nombre y extensin del archivo, con un nombre de archivo de ocho caracteres, rellenados con blancos si es
necesario, una extensin de tres caracteres, rellenada con blancos si es necesario, y sin punto entre
ellos.
La operacin reconoce la puntuacin estndar y convierte los comodines * y ? en una cadena
de uno o ms caracteres. Por ejemplo, PROG12.* se convierte en PROG12bb???. El AL regresa
uno de los cdigos siguientes:
OOH No se encontraron comodines
01H Comodines convertidos
FFH Unidad especificada no vlida
Despus de la operacin, el DS:SI contiene la direccin del primer byte despus de la
filespec analizada gramaticalmente y el ES:DI contiene la direccin del primer byte del FCB.
Para una operacin fallida, el byte en D I + 1 es un blanco, aunque la operacin intenta convertir
casi cualquier cosa que usted le enve.
343
Para que esta operacin funcione con manejadores de archivo, tiene que editar despus el
FCB para eliminar los blancos e introducir el punto entre el nombre y la extensin del archivo.
'd: \pathname' ,
00H
/Cadena ASCIIZ
MOV A H , 4 1 H
LEA
DX,ASCstrg
/Direccin de la cadena A S C I I Z
INT
21H
/Llama al DOS
(DS:DX)
Una operacin vlida pone en cero la bandera de acarreo, marca el nombre del archivo como
borrado en el directorio y libera en la FAT el espacio en disco asignado al archivo. Un error pone
en uno la bandera de acarreo y regresa el cdigo 02, 03 o 05 en el AX.
d:\pathname'
, 00H
/Cadena ASCIIZ
MOV
AH,43H
/Peticin
MOV
AL, 0 0
LEA
DX,ASCstrg
/Direccin de la cadena A S C I I Z
INT
21H
/Llama al DOS
(DS:DX)
Una operacin vlida pone en cero la bandera de acarreo y regresa el atributo actual al CX (CH =
00 y CL = atributo):
BIT
0
1
2
ATRIBUTO
Slo lectura
Archivo oculto
Archivo de sistema
BIT
3
4
5
ATRIBUTO
Etiqueta de volumen
Subdirectorio
Archivo archivado
Capitulo 18
AH.43H
;Peticin
MOV
AL,01
para
MOV
CX,22H
de
LEA
DX.ASCstrg
/Cadena
INT
21H
/Llama
establecer
oculto y
de
ASCIIZ
al
atributosarchivado
(DS:DX)
DOS
Una operacin vlida pone en cero la bandera de acarreo y designa la entrada del directorio con
los atributos en el CX. Una operacin no vlida pone en uno la bandera de acarreo y regresa el
cdigo 02, 03 o 05 al AX.
INT 21H, funcin 45H: Duplicar un manejador de archivo
Puede usar este servicio para dar a un archivo ms de un manejador. Los usos de manejadores
anteriores comparados con los nuevos son idnticos: los manejadores hacen referencia al mismo
archivo, apuntador de archivo y rea del bfer. Un uso es para solicitar un manejador de archivo
y utilizar ese manejador para cerrar el archivo. Esta accin provoca que el DOS limpie el bfer y
actualice el directorio. Entonces puede utilizar el manejador original del archivo para continuar el
procesamiento del archivo. Un ejemplo del uso de la funcin 45H es el siguiente:
MOV
AH,45H
/Peticin
MOV
BX.handle
/Manejador
INT
para
duplicar
actual
que
manejador
ser
duplicado
21H
Una -operacin exitosa pone en cero la bandera de acarreo y regresa el nuevo manejador (el
siguiente disponible) en el AX. Un error pone en uno la bandera de acarreo y regresa el cdigo de
error 04 o 06 al AX. (Vase tambin la funcin 46H.)
INT 21H, funcin 46H: Forzar duplicacin de un manejador de archivo
Este servicio es similar a la funcin 45H, salvo que puede asignar un manejador de archivo
especfico. Usted podra utilizar este servicio, por ejemplo, para redireccionar la salida. Cargue el
BX con el manejador original y el CX con el segundo manejador.
Una operacin exitosa pone en cero la bandera de acarreo; un error la pone en uno y regresa
el cdigo de error 04 o 06 al AX. Algunas combinaciones pueden no funcionar; por ejemplo, el
manejador 00 siempre es la entrada desde el teclado, 04 es la salida a una impresora y 03 (auxiliar)
no puede ser redireccionada. (Vase tambin la funcin 45H.)
INT 21H, funcin 4EH: Encontrar primer archivo que coincida
Esta operacin es similar (y se prefiere) a la funcin original 11H. Utilice la funcin 4EH para
empezar a buscar en un directorio y 4FH para continuar la bsqueda. Tiene que definir un bfer
345
43 DUP
DB
'ASCIIZ
MOV
AH, 1AH
LEA
DX,DTAname
INT
21H
;Llama al DOS
MOV
AH,4EH
;Peticin primera
MOV
CX,OOH
;Atributo
LEA
DX,ASCstrg
;Cadena ASCIIZ
INT
21H
;Llama al DOS
(?)
string', OOH
(DS:DX)
coincidencia
normal
(DS:DX)
Una operacin que localiza una coincidencia entre los bits de atributos pone en cero la bandera de
acarreo y llena el DTA de 43 bytes (2BH) con lo siguiente:
00H-14H
15H
16H-17H
18H-19H
1AH-1DH
1EH-2AH
AH,4FH
;Peticin de
INT
21H
;Llama al DOS
siguiente coincidencia
346 P r o c e s a m i e n t o e n d i s c o : I I O p e r a c i o n e s d e l D O S p a r a s o p o r t e d e d i s c o s y a r c h i v o s
Captulo 1 8
Una operacin exitosa pone en cero la bandera de acarreo y regresa al AX los cdigos 00 (nombre
de archivo encontrado) o 18 (no hay ms archivos). Un error pone en uno la bandera de acarreo y
regresa el cdigo 02, 03 o 12H en el AX.
La figura 18-3 ilustra las funciones 4EH y 4FH.
INT 21H, funcin 56H: Renombrar archivo o directorio
Este servicio puede renombrar un archivo o directorio desde un programa. Cargue el DX con la
direccin de una cadena ASCIIZ con la unidad, ruta y nombre anteriores del archivo o directorio
que ser renombrado. Cargue el DI (realmente ES:DI) con la direccin de una cadena ASCIIZ
con la unidad, ruta y nombre nuevos, sin comodines. Si us nmeros de unidad deben ser los
mismos en ambas cadenas. Ya que las rutas no necesitan ser las mismas, la operacin puede
renombrar y mover el archivo a otro directorio en la misma unidad:
oldstrg
DB
'd:\oldpath\oldname',
OOH
newstrg
DB
'd:\newpath\newname',
OOH
MOV
AH,5GH
Peticin
LEA
DX.oldstring
DS:DX
LEA
DI,newstring
ES : DI
INT
21H
Llama
para
al
renombrar
archivo/directorio
DOS
Una operacin exitosa pone en cero la bandera de acarreo; un error pone en uno la bandera de
acarreo y regresa en el AX el cdigo 02, 0 3 , 05 u 11H.
INT 21H, funcin 57H: Obtener/poner la fecha y hora del archivo
Este servicio permite a un programa obtener o poner la fecha y hora de un archivo abierto. Los
formatos para la hora y fecha son los mismos que los del directorio:
BITS PARA LA HORA
0BH-0FH
05H-0AH
00H-04H
Horas
Minutos
Segundos
09H-0FH
05H-08H
00H-04H
Ao (relativo a 1980)
Mes
Da del mes
(Los segundos estn en la forma del nmero de incrementos cada dos segundos, 0-29.) Cargue la
peticin (0 = obtener, 1 = poner) en el AL y el manejador de archivo en el BX. Para una peticin
de poner la hora y fecha, cargue la hora en el CX y la fecha en el DX. A continuacin est un
ejemplo:
MOV
AH,57H
MOV
AL, 01
Peticin
Poner
MOV
BX,handle
MOV
CX,time
MOV
DX.date
INT
21H
de
fecha
Manejador
Hora
Fecha
de
nueva
nueva
fecha/hora
y
hora
archivo
347
Una operacin vlida pone en cero la bandera de acarreo; la operacin de obtener regresa la hora
en el CX y la fecha en el DX, mientras que la operacin para poner la hora y fecha cambia las
entradas de fecha y de hora para el archivo. Una operacin no vlida pone en uno la bandera de
acarreo y regresa en el AX el cdigo de error 01 o 06.
INT 21H, funcin 5AH: Crear un archivo temporal
Este servicio es til para un programa que cree archivos temporales, en especial en redes, en el
que los nombres de otros archivos pueden ser desconocidos y el programa sirve para evitar sobreescribir
en ellos de manera accidental. La operacin crea un archivo con un nombre nico en la ruta.
Cargue el CX con el atributo necesario del archivo: cualquier combinacin de slo lectura
(bit 0), oculto (bit 1), de sistema (bit 2), de etiqueta de volumen (bit 3), directorio (bit 4) o de
archivado (bit 5). Cargue el DX con la direccin de una ruta ASCIIZ: la unidad (si es necesario),
el subdirectorio (si hay), una diagonal inversa y OOH, seguida por 13 bytes para el nombre nuevo
del archivo:
ASCpath
DB
MOV
d:\pathname\',
AH, 5AH
OOH 13 DUP
(20H)
MOV
CX,atributte
/Atributo del
LEA
DX,ASCpath
;Ruta ASCIIZ
INT
21H
archivo
Una operacin exitosa pone en cero la bandera de acarreo, enva el manejador de archivo al AX
y aade el nombre nuevo del archivo a la cadena ASCIIZ, iniciando en el byte OOH. Un error pone
en uno la bandera de acarreo y regresa el cdigo 03, 04 o 05 en el AX.
INT 21H, funcin 5BH: Crear un archivo nuevo
Este servicio crea un archivo slo si el archivo nombrado no existe; por lo dems es idntica a la
funcin 3CH (crear archivo). Usted debe utilizar la funcin 5BH siempre que no quiera sobreescribir
en un archivo. Una operacin vlida pone en cero la bandera de acarreo y regresa el manejador
del archivo en el AX. Una operacin no vlida (incluyendo encontrar un nombre de archivo
idntico) pone en uno la bandera de acarreo y regresa el cdigo 03, 04, 05 o 50H en el AX.
PROGRAMA: BORRAR ARCHIVOS DE FORMA SELECTIVA
El programa de la figura 18-3 ilustra el uso de las funciones 4EH y 4FH del DOS para encontrar
todos los nombres de archivo en el directorio por omisin y la funcin 41H borra los archivos
seleccionados. El programa consiste en los procedimientos siguientes:
MAIN
B10FIRST
C10NEXT
D10DISPL
E10DELET
348 P r o c e s a m i e n t o e n d i s c o : I I O p e r a c i o n e s d e l D O S p a r a s o p o r t e d e d i s c o s y a r c h i v o s
TITLE
CODESG
borra
los
Captulo 1 8
BEGIN:
P 1 8 S E L D L (COM)
Selecciona
S E G M E N T PARA 'Code'
.MODEL SMALL
.CODE
ORG
100H
JMP
MAIN
archivos
TAB
LF
CR
CRLF
PATHNAM
DELMSG
ENDMSG
ERRMSG1
ERRMSG2
PROMPT
DISKAREA
EQU
EQU
EQU
DB
DB
DB
DB
DB
DB
DB
DB
09
10
13
CR, LF, '$'
'F:\*.*', OOH
TAB,
'Erase ','$ i
CR, LF,
'No m o r e d i r e c t o r y e n t r i e s ' , C R , L F ,
'i
'Invalid path/file',
'$'
'Write-protected disk','$'
'Y = E r a s e , N = K e e p , E n t = E x i t ' , C R , L F , ' $ '
43 DUP(20H)
MAIN
PROC
CALL
CALL
CALL
CMP
JNE
LEA
CALL
NEAR
Q10SCRN
Q2 0CURS
B10FIRST
AX,OOH
A9 0
DX,PROMPT
Q3 0LINE
;Procedimiento principal
;Limpia la p a n t a l l a
,-Coloca e l c u r s o r
,
en la e n t r a d a d e l d i r e c t o r i o
,-Si n o h a y e n t r a d a s ,
, s a l i r
, I n d i c a c i n i n i c i a l
CALL
CALL
CMP
JE
LEA
CALL
CALL
CMP
JE
D10DISPL
E10DELET
AL,OFFH
A90
DX,CRLF
Q30LINE
C10NEXT
AX,OOH
A2 0
MOV
INT
ENDP
AX,4C00H
21H
/Salir
PROC
MOV
LEA
INT
MOV
MOV
LEA
INT
JNC
PUSH
LEA
CALL
POP
RET
ENDP
NEAR
AH,1AH
DX,DISKAREA
21H
AH,4EH
CX, 00
DX, PATHNAM
21H
B90
AX
DX,ERRMSG1
Q3QLINE
AX
PROC
MOV
INT
CMP
JE
NEAR
AH,4FH
21H
AX,OOH
C90
A20:
A90:
MAIN
B10FIRST
B90 :
B10FIRST
C10NEXT
Figura 18-3
al
DOS
/Obtener el
/
llamadas
DTA para
de la f u n c i n
/Lee e n t r a d a del d i r e c t o r i o
/Obtiene la siguiente
/Hay ms e n t r a d a s ?
:
s, pasar
del
C90 :
C10NEXT
D10DISPL
PUSH
LEA
CALL
POP
RET
ENDP
AX
DX,ENDMSG
Q30LINE
AX
PROC
LEA
CALL
LEA
NEAR
DX,DELMSG
Q30LINE
SI, DISKAREA+1EH
MOV
CALL
INC
CMP
JNE
MOV
CALL
RET
ENDP
DL, [SI]
Q40CHAR
SI
BYTE PTR [SI] , 00
D3 0
DL,'?'
Q4OCHAR
PROC
MOV
INT
CMP
JE
OR
CMP
JNE
MOV
LEA
INT
JNC
LEA
CALL
NEAR
AH,10H
16H
AL,ODH
E50
AL,00100000B
AL, 'y'
E90
AH,41H
DX,DISKAREA+1EH
21H
E90
DX,ERRMSG2
Q30LINE
MOV
RET
ENDP
AL,OFFH
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
NEAR
AX,0600H
BH,1EH
CX, 00
DX,184FH
10H
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
NEAR
AH,02H
BH, 00
DH, 00
DL, 10
10H
PROC
MOV
INT
RET
ENDP
NEAR
AH,09H
21H
349
no,
mostrar
final
mensaje
D30 :
D10DISPL
E10DELET
carcter
Carcter siguiente
Cero hex para detener?
no, obtener carcter siguiente
s, salir
Aceptar un carcter
respuesta (y/n)
Carcter Enter?
s, salir
Fuerza letra minscula
Peticin de borrado?
no, pasar
s
direccin de la entrada borrada
del nombre de archivo
Borrado vlido?
no, mostrar
mensaje de
E50 :
E90 :
;Obtener
:Indicador del
advertencia
fin del proceso
E10DELET
Q10SCRN
Q10SCRN
Q2 0CURS
Q2 0CURS
Q3 0LINE
Q3 0LINE
Figura 18-3
Peticin para
colocar el cursor
Rengln 0
Columna 10
(continuacin)
Q4OCHAR
PROC
MOV
INT
RET
ENDP
END
NEAR
AH,02H
21H
/Peticin para
,-DL d e s i g n a a l
Captulo 18
desplegar
inicio
BEGIN
Figura 18-3
(continuacin)
PREGUNTAS
Utilice DEBUG para las primeras tres preguntas. Teclee el comando A 100 y las instrucciones
necesarias. Examine los valores regresados en los registros.
18-1. Operaciones que requieren unidades de disco:
(a) Funcin 19H para determinar la unidad de disco por omisin.
(b) Funcin 1BH para informacin acerca de la actual unidad de disco por omisin.
(c) Funcin 1FH para informacin acerca de DPB por omisin.
(d) Funcin 36H para determinar la cantidad de espacio libre en el disco.
(e) Funcin 4400H para obtener informacin sobre el dispositivo en uso.
(f) Funcin 4408H para determinar si algunos medios son removibles.
(g) Funcin 440DH, cdigo secundario 60H, para obtener los parmetros del dispositivo.
(h) Funcin 440DH, cdigo secundario 66H, para obtener la identificacin del medio.
18-2. Operaciones que implican directorios:
(a) Funcin 39H para crear un subdirectorio. Por seguridad, usted debe crearlo en un disco RAM
(disco virtual) o en un disco flexible. Utilice cualquier nombre.
(b) Funcin 56H para renombrar el subdirectorio.
(c) Funcin 3AH para eliminar el subdirectorio.
18-3. Operaciones que implican archivos en disco:
(a) Funcin 43H para obtener el atributo de un archivo en disco. (Para este ejercicio, utilice una
copia de un archivo.)
(b) Funcin 56H para renombrar el archivo.
(c) Funcin 43H para colocar el atributo de oculto.
(d) Funcin 57H para obtener la fecha y hora del archivo.
(e) Funcin 41H para borrar el archivo.
Preguntas
351
18-4. Escriba un pequeo programa desde el DEBUG, que simplemente ejecute la funcin 29H del DOS,
analizar gramaticalmente el nombre del archivo. Proporcione la especificacin del archivo en 81H y
el FCB en 5CH; ambos estn en el PSP, inmediatamente antes del programa. Introduzca varias
especificaciones de archivo, como D:PROGA.DOC, PROGB, PROGC* y C:*.ASM. Despus de
cada ejecucin de la funcin, verifique los resultados en el desplazamiento 5CH.
CAPTULO 19
\
\
Procesamiento en disco:
]
IIIOperaciones del BIOS para disco |
i
OBJETIVO
E x a m i n a r los requisitos bsicos de p r o g r a m a c i n p a r a utilizar
las funciones del B I O S p a r a leer, escribir, formatear y verificar
discos.
INTRODUCCIN
En los captulos 17 y 18 examinamos el uso de los servicios del DOS para procesamiento de disco.]
Tambin puede codificar de forma directa a nivel del BIOS para procesamiento de disco, aunque)
el BIOS no facilita un uso automtico del directorio o bloqueo y desbloqueo de registros. La operacin INT 13H del BIOS para disco, trata informacin como el tamao de un sector y maneja el
direccionamiento en disco en trminos de los nmeros de pista y sectores reales. Las operaciones
del BIOS para disco implican restablecer la lectura, escritura, verificacin y formateo de la
unidad.
j
La mayora de las operaciones del BIOS son para expertos desarrolladores de software que!
estn conscientes del peligro potencial por un mal uso. Tambin las versiones del BIOS pueden
variar de acuerdo con el procesador utilizado o aun por el modelo de computadora.
Este captulo introduce las siguientes funciones de la INT 13H del BIOS:
j
352
OOH
01H
OOH
01H
i
j
353
Leer sectores
Escribir sectores
Verificar sectores
Formatear pistas
Obtener parmetros de la unidad
Obtener tipo de disco
Cambiar estado del disco
Establecer tipo de disco
Establecer tipo de medio para
formatear
02H
03H
04H
05H
08H
09H
OAH
OBH
OCH
ODH
OEH
OFH
15H
19H
Leer sectores
Escribir sectores
Verificar sectores
Formatear pistas
Obtener parmetros de la unidad
Inicializar unidad
Leer sector ampliado del bfer
Escribir sector ampliado del bfer
Buscar cilindro
Restauracin alterna de disco
Leer bfer del sector
Escribir bfer del sector
Obtener tipo de disco
Estacionar las cabezas del disco
Cdigo
OOH
01H
02H
03H
04H
05H
06H
07H
08H
09H
10H
20H
40H
80H
AAH
BBH
CCH
Estado
No hubo error
Comando incorrecto, no reconocido por el controlador
Marca de direccin en disco no se encontr
Intento de escribir en un disco protegido
Pista/sector no vlido
Fallo en la operacin de restablecer
Se retir el disco flexible desde el ltimo acceso
Parmetros de la unidad errneos
A c c e s o directo a memoria (DMA) rebasado
(informacin accesada demasiado rpido para ingresar)
Intento de DMA de cruzar una frontera de 64K al leer/escribir
Se encontr una incorrecta CRC en una lectura
(verificador de errores indica datos daados)
Fallo en el controlador (fallo en el hardware)
Fallo en una operacin de bsqueda (fallo en el hardware)
Fallo en el dispositivo al responder (disco flexible: compuerta
de la unidad abierta o no hay disco; disco duro: se acab el tiempo)
Unidad no est preparada
Error no definido
Fallo al escribir
Figura 19-1
354
Captulo 1 9
AH.OOH
,-Peticin
para
MOV
DL.80H
/Disco
duro
INT
13H
/Llama
al
restablecer
el
disco
BIOS
Una operacin vlida pone en cero la bandera de acarreo; un error la pone en uno y regresa un
cdigo de estado en el AH. La funcin ODH es una operacin relacionada.
INT 13H, funcin 01H: Leer estado del disco
Esta operacin le da otra eleccin para examinar el estado de la mayora de las ms recientes
operaciones en disco. (Vase byte de estado en la figura 19-1.) Establezca el DL al cdigo usual
(0 = unidad A, etc.) para disco flexible y un nmero de 80H o ms (80H = primer unidad, etc.)
para disco duro. Esta operacin regresa al AL el cdigo de estado que la ltima operacin en el
disco habra regresado al AH. La operacin siempre debera ser vlida, y pone en cero la bandera
de acarreo y regresa su propio cdigo de estado, OOH, en el AH.
INT 13H, funcin 02H: Leer sectores
Esta operacin lee un nmero especificado de sectores en la misma pista y de manera directa los
enva a la memoria. Inicialice los registros siguientes:
AL
CH
CL
DH
DL
ES:BX
DB
512 DUP(?)
/rea p a r a
MOV
AH,02H
/Peticin
entrada
de
lectura
355
MOV
AL, 01
;Un sector
LEA
BX,INSECT
MOV
CH, 05
;Pista 0 5
MOV
CL, 03
;Sector 03
MOV
DH, 0 0
;Cabeza 0 0
MOV
DL, 03
.Unidad 03
INT
13H
;Llama al BIOS
(D)
MOV CX, 03
0103
PUSH CX
,-Guarda el contador
0104
MOV AX,0201
0107
MOV BX,0200
/Direccin de entrada
010A
MOV CX,0001
010D
MOV DX,0000
0110
INT 13
/Llama al BIOS
0112
POP CX
/Restaura el
0113
JNC 118
0115
CLC
0116
LOOP
0118
NOP
103
contador
/ intentar 3 veces
salir
356
Captulo 1 9
TITLE
CURADR
ENDADR
ENDCDE
READMSG
RECDIN
SIDE
BEGIN
357
P19BIORD (COM)
.MODEL
SMALL
. STACK 64
.DATA
DW
DW
DB
DB
DB
DB
0304H
Pista/sector iniciales
0S01H
;Pista/sector finales
00
;Indicador del fin del proc
'* Error al leer * $ '
512 D P ( ' ')
;rea de entrada
00
.CODE
PROC
MOV
MOV
MOV
MOV
FAR
AX,@data
DS,AX
ES,AX
AX,0600H
Inicializa
registros
de segmentos
Peticin de recorrido
A20LOOP:
A90:
BEGIN
CALL
CALL
CALL
MOV
MOV
CMP
JE
CALL
CMP
JNZ
CALL
JMP
MOV
INT
ENDP
Q10SCRN
Q20CURS
C10ADDR
CX,CURADR
DX,ENDADR
CX,DX
A90
F10READ
ENDCDE,00
A90
G10DISP
A2 0LOOP
AX.4C00H
21H
Limpia la p a n t a l l a
Coloca el cursor
Calcula la direccin en disco
,-Es el sector final?
; s, salir
,-Lee el registro del disco
;Lectura normal?
no, salir
,-Muestra sector
;Repite
;Salir al DOS
PROC
MOV
CMP
JNE
MOV
CMP
JE
INC
NEAR
CX,CURADR
CL, 10
C90
CL, 01
SIDE,00
C20
CH
XOR
MOV
RET
ENDP
SIDE,01
CURADR,CX
,-Obtiene p i s t a / s e c t o r
;Pas el ltimo sector?
; no, salir
/Establece el sector en 1
;Si es el lado 0, p a s a r
;Incrementa la pista
C20:
C90 :
C10ADDR
,-Cambia de lado
PROC
MOV
MOV
LEA
MOV
MOV
MOV
INT
CMP
JZ
MOV
CALL
Figura 19-2
NEAR
AH,02H
AL, 01
BX,RECDIN
CX, CURADR
DH,SIDE
DL,01
13H
AH, 00
F90
ENDCDE,01
X10ERR
Peticin de lectura
Nmero de sectores
Direccin del bfer
Pista/sector
Lado
Unidad B
Lectura normal?
s, salir
no:
lectura no v l i d a
358
Captulo 1 9
F90 :
FlOREAD
INC
RET
ENDP
CURADR
;Incrementa
Muestra
G10DISP
G10DISP
PROC
MOV
MOV
MOV
LEA
INT
RET
ENDP
Q10SCRN
Q10SCRN
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
Q20CURS
PROC
MOV
MOV
MOV
INT
RET
ENDP
X10ERR
PROC
MOV
MOV
MOV
LEA
INT
RET
ENDP
END
para
desplegar
pantalla:
el
NEAR
AH,02H
B H , 00
DX,0000
10H
Muestra
XIOERR
la
Peticin
Manejador
Longitud
NEAR
AX,0600H
BH,1EH
CX,0000
DX,184FH
10H
Coloca
Q2 0CURS
sector:
NEAR
AH,40H
BX, 01
CX,512
DX,RECDIN
21H
Limpia
sector
cursor:
;Peticin para
;
c o l o c a r el c u r s o r
el
NEAR
AH,40H
BX, 01
C X , 18
DX,READMSG
21H
mensaje
de
error
de
disco:
BEGIN
Figura 19-2
(continuacin)
359
Tipo de disco flexible (01H = 360K, 02H = 1.2M, 03H = 720K, 04H = 1.44M)
Nmero superior de cilindro/pista
Bits 0-5 = nmero superior de sector
Bits 6-7 = dos bits de orden alto del nmero de cilindro
Nmero superior de cabeza
Nmero de unidades conectadas al controlador
Para discos flexibles, segmento desplazamiento de una tabla de 11 bytes de
parmetros de unidad de disco flexible.
Dos campos relevantes son:
Desplazamiento 3bytes por sector (OOH = 128, 01H = 256, 02H = 512H,
03H = 1024)
Desplazamiento 4sectores por pista
360
Captulo 19
Nmero de cilindro/pista
Bits 0-5 = nmero de sector
Bits 6-7 = dos bits de orden alto del nmero de cilindro
Nmero de cabeza (lado)
Unidad (80H o mayor)
La operacin pone en uno o cero la bandera de acarreo y regresa un cdigo de estado en el AH.
INT l j H , funcin ODH: Restauracin alterna de disco
Esta operacin es similar a la funcin OOH, excepto que est restringida a discos duros. Cargue la
unidad (80H o mayor) en el DL. El brazo de acceso de lectura/escritura se reposiciona en el
361
cilindro 0. La operacin pone en uno o cero la bandera de acarreo y regresa un cdigo de estado
en el AH.
INT 13H, funcin OEH: Leer bfer del sector
Esta operacin es similar a la funcin OAH, salvo que lee parte de los 512 bytes del sector y no los
bytes del E C C .
INT 13H, funcin OFH: Escribir bfer del sector
Esta operacin es similar a la funcin OBH, salvo que escribe parte de los 512 bytes del sector ECC.
INT 13H, funcin 10H: Probar si est preparada la unidad; 11H:
Recalibrar la unidad de disco duro; 12H: Diagnstico de ROM;
13H: Diagnstico de la unidad, y 14H: Diagnstico del controlador
Estas funciones realizan un diagnstico interno y reportan informacin especfica para el BIOS y
para programas avanzados de utileras. Estas operaciones ponen en uno o cero la bandera de
acarreo y regresan un cdigo de estado en el AH.
INT 13H, funcin 15H: Obtiene el tipo de disco
Esta funcin regresa la informacin acerca de la unidad de disco. Cargue el DL con la unidad
(0 = A, etc. para disco flexible o bien 80H o mayor para disco duro). Una operacin vlida
regresa uno de los cdigos siguientes en el AH:
OOH
01H
02H
03H
Por el cdigo de regreso 03 en el AH, la pareja CX:DX contiene el nmero total de sectores de
disco en la unidad. La operacin pone en uno o cero la bandera de acarreo y regresa un cdigo
de estado en el AH.
INT 13H, funcin 16H: Cambia el estado del disco flexible
Esta funcin verifica si hay un cambio de disco flexible para sistemas que pueden ser sensibles a
cambios. Cargue el DL con el nmero de unidad (0 = A, etc.). La operacin regresa uno de los
cdigos siguientes en el AH:
OOH
01H
06H
80H
Los cdigos de estado 01H y 80H son errores que ponen en uno la bandera de acarreo, mientras
que el 06H es un estado vlido que tambin pone en uno la bandera de acarreo. sta es una fuente
potencial de confusin.
362
Captulo 1 9
Una operacin vlida regresa en el ES:DI un apuntador a una tabla, de 11 bytes, de parmetros de
disco flexible. (Vase la funcin 08H.) La operacin pone en uno o cero la bandera de acarreo y
regresa un cdigo de estado en el AH.
INT 13H, funcin 19H: Estacionar las cabezas del disco
Esta operacin necesita el nmero de la unidad en el DL (80H y mayor para disco duro). La
operacin pone en uno o cero la bandera de acarreo y regresa un cdigo de estado en el AH.
PUNTOS CLAVE
La INT 13H del BIOS proporciona acceso directo a las pistas y sectores.
La INT 13H del BIOS no proporciona un manejo automtico de directorio, operaciones con
fin de archivo ni bloqueo y desbloqueo de registros.
La operacin para verificar sector realiza una comprobacin elemental de datos escritos con
un costo en el tiempo de procesamiento.
El programa debe examinar el byte de estado despus de cada operacin para disco del
BIOS.
PREGUNTAS
19-1. Cules son las dos principales desventajas de utilizar la INT 13H del BIOS? Esto es, por qu por lo
comn es preferible el uso de las interrupciones del DOS?
19-2. Bajo qu circunstancias un programador usara la INT 13H del BIOS?
19-3. La mayora de las operaciones de la INT 13H regresan un cdigo de estado, (a) En dnde es
regresado este cdigo? (b) Qu significa el cdigo OOH? (c) Qu significa el cdigo 03H?
Preguntas
19-4.
19-5.
19-6.
19-7.
363
CAPTULO 20
Impresin
OBJETIVO
Describir los requisitos para imprimir por medio de las interrupciones del DOS y del BIOS.
INTRODUCCIN
Comparada con el manejo de la pantalla y de disco, la impresin parece ser un proceso relativamente sencillo. Slo se emplean unas cuantas operaciones, todas ellas por medio de la INT 21H
del DOS o por medio de la INT 17H del BIOS. Los comandos especiales para la impresora
incluyen Avance de pgina (FF), Avance de lnea (LF) y Retorno de carro (CR).
La impresora debe entender una seal enviada desde el procesador, por ejemplo, para saltar
a una pgina nueva, avanzar hacia abajo una lnea o tabular. El procesador tambin debe entender
una seal enviada desde una impresora que indica que est ocupada o sin papel. Desafortunadamente, muchos tipos de impresoras responden de manera diferente a seales enviadas desde un
procesador y una de las tareas ms difciles para los especialistas en software es realizar la
interfaz entre sus programas y tales impresoras.
Este captulo introduce las siguientes operaciones de interrupcin:
F U N C I O N E S DE LA INT 21H D E L DOS
40H
05H
364
Imprime caracteres
Imprime un carcter
F U N C I O N E S D E L A INT 17H D E L B I O S
OOH
01H
02H
Imprime un carcter
Inicializa puerto
Obtiene estado del puerto de la impresora
365
Hex
Funcin
09
10
12
09H
OAH
OCH
13
ODH
Funcin 40H
Manejador de archivo 04
Nmero de caracteres que se van a imprimir
Direccin del texto
Impresin
366
Captulo 20
'Industrial
Bicycle
MFRS',
MOV
AH,40H
;Peticin
MOV
BX, 04
,-Manejador
MOV
CX, 25
,-Enva
LEA
DX,HEADING
;Direccin
25
INT
21H
;Llama
al
de
ODH,
OAH
salida
04
para
la
impresora
caracteres
del
rea
de
impresin
DOS
Una operacin exitosa imprime el texto, pone en cero la bandera de acarreo y regresa el nmero
de caracteres impresos en el AX. Una operacin no vlida pone en uno la bandera de acarreo y
regresa en el AX el cdigo de error 05 (acceso denegado) o 06 (manejador no vlido). Un marcador de fin de archivo (Ctrl-Z o OAH) en los datos tambin provoca que la operacin termine.
of
Clancy
Employee
ames
Page
01
Alderson
Janet
Brown
David
Christie
El programa cuenta cada lnea impresa y, cerca de la parte inferior de la pgina, salta la forma al
inicio de la pgina siguiente. Los procedimientos principales son los siguientes:
D10INPT
E10PRNT
M10PAGE
P10OUT
TITLE
367
P20PRTNM (EXE)
.MODEL
SMALL
.STACK
64
NAMEPAR
MAXNLEN
NAMELEN
NAMEFLD
.DATA
LABEL
DB
DB
DB
HEADG
PAGECTR
DB
DB
FFEED
LFEED
LINECTR
PROMPT
DB
DB
DB
DB
OCH
OAH
01
'ame? '
.CODE
PROC
MOV
MOV
MOV
CALL
CALL
FAR
AX,@data
DS,AX
ES,AX
Q10CLR
MOPAGE
MOV
CALL
CALL
CALL
CMP
JE
CALL
JMP
DX,0000
Q2 0CURS
DIOINPT
Q10CLR
NAMELEN,00
A30
E10PRNT
A20LOOP
MOV
LEA
CALL
MOV
INT
ENDP
CX, 01
DX, FFEED
P10OUT
AX,4C00H
21H
BEGIN
BYTE
20
?
Avanza pgina
/Avanza lnea
/Inicializa
registros de
segmentos
/Limpia la p a n t a l l a
/Encabezado de pgina
A20LOOP:
/Coloca el cursor en 00,00
/Proporciona entrada de nombre
No se ingres un nombre?
no, salir
s, p r e p a r a r la impresin
A30 :
BEGIN
Fin del p r o c e s a m i e n t o :
un carcter
para avance de pgina.
salir al DOS
A c e p t a entrada de n o m b r e :
D3.0INPT
DIOINPT
PROC
MOV
MOV
MOV
LEA
INT
MOV
LEA
INT
RET
ENDP
NEAR
AH,40H
BX, 01
CX, 05
DX,PROMPT
21H
AH, OAH
DX, NAMEPAR
21H
Prepara para
E10PRNT
Peticin para
desplegar
5 caracteres
p e t i c i n de mensaje
Peticin de entrada
desde el teclado
imprimir:
PROC
CMP
JB
CALL
NEAR
LINECTR,6 0
E20
MO PAGE
Fin de pgina?
no, p a s a r
s, imprimir encabezado
MOV
MOV
LEA
CH, 00
CL, NAMELEN
DX,NAMEFLD
A s i g n a r nmero de caracteres
A s i g n a r direccin del nombre
E20 :
Figura 20-1
Impresin
368
E10PRNT
CALL
MOV
LEA
CALL
INC
RET
ENDP
P10OUT
CX, 01
DX,LFEED
P10OUT
LINECTR
Rutina
MI O P A G E
Captulo 201
Imprime
nombre
Avanza
una lnea
,-Incrementa
de
encabezado
de
en
uno
el
conteo
de
lnea
pgina:
PROC
CMP
JE
MOV
LEA
CALL
MOV
MOV
LEA
CX,3G
DX,HEADG
CALL
INC
CMP
JNE
MOV
INC
RET
ENDP
P10OUT
PAGECTR+1
P A G E C T R + 1 , 3AH
M50
PAGECTR+1,3 OH
PAGECTR
NEAR
lneas
M3 0 :
M50 :
MIOPAGE
Rutina
P10OUT
P10OUT
PROC
MOV
MOV
INT
RET
ENDP
de
Q10CLR
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
CX y DX d e s i g n a n e n t r a d a
Peticin de impresin
Manej ador
Q2 0CURS
PROC
MOV
MOV
INT
RET
ENDP
END ,
pantalla:
NEAR
Peticin para
Atributo
Desde 00,00
hasta 24,79
AX,0600H
BH,6OH
CX,0000
DX,184FH
10H
Coloca
Q2 0CURS
pginas
impresin:
NEAR
AH,40H
B X , 04
21H
Limpia
Q10CLR
de
el
cursor
NEAR
A H , 0:2H
BH, 0 0
10H
en
recorrer
rengln/columna
DX designa entrada
Peticin de colocar
Pgina nmero 0
el
cursor
BEGIN
Figura 20-1
(continuacin)
DB
'01'
369
que genera un nmero ASCII, 3031H. La rutina en M10PAGE incrementa en uno PAGECTR de
manera que se convierte en forma progresiva en 3032, 3033, etc. El nmero es vlido hasta 3039
y despus se convierte en 303A, que se imprimira como un cero y dos puntos. Si el byte de ms
a la derecha de PAGECTR contiene 3AH, la rutina lo cambia a 30H y le suma uno al byte de ms a
la izquierda, de modo que 303AH se convierte en 3130H, o 10 decimal.
Colocar una prueba para el final de la pgina antes (en lugar de despus) de imprimir un
nombre, asegura que la ltima pgina tiene al menos un nombre debajo del ttulo.
1
00000001
00000000
00001000
8
9
00001001
00001000
00010000
16
21
00010101
00010000
00011000
24
P10PRNT
R10READ
Los caracteres Retorno de carro, Avance de lnea y Avance de pgina deben funcionar en
todas las impresoras. Usted podra modificar el programa anterior para contar las lneas impresas
y forzar a un avance de pgina cuando se est cerca de la parte inferior de la pgina, en la lnea 60 o
algo as. (Algunos usuarios prefieren utilizar un programa editor para incrustar caracteres de Avance de pgina en sus archivos ASCII, en la posicin exacta en donde quieren el cambio de pgina,
Impresin
370
TITLE
P 2 0 P R T A S (EXE)
.MODEL
SMALL
. S T A C K 64
MAXLEN
NAMELEN
FILENAM
.DATA
LABEL
DB
DB
DB
COUNT
DISAREA
ENDCDE
FFEED
HANDLE
OPENMSG
PROMPT
SECTOR
DW
DB
DW
DB
DW
DB
DB
DB
PATHPAR
BEGIN
.CODE
PROC
MOV
MOV
MOV
CALL
CALL
Lee
imprime
BYTE
registros
de
disco
Lista de parmetros
entrada de
nombre de archivo
32
?
32 D U P (
para
' )
00
120 D U P (
rea de despliegue
Indicador de fin del
')
00
proceso
OCH
0
'*** o p e n e r r o r * * * '
'ame of f i l e ? '
512 DUP (
')
,-rea d e
1
e n t r a d a p a r a el
archivo
FAR
AX.Odata
DS, AX
ES, AX
Q10SCR
Q2 0CURS
Procedimiento principal
Inicializa
registros de
segmentos
Limpia la pantalla
Coloca el cursor
ENDCDE,00
C10PRMP
NAMELEN,00
A90
E10OPEN
ENDCDE,00
A80
R10READ
ENDCDE,00
A80
G10XFER
Inicializa
Peticin de nombre de archivo
Alguna peticin?
no, salir
Abre archivo, obtiene manejador
Apertura vlida?
no, p e d i r otra vez
Lee p r i m e r sector del disco
Fin del archivo, no hay datos?
s, p e d i r el siguiente
Imprime/lee
A10LOOP
AX,4C00H
21H
Repite
/Salir al DOS
AI0LOOP:
MOV
CALL
CMP
JE
CALL
CMP
JNE
CALL
CMP
JE
CALL
A80 :
A90 :
BEGIN
JMP
MOV
INT
ENDP
Peticin
!
C10PRMP
PROC
MOV
MOV
MOV
LEA
INT
MOV
LEA
INT
MOV
C90:
C10PRMP
MOV
MOV
RET
ENDP
lOOPEN
PROC
MOV
MOV
nombre
NEAR
AH,40H
BX, 0 1
CX, 13
DX, P R O M P T
21H
AH, OAH
DX,PATHPAR
21H
BL,NAMELEN
B H , 00
F I L E N A M [BX] , 0
Abre
del
archivo
NEAR
AH,3DH
A L , 00
Figura 20-2
de
,-Pide
archivo:
el
;Acepta
nombre
nombre
del
del
archivo
archivo
, I n s e r t a
;
c e r o al f i n a l del
;
nombre del archivo
en
disco:
,-Peticin p a r a
,-Slo l e c t u r a
abrir
Captulo 20
LEA
INT
JNC
CALL
JMP
DX, FILENAM
21H
E20
X10ERR
E90
371
E20:
E90 :
E10OPEN
G10XFER
MOV
HANDLE, AX
/Guarda el manejador
MOV
AX,2020H
MOV
CX,256
/Limpia el rea
LEA
DI,SECTOR
/ del sector
REP STOSW
RET
ENDP
Transfiere datos a la lnea de impresin:
PROC
CLD
LEA
NEAR
LEA
MOV
DI,DISAREA
COUNT,0 0
LEA
CMP
JNE
CALL
CMP
JE
LEA
DX.SECTOR+512
SI,DX
G4 0
Rl OREAD
ENDCDE,00
G80
SI,SECTOR
MOV
CMP
MOV
CALL
LEA
MOV
BX,COUNT
BX, 80
G50
[DI+BX],0D0AH
P10PRNT
DI, DISAREA
COUNT,00
LODSB
MOV
MOV
INC
CMP
JE
CMP
JNE
CALL
JMP
BX,COUNT
[DI+BX],AL
BX
AL, 1AH
G80
AL, OAH
G60
P10PRNT
G20
CMP
JNE
DEC
MOV
AND
ADD
/Carcter tabulador?
AL,09H
G70
/ s, reinicializa BX
BX
BYTE PTR [DI+BX] 20H /Limpia tabulador a blanco
/Limpia los 3 bits de la derecha
BX,0FFF8H
/ y suma 8
BX, 08
MOV
JMP
COUNT,BX
G30
MOV
MOV
CALL
RET
ENDP
BX,COUNT
BYTE PTR
P10PRNT
SI,SECTOR
G20:
G30 :
Fin del sector?
no, pasa
s, lee el siguiente
Fin del archivo?
s, salir
G40 :
JB
G50:
/ [SI] a AL, INC SI
/Carcter a lnea de
impresin
imprimir
GSO :
G70 :
G80 :
G90 :
G10XFER
Figura 20-2
(continuacin)
Impresin
372
Imprime
P10PRNT
PROC
MOV
MOV
MOV
INC
LEA
INT
P10PRNT
MOV
MOV
LEA
REP
RET
ENDP
RlOREAD
PROC
MOV
MOV
MOV
LEA
INT
RlOREAD
MOV
RET
ENDP
PROC
MOV
MOV
MOV
MOV
INT
RET
Q10SCR
Q20CURS
?10t>6
X10ERR
;Limpia
de
imprimir
lnea
de
despliegue
disco:
Peticin para
Dispositivo
Longitud
Bfer
la
leer
pantalla:
NEAR
AX,0S00H
BH,1EH
CX,0000
DX,184FH
10H
ENDP
PROC
MOV
MOV
MOV
INT
RET
ENDP
cursor:
NEAR
AH,02H
B H , 00
D X , 00
10H
Despliega
X10ERR
para
;Longitud
NEAR
AH,3FH
BX,HANDLE
CX,512
DX,SECTOR
21H
ENDCDE, AX
Coloca
Q2 0CURS
;Peticin
sector
Recorre
Q10SCR
linea:
NEAR
AH,40H
BX,04
CX,COUNT
CX
DX,DISAREA
21H
AX,2020H
CX,60
DI,DISAREA
STOSW
Lee
Captulo 20
PROC
MOV
MOV
MOV
LEA
INT
MOV
RET
ENDP
END
;Peticin para
;
c o l o c a r el c u r s o r
mensaje
NEAR
AH,40H
BX, 01
CX, 18
DX,OPENMSG
21H
ENDCDE, 01
de
error
de
disco:
Peticin para
Manej ador
Longitud
Mensaje
de
;Indicador
despliegue
error
de
error
BEGIN
Figura 20-2
(continuacin)
como al final de un procedimiento. El mtodo usual es mantener oprimida la tecla Alt y presionar
los nmeros del teclado numrico; por ejemplo, 012 para FF.)
Puede corregir el programa para la funcin 05H del DOS para enviar-cada carcter directamente a la impresora, eliminando la definicin y uso del rea de despliegue.
373
AH,05H
Peticin para
MOV
DL,
INT
21H
char
imprimir un carcter
Llama al DOS
Estas instrucciones son adecuadas para enviar un solo carcter a la impresora. Sin embargo, por lo
regular, la impresin implica una lnea de texto completa o parte de ella y requiere pasar por una
lnea formateada en el rea de datos.
El ejemplo siguiente ilustra la impresin de una lnea completa. Primero inicializa la direccin de HEADING en el registro SI y pone en el CX la longitud de HEADING. Despus, el ciclo
en P20 extrae cada carcter de forma sucesiva de HEADING y lo enva a la impresora. Ya que el
primer carcter en HEADING es un FF y los ltimos dos caracteres son LF, el encabezado se
imprime en la parte superior de una pgina nueva y es seguido por un espacio doble. El cdigo es
como sigue:
HEADING DB
MOV
CX, 2 7
rInicializa la longitud y
LEA
SI,HEADING
MOV
AH,05H
MOV
DL, [SI]
INT
21H
Llama al DOS
INC
SI
Siguiente
P20 :
Peticin para
imprimir
un carcter del
LOOP P2 0
encabezado
carcter del
encabezado
Repetir 27 veces
Si la impresora no est encendida, el DOS regresa el mensaje "No hay papel" de forma
repetida. Si enciende la impresora, el programa empieza a imprimir correctamente. Tambin
puede utilizar Ctrl+Break para cancelar la ejecucin de la operacin de imprimir.
HEX
08
11
15
08
0B
OF
ACCIN
Retroceso
Tabulador vertical
Activa modo condensado
Impresin
374
14
18
20
OE
12
14
Captulo 20
30
32
45
46
Fija el interlineado
Fija el interlineado
Activa el modo de
Desactiva el modo
OFH,
1BH,
30H,
'Ttulo
ODH,
OAH
A H , 0 5H
MOV
DL,OFH
Peticin
de
INT
21H
Llama
DOS
al
modo
condensado
Todos los caracteres subsecuentes se imprimen en modo condensado hasta que el programa enve
un comando que establezca otro modo.
Otros comandos no necesariamente funcionan en todos los modelos de impresoras. Verifique en su manual los comandos especficos de la impresora.
F U N C I O N E S D E L A I N T 17H D E L B I O S P A R A I M P R E S I N
La INT 17H proporciona facilidades para imprimir en el nivel del BIOS. Los puertos de impresin vlidos para la INT 17H son 0 (por omisin), 1 y 2, para L P T 1 , LPT2 y LPT3, respectivamente. La INT 17H proporciona tres funciones diferentes, como se especifica en el registro AH:
1. Primero emita la funcin 02H para determinar el estado de la impresora, va un nmero de
puerto seleccionado. Incluya esta prueba de estado antes de cada intento de imprimir. Si la
impresora est disponible, entonces:
2. Emita la funcin 01H para inicializar el puerto de impresin, y:
3. Emita las operaciones de la funcin OOH para enviar caracteres a la impresora.
Las operaciones regresan el estado de la impresora al AH, con uno o ms bits puestos en 1:
BIT
0
3
4
CAUSA
Se acab el tiempo
Error de entrada/salida
Seleccionada
5
6
7
375
No hay papel
Reconocimiento desde la impresora
No est ocupada
AH.0 0H
Peticin para
imprimir
MOV
AL, char
MOV
DX, 0 0
INT
17H
Llama al BIOS
AH,01H
MOV
DX,00
INT
17H
/Llama al BIOS
Ya que la operacin enva un carcter de Avance de pgina, puede usarla para fijar la impresora
en la posicin superior de la pgina, aunque algunas impresoras lo hacen de manera automtica
cuando se encienden. La operacin regresa un cdigo de estado en el AH.
INT 17H, funcin 02H: Obtiene el estado de la impresora
El objetivo de esta operacin es determinar el estado de la impresora:
MOV A H , 0 2 H
MOV DX,0 0
INT
/Llama al BIOS
17H
TESTAH,00101001B
/Est
JNZ
errormsg
preparada?
La operacin regresa el mismo estado del puerto de impresin que la funcin 01H. Cuando
el programa corre, si la impresora inicialmente est encendida el BIOS est habilitado para regre-
Impresin
376
Captulo 20
sar un mensaje de manera automtica (su programa se supone que prueba y acta de acuerdo con
el estado de la impresora). Si su programa no examina el estado, su nica indicacin es el cursor
intermitente. Si enciende la impresora en este punto, parte de la informacin de salida se pierde.
En consecuencia, antes de ejecutar cualquiera de las operaciones de impresin del BIOS, verifique el estado del puerto; si hay un error, muestra un mensaje. (Las operaciones del DOS realizan
de manera automtica esta verificacin, aunque su mensaje "No hay papel" se aplica a varias
condiciones.) Cuando la impresora es encendida, el mensaje ya no aparece e inicia la impresin de
forma normal sin prdida de informacin.
En cualquier momento, una impresora puede quedarse sin papel o ser apagada sin advertirlo. Si est escribiendo programas para que los usen otros, incluya una prueba del estado antes de
cada intento de imprimir.
PUNTOS CLAVE
Despus de que la impresin est terminada, utilice los comandos Avance de lnea o Avance
de pgina para limpiar el bfer de impresin.
La funcin 40H del DOS (la seleccin preferida) imprime cadenas de caracteres, mientras
que la funcin 05H del DOS y 17H de BIOS imprimen un solo carcter a la vez.
El DOS proporciona un mensaje si existe algn error en la impresora; el BIOS slo regresa
un cdigo de estado. Cuando utiliza la INT 17H del BIOS, verifique el estado de la impresora
antes de imprimir.
PREGUNTAS
20-1. Proporcione los caracteres de control de la impresora para (a) Tabulador horizontal; (b) Avance de
pgina; (c) Retroceso; (d) Retorno de carro.
20-2. Codifique un programa que utilice la funcin 40H del DOS para los requisitos siguientes: (a) Salte la
forma a la pgina siguiente; (b) imprima su nombre; (c) realice un Retorno de carro y un Avance de
lnea e imprima su ciudad y estado; (e) salte las formas.
20-3. Corrija la pregunta 20-2 para que utilice la funcin 05H del DOS.
20-4. Codifique una lnea de encabezado que establezca modo condensado, defina un ttulo (cualquier
nombre), proporcione operaciones de Regreso de carro y de Avance de pgina y desactive el modo
condensado.
20-5. La INT 17H del BIOS regresa un cdigo de error, (a) En dnde es regresado? (b) Qu significa el
cdigo 08H? (c) Qu significa el cdigo 90H?
20-6. Corrija la pregunta 20-2 para usar la INT 17H del BIOS. Incluya una prueba para revisar el estado de
la impresora.
20-7. Corrija la pregunta 20-2 de modo que el programa realice las partes (b), (c) y (d) cinco veces.
20-8. Corrija el programa de la figura 20-1 para ejecutar bajo la funcin 05H del DOS.
20-9. Corrija el programa de la figura 20-2, de modo que tambin muestre las lneas impresas.
CAPTULO 21
OBJETIVO
INTRODUCCIN
Este captulo describe el uso del ratn, el acceso a los puertos de la PC y la generacin de sonido
por medio de la bocina de la PC. Las instrucciones introducidas son:
La INT 33H para el manejo del ratn
IN y OUT para accesar los puertos
378
MOV
AX, funcin
...
INT
,-Peticin
para
/Parmetros
33H
/Llama
al
(si
el
Captulo 21
ratn
hay)
controlador
del
ratn
Observe que a diferencia de las operaciones que utilizan el registro AH, las funciones de la INT
33H son cargadas en el registro AX completo.
La primer instruccin del ratn que un programa emite es la funcin OOH, la cual simplemente inicializa el controlador del ratn para el programa. Habitualmente, usted necesita emitir
este comando una sola vez, al inicio del programa. La instruccin que sigue a la funcin OOH debe
ser la funcin 01H, que hace que el apuntador del ratn aparezca en la pantalla. Despus de eso,
tiene opcin de una amplia gama de operaciones con el ratn.
Algunas definiciones bsicas con el ratn
Mickey: Una unidad de medida del movimiento del ratn, aproximadamente 1/200 de una
pulgada.
Conteo de mickey: Nmero de mickey que el ratn rueda horizontal o verticalmente. El
conteo de mickey es utilizado por el controlador del ratn para mover el apuntador en la
pantalla un cierto nmero de pixeles.
Apuntador del ratn: En modo de texto, el apuntador es un cuadro intermitente, en video
inverso; en modo grfico, el apuntador es una punta de flecha.
Pixel: El elemento de la pantalla ms pequeo que se puede direccionar. Por ejemplo, para
modo de texto 03 hay ocho pixeles por byte.
Umbral de velocidad: La velocidad en mickey por segundo que el ratn debe moverse para
duplicar la velocidad del apuntador en la pantalla. Por omisin es de 64 mickey por segundo.
Inicializa el ratn
Muestra el apuntador del ratn
Oculta el apuntador del ratn
Obtiene el estado del botn y la posicin del apuntador
Establece posicin del apuntador
Obtiene informacin del botn presionado del ratn
Obtiene informacin acerca de la liberacin del botn
Fija lmites horizontales para el apuntador
Fija lmites verticales para el apuntador
Establece el tipo de apuntador grfico
Establece el tipo de apuntador en texto
Lee los contadores de movimiento del ratn
Instala el manejador de interrupciones para eventos del ratn
Activa la emulacin de una pluma ptica
Desactiva la emulacin de una pluma ptica
OFH
10H
13H
14H
15H
16H
17H
18H
19H
1AH
1BH
1CH
1DH
1EH
1FH
20H
21H
22H
23H
24H
379
380
Captulo 21
381
MOV
AX, 04H
MOV
CX,horizon-loch /Posicin
horizontal
MOV
DX, v e r t l - l o c h
/Posicin
vertical
INT
3 3H
/Llama al
La operacin coloca el apuntador en la nueva posicin, ajusfando como sea necesario si est fuera
de los lmites mnimo y mximo.
Cdigo ilustrativo
El cdigo siguiente ejemplifica el uso de las instrucciones del ratn estudiadas hasta este momento:
MOV
AX,OOH
INT
33H
CMP
AX,00H
/Ratn
JE
exit
/ no, salir
MOV
AX,01H
apuntador
INT
33H
ratn
MOV
AX,04H
apuntador
MOV
CX,24
/Posicin
horizontal
MOV
DX,16
/Posicin
vertical
INT
33H
/Llama al
disponible?
MOV AX,02H
INT
/Llama al
33H
ratn
apuntador
AX.05H
MOV
BX,button-no
Nmero de botn
INT
33H
Llama al
La operacin regresa el estado arriba abajo de todos los botones y el conteo de presiones y
posicin de botn requerido:
AX = Estado de los botones de acuerdo con la posicin del bit, como sigue:
Bit 0, botn izquierdo, donde 0 = arriba, 1 = abajo
Bit 1, botn derecho, donde 0 = arriba, 1 = abajo
Captulo 21
AX.06H
;Peticin
MOV
BX,button-no
/Nmero
INT
33H
,-Llama
de
de
al
informacin
liberacin
del
botn
botn
controlador
del
ratn
La operacin regresa el estado arriba abajo de todos los botones y el conteo de liberaciones y
posicin del botn requerido, como sigue:
AX = Estado de los botones de acuerdo con la posicin del bit, como sigue:
Bit 0, botn izquierdo, donde 0 = arriba, 1 = abajo
Bit 1, botn derecho, donde 0 = arriba, 1 = abajo
Bit 2, botn central, donde 0 = arriba, 1 = abajo
Bits 3-15 reservados
BX = Contador de liberaciones del botn
CX = Coordenada horizontal (x) de la ltima presin del botn
DX = Coordenada vertical (y) de la ltima presin del botn
La operacin restablece en cero el contador de liberaciones del botn.
Funcin 07H: Fija los lmites horizontales para el apuntador
Esta operacin fija los lmites horizontales mnimo y mximo para el apuntador:
MOV
AX,07H
/Peticin
MOV
CX,min-loch
/Lmite
inferior
MOV
DX,max-loch
/Lmite
superior
INT
3 3H
/Llama
al
para
fijar
controlador
lmite
del
horizontal
ratn
Si el nmero mnimo es mayor que el mximo, la operacin intercambia los nmeros. Tambin la
operacin mueve el apuntador al rea nueva, si es necesario. Vase tambin las funciones 08H y
10H.
383
AX,0 8H
MOV
CX,min-loch
,-Lmite inferior
MOV
DX,max-loch
, Lmite superior
INT
33H
Si el nmero mnimo es mayor que el mximo, la operacin intercambia los nmeros. Tambin la
operacin mueve el apuntador al rea nueva, si es necesario. Vase tambin las funciones 07H y
10H.
Funcin OBH: Lee contadores de movimiento del ratn
Esta operacin regresa el conteo de mickeys horizontales y verticales, desde la ltima llamada a la
funcin (dentro del intervalo - 3 2 , 7 6 8 a +32,767). Los nmeros regresados son:
CX = Conteo horizontal (un nmero positivo significa recorrido a la derecha, negativo
significa a la izquierda)
DX = Conteo vertical (un nmero positivo significa recorrido hacia abajo, negativo hacia
arriba)
Funcin OCH: Instala manejador de interrupciones para eventos del ratn
Su programa puede necesitar determinar de manera automtica cundo ha ocurrido alguna actividad (o evento) con el ratn. El objetivo de la funcin OCH es proporcionar un manejador de
eventos, por eso el software del ratn interrumpe su programa y llama al manejador de eventos, el
cual realiza la funcin que requiere y, cuando termina la tarea, regresa a su programa en el punto
de ejecucin.
Cargue el CX con una mscara del evento para indicar las acciones para las cuales el manejador
debe responder y el ES:DX con la direccin segmento:desplazamiento de la rutina para manejar la
interrupcin:
MOV
AX,0CH
Peticin de manejador de
LEA
CX,mask
LEA
DX,handler
INT
33H
se
se
se
se
se
se
interrupcin
(ES:DX)
384
Captulo 21
AX,10H
;Peticin
MOV
CX,upleft- X
;Coordenada
de
la
esquina
superior izquierda
MOV
DX,upleft- y
,-Coordenada
de
la
esquina
superior izquierda
MOV
SI,lowrgt- X
,-Coordenada
de
la
esquina
inferior derecha
MOV
DI,lowrgt- y
,-Coordenada
de
la
esquina
inferior derecha
INT
33H
;Llama
al
para
fijar
el
controlador
rea
del
de
exclusin
ratn
Para reemplazar el rea de exclusin, llame otra vez a la funcin con parmetros diferentes o
vuelva a emitir la funcin OOH o 01H.
Funcin 13H: Establece el umbral de velocidad doble
Esta operacin establece el umbral de velocidad en la que el movimiento del apuntador en la
pantalla es duplicada. Cargue el DX con el nuevo valor (por omisin es 64 mickeys por segundo).
(Vase tambin la funcin 1AH.)
Funcin 1AH: Establece la sensibilidad del ratn
La sensibilidad concierne al nmero de mickeys que el ratn necesita moverse antes que el apuntador se mueva. La funcin 1AH fija el movimiento horizontal y vertical del ratn en trminos
del nmero de mickeys por 8 pixeles, as como el umbral de velocidad en la que el movimiento del
apuntador en la pantalla es duplicado (vase tambin las funciones OFH, 13H y 1BH):
385
MOV
AX, 1AH
MOV
BX,horzon
,-Mickeys horizontales
MOV
CX,vertic
,-Mickeys verticales
MOV
DX,threshold
/Umbral de velocidad
INT
33H
;Llama al
ratn
(por omisin = 8)
D10PTR
386
TITLE
XBINARY
YBINARY
ASCVAL
P 2 1 M O U S E (EXE)
.MODEL SMALL
.STACK 64
.DATA
DW i
0
DW
0
DW
?
;
DISPDATA
XMSG
XASCII
YMSG
YASCII
BEGIN
LABEL
DB
DW
DB
DB
DW
Campos
BYTE
'X = '
Manejo
ratn
Coordenada X
Coordenada Y
Campo ASCII
de
despliegue
?
i
del
Captulo 21
en
binaria
binaria
pantalla:
Mensaje X
Valor ASCII
de
Mensaje Y
Valor ASCII
de
'Y =
.CODE
PROC
MOV
MOV
CALL
CALL
CMP
JE
FAR
AX,@data
DS,AX
Q10CLEAR
B10INIT
AX, 00
A90
CALL
CMP
JE
CALL
MOV
CALL
MOV
MOV
MOV
CALL
MOV
MOV
CALL
JMP
D10PTR
BX, 01
A80
Q2 0CURS
AX,XBINARY
G10CONV
AX,ASCVAL
XASCII,AX
AX,YBINARY
G10CONV
AX, A S C V A L
YASCII,AX
Q30DISP
A10
CALL
H10HIDE
Ocultar
CALL
MOV
INT
ENDP
Q10CLEAR
AX,4C00H
21H
Limpiar pantalla
Salir al DOS
PROC
MOV
INT
CMP
JE
MOV
INT
NEAR
AX,OOH
33H
A X , 00
B90
AX,01H
33H
Inicializa
el registro DS
Limpia la pantalla
Inicializa el ratn
Ratn instalado?
no, salir
A10 :
ASCII
ASCII
Desplegar
Repetir
valores
de
ratn
A80 :
apuntador
del
ratn
A90 :
BEGIN
B10INIT
,-Inicializar
ratn
/Ratn instalado?
/
no, salir
/Mostrar apuntador
B90 :
B10INIT
.286
D10PTR
D20:
RET
ENDP
PROC
MOV
INT
CMP
JE
SHR
/Regresar
NEAR
AX,03H
33H
BX, 01
D90
CX, 03
/Obtener
donde
fue
llamado
posicin
del
apuntad
Figura 21-1
387
SHR
CMP
JNE
CMP
JE
DX, 03
CX,XBINARY
D3 0
DX,YBINARY
D20
MOV
MOV
XBINARY,CX
YBINARY,DX
D30 :
entre 8
Ha cambiado la p o s i c i n
del apuntador?
no, repetir la operacin
s,
guardar la nueva posicin
D90 :
DIOPTR
GIOCONV
RET
ENDP
Regresar a donde
fue
llamado
PROC
MOV
MOV
LEA
CMP
JB
DIV
OR
MOV
DEC
NEAR
ASCVAL, 202 OH
CX, 10
SI.ASCVAL+l
AX, CX
G3 0
CL
AH,3 OH
[SI] , AH
SI
AX = X o Y binario
Limpia el campo A S C I I
Fija el factor de divisin
Carga la direccin de ASCVAL
Compara la posicin con 10
menor, pasar
mayor, dividir entre 10
Insertar 3 ASCII
A l m a c e n a r en el byte de la derecha
Disminuir direccin de ASCVAL
OR
MOV
RET
ENDP
PROC
MOV
INT
RET
ENDP
AL,30H
[SI] , A L
Insertar 3 ASCII
Almacenar en el byte ms a la izqu
Regresar a donde fue llamado
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
NEAR
AX,0600H
BH,30H
CX, 00
DX,184FH
10H
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
NEAR
AH,02H
BH, 0
DH, 0
DL, 25
10H
PROC
MOV
MOV
MOV
LEA
INT
RET
ENDP
END
NEAR
AH,40H
BX, 01
CX, 14
DX,DISPDATA
21H
G30:
GIOCONV
HIOHIDE
HIOHIDE
QIOCLEAR
QIOCLEAR
Q2 0CURS
Q20CURS
Q30DISP
Q30DISP
NEAR
AX,02H
33H
, Ocultar apuntador
Regresar a donde
;Peticin para
;Colores
;Pantalla
; completa
fue llamado
limpiar la pantalla
;Colocar el
,- Pgina 0
,-Rengln
, Columna
llamado
cursor
BEGIN
Figura 21-1
(continuacin)
llamado
386
G10CONV
Q30DISP
Captulo 21
Una manera de mejorar este programa es emitir la funcin OCH para establecer un manejador
de interrupcin. De esta manera, las instrucciones necesarias son llamadas automticamente,
siempre que el ratn est activo.
PUERTOS
Un puerto es un dispositivo que conecta a un procesador con el mundo exterior. Por medio de un
puerto, el procesador recibe una seal desde un dispositivo de entrada y enva una seal a un dispositivo de salida. Los puertos son identificados por sus direcciones en el intervalo de OH3FFH, o
1,024 puertos en total. Note que no son direcciones convencionales de memoria. Puede usar las
instrucciones IN y OUT para manejar E/S directamente a nivel de puerto:
IN transfiere informacin desde un puerto de entrada al AL si es un byte y al AX si es una
palabra. El formato general es
IN
reg-acum,puerto
OUT
puerto,reg-acum
IN AL,port#
/Entrada
Output
OUT
,-Salida
port#,AX
de
de
un
una
byte
pe-labra
DX.60H
;Puerto
IN
AL,DX
;Obtiene
60H
un
(teclado)
byte
389
020H-023H
040H-043H
Temporizador/contador
060H
061H
Bocina (bits 0 y 1)
200H-20FH
Controlador de juego
278H-27FH
2F8H-2FFH
378H-37FH
3B0H-3BBH
EGA/VGA
Controlador de disco
3F8H-3FFH
Puerto serial C O M
Aunque la prctica recomendada es utilizar las interrupciones del DOS y del BIOS, puede
con seguridad pasar por alto el BIOS cuando accese los puertos 21H, 40-42H, 60H, 61H y 201H.
Por ejemplo, al arranque una rutina en ROM del BIOS busca el sistema por las direcciones de los
adaptadores de puertos paralelos y seriales. Si la direccin del puerto serial es encontrada, el
BIOS la coloca en su rea de datos, empezando en la localidad de memoria 40:00H; si las direcciones de los puertos paralelos son encontradas, el BIOS las coloca en su rea de datos, empezando en la localidad 40:08H. Cada localidad tiene espacio para entradas de una palabra. La tabla del
BIOS para un sistema con dos puertos seriales y dos puertos paralelos podra verse as:
40 00
F803
COM
40 02
F802
COM2
40 04
0000
no usada
40 06
0000
no usada
40 08
7803
LPT1
40 0A
7802
LPT2
40 OC
0000
no usada
40 0E
0000
no usada
Para utilizar la INT 17H del BIOS para imprimir un carcter, inserte el nmero del puerto
de la impresora en el registro DX:
MOV
AH.0 0H
Peticin para
imprimir
MOV
AL,char
MOV
DX,0
INT
17H
Llama al BIOS
390
TITLE
BIOSDAT
PARLPRT
BIOSDAT
CODESG
Capitulo 21
P 2 1 P O R T (COM)
I n t e r c a m b i a los p u e r t o s de i m p r e s i n LPT1 y 2
SEGMENT AT 40H
rea de datos del BIOS
ORG
8H
Direcciones de los puertos de impresin
DW
4 DUP(?)
4.palabras
ENDS
SEGMENT
ASSUME
ORG
PARA 'code'
DS:BIOSDAT,CS:CODESG
100H
MOV
MOV
AX, BIOSDAT
DS,AX
MOV
MOV
MOV
MOV
MOV
INT
ENDS
END
AX,PARLPRT(0)
BX,PARLPRT(2)
PARLPRT(0),BX
PARLPRT(2),AX
AX,4C00H
21H
BEGIN:
CODESG
Direccin de LPT1 al AX
Direccin del LPT2 al BX
Intercambia
direcciones
Intercambia
direcciones
Salir al DOS
BEGIN
Figura 21-2
Algunos programas permiten imprimir slo por medio de L P T 1 . Si tiene dos impresoras
conectadas, como LPT1 y LPT2, podra usar el programa de la figura 21-2 para invertir (conmutar) sus direcciones en la tabla del BIOS.
GENERACIN DE SONIDOS
La PC genera sonido por medio de una bocina integrada de imn permanente. Puede seleccionar
una de dos formas para controlar la bocina o combinar ambas: (1) Utilice el bit 1 del puerto 61H
para activar el circuito de Interfaz Programable de Perifrico (PPI) Intel 8255A-5, o (2) emplee la
compuerta del Temporizador Programable de Intervalo (PIT) Intel 8353-5. El reloj genera una
seal de 1.19318 Mhz. El PPI controla la compuerta 2 en el bit 0 del puerto 61H.
El programa de la figura 21-3 genera una serie de notas de frecuencia ascendente. DURTION
proporciona la duracin de cada nota y TONE determina la frecuencia. Al inicio el programa
accesa el puerto 61H y guarda el nmero que la operacin enva. Una instruccin CLI limpia la
bandera de interrupcin para permitir un tono constante. El temporizador de intervalo genera un
pulso de reloj de 18.2 pulsos por segundo que (a menos que usted codifique CLI) interrumpe la
ejecucin de su programa y hace que el tono oscile.
El contenido de TONE determina su frecuencia; nmeros grandes provocan frecuencias
bajas y nmeros pequeos causan frecuencias altas. Despus que la rutina B10SPKR toca cada
nota, aumenta la frecuencia en TONE por medio de un corrimiento a la derecha de un bit (forma eficaz
de dividir el nmero entre dos). Ya que TONE disminuye en este ejemplo se reduce la duracin de
lo que toca, tambin la rutina aumenta DURTION por medio de un corrimiento a la izquierda
(forma eficaz de duplicar su nmero).
El programa termina cuando TONE es reducido a cero. Las cifras iniciales en DURTION y
TONE no tienen significado tcnico. Puede experimentar con otros nmeros y tratar de ejecutar el
programa sin la instruccin CLI.
Puntos clave
391
TITLE
S0UNSG
BEGIN:
P21S0UND (COM)
Produce sonido desde la bocina
SEGMENT PARA 'Code'
ASSUME
CS : SOUNSG, DS : SOUNSG, SS : SOUNSG
ORG
100H
JMP
SHORT MAIN
DURTI0N DW
TONE
DW
1000
256H
MAIN
NEAR
AL,61H
AX
MAIN
PROC
IN
PUSH
CLI
CALL
POP
OUT
STI
RET
ENDP
B10SPKR PROC
B20 :
MOV
B30:
AND
OUT
MOV
B40 :
LOOP
OR
OUT
MOV
B50 :
LOOP
DEC
JNZ
SHL
SHR
JNZ
RET
B10SPKR ENDP
SOUNSG
ENDS
END
B10SPKR
AX
61H.AL
NEAR
DX,DURTION
AL,11111100B
61H,AL
CX,TONE
B4 0
AL,00000010B
61H,AL
CX,TONE
B50
DX
B30
DURTION,1
TONE,1
B20
;Duracin del
;Frecuencia
tono
sonido
BEGIN
Figura 21-3
Generacin de sonido
Podra usar cualquier variacin lgica para tocar una secuencia de notas, a fin de, por
ejemplo, llamar la atencin del usuario. Podra tambin corregir el programa segn la pregunta
21-7.
PUNTOS CLAVE
En modo de texto, el apuntador del ratn es un cuadro intermitente, en video inverso; en
modo grfico, el apuntador es una punta de flecha.
Las operaciones del ratn utilizan la INT 33H, con un cdigo de funcin en el AX.
La primera operacin de ratn a ejecutar es la funcin OOH, que inicializa el controlador del
ratn.
La funcin 01H es necesaria para mostrar el apuntador del ratn, 03H obtiene el estado del
botn y 04H obtiene la posicin del apuntador.
392
Captulo 21
Por medio de un puerto, un procesador recibe una seal desde un dispositivo de entrada y
enva una seal a un dispositivo de salida. Los puertos son definidos por su direccin, en el
intervalo 0H-3FFH, o 1,024 en total.
La PC genera sonido por medio de una bocina de imn permanente. Puede seleccionar una
de dos formas para manejar la bocina o combinar ambas.
PREGUNTAS
21-1. Explique estos trminos: (a) mickey; (b) contador del mickey; (c) apuntador del ratn.
21-2. Proporcione la funcin de la INT 33H para cada una de la operaciones siguientes del ratn:
( a ) Leer el.contador de movimiento del ratn
(b) Obtener la informacin acerca de la presin del botn
(c) Ocultar el apuntador del ratn
(d) Establecer la posicin del apuntador
(e) Obtener informacin acerca de la liberacin del botn
(f) Instalar un manejador de interrupciones para eventos del ratn
21-3. Cul es el objetivo de la bandera del apuntador del ratn?
21-4. Codifique las instrucciones para los siguientes requisitos:
( a ) Inicializar el ratn
(b) Mostrar el apuntador del ratn
(c) Obtener informacin del ratn
(d) Colocar el apuntador del ratn al rengln central, en el extremo derecho
(e) Obtener la sensibilidad del ratn
(f) Obtener el estado del botn y la posicin del apuntador
(g) Ocultar el apuntador del ratn
21-5. Combinar los requisitos de la pregunta 21-4 en un programa completo. Puede ejecutar el programa
bajo DEBUG, aunque a veces DEBUG puede recorrer el apuntador fuera de la pantalla.
21-6. Remtase a la figura 21-2 y codifique las instrucciones para invertir las direcciones de COM y
COM2.
21-7. Corrija el programa de la figura 21-3 para las situaciones siguientes: Generar notas que disminuyan
en frecuencia; inicializar TONE en 01 y DURTION en un nmero grande. En cada ciclo, incrementar
el nmero en TONE, disminuir el nmero en DURTION y terminar el programa cuando DURTION
sea igual a cero.
CAPTULO 22
Escritura de macros
OBJETIVO
INTRODUCCIN
Para cada instruccin simblica que usted codifica, el ensamblador genera una instruccin de
lenguaje de mquina. Pero para cada enunciado codificado en un lenguaje de alto nivel, como C o
Pascal, el compilador genera muchas instrucciones de lenguaje de mquina. A este respecto,
puede pensar en un lenguaje de alto nivel como consistente de macro enunciados.
El ensamblador tiene facilidades que el programador puede usar para definir macros. Usted
define un nombre especfico para la macro, junto con el conjunto de instrucciones en lenguaje
ensamblador que la macro va a generar. Despus, siempre que necesite codificar el conjunto de
instrucciones, slo codifique el nombre de la macro y el ensamblador genera de manera automtica las instrucciones que usted defini.
Las macros son tiles para los siguientes propsitos:
Simplificar y reducir la cantidad de codificacin repetitiva.
Reducir errores causados por la codificacin repetitiva.
Linealizar un programa en lenguaje ensamblador para hacerlo ms legible.
393
Escritura de macros
394
Captulo 22
Ejemplos de funciones que pueden ser implementadas por macros son operaciones de entrada/salida que cargan registros y realizan interrupciones, conversiones de informacin ASCII y
binaria, aritmtica de palabras mltiples, rutinas para el manejo de cadenas de caracteres y divisin por sustraccin.
MACRO
MOV
Define
AX,@data
macro
Cuerpo
de
MOV
DS, AX
la
definicin
MOV
ES, AX
de
la
ENDM
Fin
de
la
macro
macro
El nombre de esta macro es INITZ, aunque es aceptable cualquier otro nombre vlido que sea
nico. La directiva MACRO en la primer lnea le indica al ensamblador que las instrucciones que
siguen, hasta ENDM ("fin de la macro"), son parte de la definicin de la macro. La directiva
ENDM termina la definicin de la macro. Las instrucciones entre MACRO y ENDM comprenden
el cuerpo de la definicin de la macro.
Los nombres a que se hace referencia en la definicin de la macro, datos, AX, DS y ES,
deben estar definidos en alguna parte del programa o deben ser dados a conocer de alguna otra
forma al ensamblador. En forma subsecuente se puede usar la macroinstruccin INITZ en el
segmento de cdigo en donde quiera inicializar los registros. Cuando el ensamblador encuentra la
macroinstruccin INITZ, busca en una tabla de instrucciones simblicas y, a falta de una entrada,
busca macroinstrucciones. Ya que el programa contiene una definicin de la macro INITZ, el
ensamblador sustituye el cuerpo de la definicin generando las instrucciones: la expansin de la
macro. Un programa usara la macroinstruccin INITZ slo una vez, aunque otras macros estn
diseadas para ser utilizadas cualquier nmero de veces y cada vez el ensamblador genera la
misma expansin de la macro.
La figura 22-1 proporciona un listado del programa ensamblador. Esta versin particular del
ensamblador lista la expansin de la macro con el nmero 1 a la izquierda de cada instruccin para
indicar que una macroinstruccin la gener. Una expansin de macro slo indica instrucciones
para las cuales el cdigo objeto es generado, de modo que directivas como ASSUME o PAGE no
aparecern.
Es difcil y molesto definir una macro para usar slo una vez, pero podra catalogar esa
macro en una biblioteca para usarla con todos los programas. Una seccin posterior explica cmo
catalogar macros en una biblioteca y cmo incluirlas de forma automtica en cualquier programa.
395
page 60,132
P22MACR1 (EXE)
TITLE
INITZ
MOV
MOV
MOV
ENDM
MACRO
AX,@data
DS,AX
ES,AX
;Define macro
/Termina macro
.MODEL SMALL
.STACK 64
0000 54 65
66 20
6F 20
72 75
6E 0D
73
6D
69
63
0A
74
61
6E
74
24
20
63
73
69
6F
72
74
6F
0000
0000
0003
0005
0007
0009
000D
OOOF
0012
0014
MESSGE
-- R
1
1
1
D8
C0
09
16 0000 R
21
4C0O
21
.CODE
PROC
INITZ
MOV
MOV
MOV
MOV
LEA
INT
MOV
INT
ENDP
END
BEGIN
B8
8E
8E
B4
8D
CD
B8
CD
.DATA
DB
BEGIN
FAR
/Macroinstruccin
AX,@data
DS,AX
ES,AX
AH,09H
DX,MESSGE
21H
AX,4C00H
21H
,-Peticin para
/Mensaje
desplegar
/Salir al DOS
BEGIN
Macros:
a m e
Lines
3
INITZ
Segments and Groups:
a m e
DGROUP
_DATA
STACK
TEXT
Length
GROUP
.
001C
0040
0014
Align
Combine
WORD
PARA
WORD
PUBLIC
STACK
PUBLIC
Class
'DATA'
' STACK'
'CODE
Symbols:
a m e
Type
F PROC
L BYTE
TEXT
TEXT
BEGIN
MESSGE
OCODE . .
SFI LEAME
Figura 22-1
Valu
Attr
0000
_TEXT
0000
DATA
_TEXT
p22macrl
Length = 0014
DOS para desplegar cualquier mensaje. Cuando se usa la macroinstruccin, el programador tiene
que proporcionar el nombre del mensaje, el cual hace referencia a un rea de datos terminada por un
signo de dlar.
PROMPT
MACRO MESSGE
MOV
AH,0
mudo
9H
LEA
DX,MESSGE
INT
21H
ENDM
/Argumento
/Fin de la macro
Escritura de macros
396
Capitulo 22
Un argumento mudo en una definicin de macro indica al ensamblador que haga coincidir su nombre con cualquier aparicin del mismo nombre en el cuerpo de la macro. Por ejemplo, el argumento mudo MESSGE tambin aparece en la instruccin LEA.
Cuando utiliza la macroinstruccin PROMPT, usted proporciona un parmetro como el
nombre real del mensaje que ser desplegado, por ejemplo,
PROMPT
MESSAGE2
En este caso, MESSAGE2 tiene que estar apropiadamente definido en el segmento de datos. El
parmetro en la macroinstruccin corresponde al argumento mudo en la definicin original de la
macro:
Definicin de macro:
PROMPT
MACRO
MESSGE
(argumento)
I
Macroinstruccin:
PROMPT
MESSAGE2
(parmetro)
COMENTARIOS
Puede codificar comentarios en una definicin de macro para clarificar su objetivo. Una directiva
C O M M E N T o un punto y coma indican una lnea de comentario. El ejemplo siguiente utiliza un
punto y coma para indicar un comentario:
PROMPT
MACRO
MESSGE
E s t a macro p e r m i t e
MOV
AH,09H
LEA
DX,MESSGE
INT
desplegar comentarios
21H
ENDM
Puesto que la omisin es listar slo las instrucciones que generan cdigo objeto, el ensamblador
no despliega de forma automtica un comentario cuando expande una definicin de macro. Si
usted quiere que un comentario aparezca dentro de una expansin, utilice la directiva de listado
.LALL ("list all, listar todo", incluyendo el punto inicial) antes de solicitar la macroinstruccin:
Comentarios
397
page
60,132
P22MACR2 (EXE)
TITLE
INITZ
MACRO
MOV
MOV
MOV
ENDM
PROMPT
MACRO
MOV
LEA
INT
ENDM
Uso de parmetros
;Define macro
AX,@data
DS, AX
ES, AX
;Termina macro
;Define macro
MESSGE
AH,09H
DX,MESSGE
21H
;Termina macro
.MODEL SMALL
. STACK 64
0000 43
65
65
OOOF 43
65
72
75
72
3F
75
72
65
73
20
24
73
20
73
74 6F 6D
6E 61 6D
MESSG1
.DATA
DB
74 6F 6D
61 64 64
73 3F 24
MESSG2
DB
0000
BEGIN
0000 B8
0003 8E D8
0005 8E CO
1
1
1
PROMPT
0007
0009
000D
OOOF
0012
0014
B4
8D
CD
B8
CD
09
16 OOOF R
21
4C00
21
1
1
1
BEGIN
Figura 22-2
.CODE
PROC
INITZ
MOV
MOV
MOV
MESSG2
MOV
LEA
INT
MOV
INT
ENDP
END
Customer a m e ?
FAR
AX,data
DS,AX
ES,AX
AH,09H
DX.MESSG2
21H
AX,4C00H
21H
;Sale al DOS
BEGIN
.LALL
PROMPT
MESSAGE1
Una definicin de macro puede tener varios comentarios, algunos de los cuales puede necesitar
listar y algunos otros suprimir. Aun se utiliza .LALL para listarlo, pero debe cidificar dos punto
y coma seguidos (;;) antes de los comentarios que siempre sern suprimidos. (Por omisin, el
ensamblador tiene .XALL, que causa un listado slo de las instrucciones que generan cdigo
objeto.) Por otra parte, puede no querer listar el cdigo fuente de una expansin de macro, en
especial si la macroinstruccin es usada varias veces en un programa. En ese caso, codifique la
directiva de listado .SALL ("suprimir todo"), que reduce el tamao del programa impreso, aunque no tiene efecto sobre el tamao del mdulo objeto generado.
Una directiva de listado mantiene su efecto a lo largo del programa hasta que encuentre otra.
Puede colocarlas en un programa para hacer que cifras macros listen slo el cdigo objeto
generado (.XALL), otras listen el cdigo objeto y los comentarios (.LALL) y algunas ms supriman del listado tanto comentarios como cdigo objeto (.SALL).
Escritura de macros
398
TITLE
INITZ
page
60,132
P 2 2 M A C R 3 (EXE)
MACRO
MOV
MOV
MOV
75
72
3F
75
72
65
24
73
20
OD
73
20
73
74
6E
OA
74
61
73
6F
61
24
6F
64
3F
;Define
09
16 0 0 1 1
21
4C00
21
macro
;Termina
macro
'Customer
ame?',
address?',
.DATA
DB
6D
64
OD
MESSG2
DB
1
1
BEGIN
Figura 22-3
MESSGE
.MODEL
.STACK
MESSG1
1
R
.SALL
;
;;
BEGIN
B4
8D
CD
B8
CD
MACRO
1
OOOF
0011
0015
0017
001A
001C
.LALL
PROMPT
6D
6D
0000
de
AX,@data
DS,AX
ES, AX
ENDM
43
65
65
43
65
72
OA
Uso
Captulo 22
Customer
13,
10,
13,
.CODE
PROC
FAR
.SALL
INITZ
PROMPT MESSG1
.LALL
PROMPT MESSG2
Esta macro despliega cualquier
MOV
LEA
INT
MOV
INT
ENDP
END
AH,09H
DX,MESSG2
21H
AX,4C00H
21H
;Peticin
;Sale
al
'$
10,
mensa
para
DOS
BEGIN
El programa de la figura 22-3 ilustra las caractersticas anteriores. Define las dos macros,
INITZ y PROMPT, ya descritas. El segmento de cdigo contiene la directiva de listado .SALL para
suprimir la expansin de INITZ y la primer expansin de PROMPT. Para el segundo uso de
PROMPT, la directiva de listado .LALL hace que el ensamblador liste el comentario y la expansin de la macro. Pero observe que en la definicin de la macro para PROMPT el comentario en
la expansin de la macro que tiene un doble punto y coma (;;) no es listado.
MASM 6.0 introdujo los trminos .LISTMACROALL, .LISTMACRO y .NOLISTMACRO
para .LALL, .XALL y .SALL, respectivamente.
U S O D E UNA M A C R O D E N T R O D E UNA D E F I N I C I N D E M A C R O
Una definicin de macro puede tener una referencia a otra macro definida. "Considere una macro
sencilla llamada DOS21 que carga una funcin en el registro AH y emite la INT 21H:
La directiva local
399
DOS21
MACRO
DOSFUNC
MOV
AH,DOSFUNC
INT
21H
ENDM
Usar esta macro DOS21 para aceptar entrada desde el teclado, codifique
LEA
DX,NAMEPAR
DOS21
OAH
El cdigo generado por DOS21 cargara la funcin OAH en el AH y emitira la INT 21H para
entrada desde el teclado. Ahora suponga que tiene otra macro, llamada DISP, que carga la funcin
02H de la INT 21H en el registro AH para desplegar un carcter:
DISP
MACRO
CHAR
MOV
AH,02H
MOV
DL, CHAR
INT
21H
ENDM
Por ejemplo, para desplegar un signo de interrogacin codifique la macro como DISP ' ? '
Podra cambiar DISP para aprovechar la macro DOS21H para hacer referencia a DOS21 dentro de
la definicin de DISP:
DISP
MACRO
CHAR
MOV
DL, CHAR
DOS21
02H
ENDM
Ahora, si usted codifica la macro DISP como DISP ' ? ' , el ensamblador genera
MOV
DL,'?'
MOV
AH,02H
INT
21H
LA DIRECTIVA LOCAL
Algunas macros necesitan que se definan elementos de datos y etiquetas de instrucciones dentro de
la definicin de la macro. Si utiliza la macro ms de una vez en el mismo programa y el ensamblador define los elementos de datos para cada aparicin, los nombres duplicados haran que el
ensamblador genere un mensaje de error. Para asegurar que cada nombre generado es nico,
codifique la directiva LOCAL inmediatamente despus de la instruccin M A C R O , aun antes de
los comentarios. Su formato general es
LOCAL
mudo-1,
raudo-2,
...
Escritura de macros
400
Captulo 22
La figura 22-4 ilustra el uso de LOCAL. El objetivo del programa es realizar divisin por
medio de sustracciones sucesivas. La rutina resta el divisor del dividendo y agrega uno al cociente
hasta que el dividendo es menor que el divisor. El procedimiento necesita dos etiquetas: COMP
para la direccin del ciclo y OUT para salir del procedimiento al terminar. Ambas, COMP y
OUT, estn definidas como LOCAL y pueden tener cualquier nombre vlido.
TITLE
P22MACR4
INITZ
MACRO
/Define macro
MOV
AX,@data
MOV
DS, AX
MOV
ES, AX
ENDM
,-Fin d e m a c r o
DIVIDEND, DIVISOR, QUOTIENT
MACRO
COMP
LOCAL
OUT
LOCAL
d i v i s o r , CX = c o c i e n t e
AX = dividendo, BX
MOV
AX, DIVIDEND
/Asigna dividendo
BX,DIVISOR
MOV
/Asigna divisor
C
X
.
C
X
/Pone en c e r o al c o c i e n t e
SUB
DIVIDE
(EXE)
Uso
de
LOCAL
COMP :
CMP
JB
SUB
INC
JMP
AX,BX
OUT
AX.BX
CX
COMP
MOV
ENDM
QUOTIENT,CX
.MODEL
.STACK
SMALL
64
OUT:
0000
0002
0004
0096
001B
0000
DIVDND
DIVSOR
QUOTNT
0000
0000
0003
0005
0007
000A
000E
0010
0010
0012
0014
0016
0017
0019
0019
001D
0020
0022
D8
C0
Al
8B
2B
0000 R
1E 0 0 0 2
C9
3B
72
2B
41
EB
C3
05
C3
89
B8
CD
OE 0 0 0 4
4C00
21
150
27
?
Dividendo
Divisor
Cociente
.CODE
PROC
FAR
.LALL
INITZ
MOV
AX,data
MOV
DS.AX
MOV
ES, AX
DIVIDE DIVDND,DIVSOR, QUOTNT
A X = d i v i d e n d o , BX = d i v i s o r , CX = c o c i e n t e
MOV
Asigna dividendo
AX,DIVDND
MOV
Asigna divisor
BX,DIVSOR
SUB
Pone en cero al cociente
CX, CX
BEGIN
8E
8E
.DATA
DW
DW
DW
/Almacenar el cociente
/Termina macro
R
??0000 :
F7
CMP
JB
SUB
INC
JMP
AX,BX
??0001
AX,BX
CX
??0000
MOV
MOV
INT
ENDP
END
QUOTNT,CX
AX,4C00H
21H
??0001:
R
BEGIN
Figura 22-4
BEGIN
Uso de LOCAL
/Almacenar el
/Sale al DOS
cociente
401
MACRO
ENDM
PROMPT
MACRO
MESSGE
ENDM
Para usar cualquiera de las macros catalogadas, en lugar de codificar las definiciones MACRO al
inicio del programa utilice la directiva INCLUDE as:
INCLUDE
D:MACRO.LIB
INITZ
El ensamblador accesa el archivo llamado MACRO.LIB en la unidad D e incluye ambas definiciones de macro, INITZ y PROMPT, en el programa. En este ejemplo, slo INITZ es realmente
necesaria. El listado ensamblado contendr una copia de las definiciones de las macros, indicada
con una letra C en la columna 30 del archivo LST. Luego de cada macroinstruccin estar la
expansin de la macro, junto con su cdigo objeto generado, indicada por un signo de ms ( + ) en
la columna 3 1 .
Ya que un ensamblado MASM (hasta, e incluso la versin 5.1) es una operacin de dos
pasadas, puede usar las siguientes instrucciones para hacer que INCLUDE suceda slo en el paso
1 (en lugar de en ambas pasadas):
IFl
INCLUDE
D:\MACRO.LIB
ENDIF
IFl y ENDIF son directivas condicionales. IFl le indica al ensamblador que accese la biblioteca
slo en la pasada 1 del ensamblado. ENDIF termina la lgica de IF. Una copia de la definicin de
la macro ya no aparecer en el listado, lo que ahorra tiempo y espacio. (MASM versin 6.0 y
siguientes no necesitan directivas que hagan referencia a las dos pasadas.)
El programa de la figura 22-5 contiene las instrucciones previamente descritas I F l , INCLUDE
y ENDIF, aunque el ensamblador lista slo el ENDIF en el archivo LST. Las dos macroinstrucciones
usadas en el segmento de cdigo, INITZ y PROMPT, son ambas catalogadas en MACRO.LIB.
Escritura de macros
402
TITLE
page
60,132
P22MACR5
(EXE)
.MODEL
. STACK
0000
54
66
6F
65
20
24
73
6D
74 20
6 1 63
6F M E S S G E
72
.DATA
DB
Prueba
de
Captulo 22
INCLUDE
SMALL
64
'Test
of
0000
BEGIN
0000
0003
0005
B8
8E D 8
8E CO
0007
0009
000D
OOOF
0012
0014
B4
8D
CD
B8
CD
09
16 0000 R
21
4C0O
21
1
1
1
1
1
1
BEGIN
Figura 22-5
.CODE
PROC
INITZ
MOV
MOV
MOV
PROMPT
MOV
LEA
INT
MOV
INT
ENDP
END
FAR
AX,@data
DS,AX
ES,AX
MESSGE
A H , 09
DX, M E S S G E
21H
AX,4C0OH
21H
/Peticin
,-Sale
al
para
desplegar
DOS
BEGIN
Fueron almacenadas juntas simplemente como un archivo en disco bajo ese nombre por medio de
un programa editor.
La colocacin de INCLUDE no es crtica, pero la directiva debe aparecer antes de cualquier
macroinstruccin que haga referencia a una entrada de la biblioteca.
La directiva PURGE
La ejecucin de una instruccin INCLUDE hace que el ensamblador incluya todas las definiciones
de macros que estn especificadas en la biblioteca. Sin embargo, suponga que una biblioteca
contiene las macros INITZ, PROMPT y DIVIDE, pero que el programa slo necesita INITZ. La
directiva PURGE permite que usted "elimine" las macros PROMPT y DIVIDE que no necesita
del ensamblado actual:
IFl
INCLUDE
D:\MACRO.LIB
;Incluye
la
biblioteca
completa
ENDIF
PURGE
PROMPT,DIVIDE
;Elimina
las
INIT
CSEG,DATA,STACK
,-Utiliza
la
macros
macro
no
necesarias
restante
Una operacin PURGE facilita slo el ensamblado de un programa y no tiene efecto sobre las
macros almacenadas en la biblioteca.
CONCATENACIN
El carcter ampersn (&) indica al ensamblador que una (concatene) texto o smbolos. La siguiente macro M O V E proporciona la generacin de la instruccin MOVSB, MOVSW o MOVSD:
Directivas de repeticin
403
MOV
MACRO
REP
TAG
MOVS&TAG
ENDM
Un usuario podra codificar esta instruccin como MOVE B, MOVE W o MOVE D. El ensamblador
concatena el parmetro con la instruccin MOVS, para producir REP MOVSB, REP MOVSW o
REP MOVSD, respectivamente. (Este ejemplo es muy trivial y slo es para fines ilustrativos.)
DIRECTIVAS DE REPETICIN
Las directivas de repeticin REPT, IRP e IRPC hacen que el ensamblador repita un bloque de
instrucciones terminadas por ENDM. (MASM 6.0 introdujo los trminos REPEAT, FOR y FORC
para REPT, IRP e IRPC, respectivamente.) Estas directivas no tienen que estar contenidas en una
definicin M A C R O , pero si lo estn, es necesario un ENDM para finalizar la repeticin y un
segundo ENDM para terminar la definicin MACRO.
REPT: Repetir
La directiva REPT provoca la repeticin de un bloque de instrucciones hasta ENDM de acuerdo
con el nmero de veces en la expresin de entrada:
REPT
expresin
REPT
N=
N + 1
DB
ENDM
El resultado es la generacin de cinco instrucciones DB, desde DB 1 hasta DB 5. Un uso para REPT
podra ser para definir una tabla o parte de una tabla. El ejemplo siguiente define una macro que
utiliza REPT para hacer sonar la bocina cinco veces:
BEEPSPKR
MACRO
MOV
AH,02H
Peticin de
salida
MOV
DL,07
Carcter de
campana
Repetir
21H
Llama al DOS
REPT
INT
ENDM
ENDM
cinco veces
Fin de REPT
Fin de MACRO
Escritura de macros
404
Captulo 22
arg_mudo, <argumentos>
Los argumentos, contenidos en parntesis angulares, son cualesquier nmero de smbolos vlidos, incluyendo cadenas de caracteres, numricos o constantes aritmticas. El ensamblador genera un bloque de cdigo para cada argumento. En el ejemplo siguiente el ensamblador genera DB
3, DB 9, DB 17, DB 25 y DB 28:
IRP
N,<3,19,17,25,28>
DB
arg_mudo,cadena
N,345678
DW
ENDM
DIRECTIVAS CONDICIONALES
El lenguaje ensamblador permite usar varias directivas condicionales. Usamos IF1 anteriormente
para incluir una entrada de biblioteca slo durante la pasada 1 de un ensamblado. Las directivas
condicionales son muy tiles dentro de una definicin de macro, pero no estn limitadas a ese
propsito. Cada directiva IF debe tener su correspondiente ENDIF para terminar una condicin
que se prueba. Un ELSE opcional puede proporcionar una accin alterna. A continuacin est el
formato general para la familia IF de directivas condicionales:
IFxx
(condicin)
ELSE
(opcional)
ENDIF
(fin d e l
bloque
condicional
IF)
Directivas condicionales
405
A continuacin est un ejemplo sencillo del uso de IFNB (si no es blanco). Toda INT 21H
requiere de una funcin en el registro AH, y algunas peticiones tambin necesitan un nmero en el
DX. La macro DOS21 utiliza IFNB para probar un argumento no blanco para el DX; si el resultado es verdadero (el argumento no es blanco), el ensamblador genera la instruccin MOV que
carga el DX:
DOS21
MACRO
DOSFUNC,DXADDRES
MOV
AH,DOSFUNC
IFNB
<DXADDRES>
MOV
DX,OFFSET
DXADDRES
ENDIF
INT
21H
ENDM
El uso de DOS21 para entrada sencilla desde el teclado slo necesita cargar el AH con un
nmero, en este caso la funcin 01H:
DOS21
01
Escritura de macros
406
Captulo 22
El ensamblador genera MOV AH,01 y la INT 21H. La entrada de una cadena de caracteres necesita
de la funcin OAH en el AH y la entrada de la direccin en el DX. Poda codificar la macro DOS21
como
DOS21
OAH,IPFIELD
[condicin]
...
(condicin
no
vlida)
EXITM
ENDIF
CNTR
Expansin
de
macro
terminada
EXITM
ENDIF
Si CNTR tiene un valor diferente de cero, el ensamblador genera el comentario y sale (EXITM)
de cualquier expansin de macro. Observe que una instruccin pone en cero a CNTR y tambin
que los bloques IFNDEF slo necesitan poner en 1 a CNTR en lugar de incrementarlo.
Si el ensamblador pasa todas estas pruebas de seguridad, genera la expansin de la macro.
En el segmento de cdigo, la segunda macroinstruccin DIVIDE contiene un dividendo y cociente no vlidos y slo genera comentarios. Una manera de mejorar la macro sera probar si el divisor no
es cero y si dividendo y divisor tienen el mismo signo; para ello, utilice instrucciones de ensamblador
en lugar de directivas condicionales.
Directivas condicionales
407
TITLE
INITZ
DIVIDE
page
60,132
P22MACR6 (EXE)
Prueba de IF y de IFNDEF
;Define macro
MACRO
AX,@data
,-Inicializa
MOV
DS,AX
; registros de
MOV
ES,AX
; segmentos
MOV
;Fin de la macro
ENDM
MACRO
DIVIDEND,DIVISOR,QUOTIENT
LOCAL
COMP
LOCAL
OUT
CNTR
= 0
AX = d ivdo, BX = dvsor, CX = ente
IFNDEF DIVIDEND
Dividendo no definido
CNTR
= CNTR +1
ENDIF
IFNDEF
DIVISOR
Divisor no definido
CNTR
= CNTR +1
ENDIF
IFNDEF
QUOTIENT
Cociente no definido
CNTR
= CNTR + 1
ENDIF
IF
CNTR
Expansin de macro terminada
EXITM
ENDIF
MOV
AX,DIVIDEND
Asigna dividendo
MOV
BX,DIVISOR
Asigna divisor
CX,CX
SUB
Pone en cero al cociente
COMP:
CMP
JB
SUB
INC
JMP
AX,BX
OUT
AX,BX
CX
COMP
MOV
ENDM
QUOTIENT,CX
.MODEL
.STACK
.DATA
DW
DW
DW
SMALL
64
OUT:
0000
0002
0004
0096
001B
0000
DIVDND
DIVSOR
QUOTNT
0000
0000 B8
R
0003 8E D8
0005 8E
CO
= 0000
BEGIN
1
1
1
1
1
0007 Al 0000 R
1
000A 8B 1E 0002 R 1
000E 2B C9
1
0010
1 ??0000:
0010 3B C3
1
0012 72 05
1
150
27
,-Almacenar
cociente
Dividendo
Divisor
Cociente
.CODE
PROC
FAR
.LALL
INITZ
Inicializa
MOV
AX,@data
registro de
MOV
DS,AX
segmento
MOV
ES.AX
DIVIDE
DIVDND,DIVSOR,QUOTNT
CNTR
= 0
AX = divdo, BX = dvsor, CX = ente
MOV
AX,DIVDND
Asigna dividendo
MOV
BX,DIVSOR
Asigna divisor
SUB
CX,CX
Pone en cero al cociente
CMP
JB
Figura 22-6
AX,BX
??0001
Uso de IF y de IFNDEF
Escritura de m a c r o s
408
0014
0016
0017
0019
0019
=
2B
41
EB
C3
F7
89
OE
0004 R
0000
0001
0002
001D
0020
0022
1
1
1
1 ??0001:
1
1
1
1
1
1
1
1
1
1
1
1
1
1
B8
CD
;
/
SUB
INC
JMP
CNTR
ENDIF
IF
;
EXITM
MOV
INT
ENDP
END
BEGIN
/Dividendo ,- S u m a r al c o c
MOV
QUOTNT,CX
;Almacena
DIVIDE
DIDND,DIVSOR,QUOT
CNTR
= 0
AX = d i v d o , BX = d v s o r , CX = e n t e
IFNDEF DIDND
Dividendo no definido
CNTR
= C N T R +1
ENDIF
IFNDEF
QUOT
4C00
21
AX.BX
CX
??0000
Figura 22-6
Cociente
= CNTR +
Captulo 2 2
no
1
CNTR
Expansin
de
AX,4C00H
21H
coc
definido
macro
terminada
/Salir
al
DOS
BEGIN
(continuacin)
MACRO
TAG
IFIDN
<&TAG>,<B>
En la definicin, el primer IFIDN genera REP MOVSB si usted codifica MOVIFB como una
macroinstruccin. El segundo IFIDN genera REP MOVSW si usted codifica MOVIFW como una
macroinstruccin. Si el usuario no proporciona B o W, el ensamblador genera un comentario y
por omisin MOVSB. (El uso comn del operador ampersn (&) es para concatenacin.)
Los tres ejemplos en el segmento de cdigo de MOVIF prueban la B, la W y una condicin
no vlida. No intente ejecutar el programa como est, ya que los registros CX y DX necesitan
cifras apropiadas para las instrucciones MOVS. (Esta macro no es muy til, ya que su objetivo es
ilustrar el uso de directivas condicionales de una manera sencilla. Sin embargo, ahora ya debe ser
capaz de desarrollar macros significativas.)
PUNTOS CLAVE
Una definicin de macro necesita una directiva MACRO, un bloque de una o ms instrucciones, conocido como el cuerpo que la definicin genera, y una directiva ENDM para
terminar la definicin.
Puntos clave
409
TITLE
INITZ
MOVIF
0 0 00
0000 B8
0003 8E D8
0005 8E C0
BEGIN
1
1
1
0007 F3/ A4
1
1
1
0009 F3/ A5
1
1
1
000B F3/ A4
000D B8 4C00
0010 CD 21
0012
1
1
1
1
BEGIN
page
60,132
P22MACR7 (EXE)
Pruebas de IFIDN
MACRO
/Define macro
MOV
AX,data
MOV
DS, AX
MOV
ES, AX
ENDM
/Fin de la macro
MACRO
TAG
/Define macro
IFIDN
<&TAG>,<B>
REP MOVSB
EXITM
ENDIF
IFIDN
<&TAG>,<W>
REP MOVSW
ELSE
Ni B ni W, por omisin B
REP MOVSB
ENDIF
ENDM
/Fin de la macro
.MODEL
SMALL
. STACK 64
. CODE
PROC
FAR
.LALL
INITZ
MOV
AX,@data
MOV
DS,AX
MOV
ES,AX
MOVIF
B
IFIDN
<B>,<B>
REP MOVSB
EXITM
MOVIF
W
IFIDN
<W>,<W>
REP MOVSW
ENDIF
MOVIF
ELSE
Ni B ni W, por omisin B
REP MOVSB
ENDIF
MOV
AX,4C00H
/Sale al DOS
INT
21H
ENDP
END
BEGIN
Figura 22-7
Uso de IFIDN
Una instruccin de macro es el uso de la macro en un programa. El cdigo que una instruccin
genera es la expansin de la macro.
Las directivas .SALL, .LALL y .XALL controlan el listado de comentarios y el cdigo
objeto generado en una expansin de macro.
La directiva LOCAL facilita el uso de nombres dentro de una definicin de macro y debe
aparecer inmediatamente despus del enunciado de la macro.
El uso de argumentos mudos (ficticios) en una definicin de macro permite a un usuario
codificar parmetros con ms flexibilidad.
Una biblioteca de macros hace que estn disponibles para otros programas.
Las directivas condicionales le permiten validar parmetros de la macro.
Escritura de macros
410
Captulo 22
PREGUNTAS
22-1.
22-2.
22-3.
22-4.
i
5
22-5. Codifique los siguientes enunciados: (a) Suprima todas las instrucciones que genera una macro; (b)
liste slo las instrucciones que generan cdigo objeto.
22-6. Codifique dos definiciones de macro que realicen multiplicacin: (a) MULTBY es para generar
cdigo que multiplique un byte por un byte; (b) MULTWD es para generar cdigo que multiplique
una palabra por una palabra. Incluya multiplicandos y multiplicadores como argumentos mudos en la
definicin de la macro. Pruebe la ejecucin de las macros con un pequeo programa que tambin
defina los campos de datos necesarios.
22-7. Almacene las macros definidas en la pregunta 22-6 en una biblioteca de macros. Corrija el programa
para incluir (INCLUDE) las entradas de la biblioteca durante la pasada 1 del ensamblador.
22-8. Escriba una macro llamada BIPRINT que use la INT 17H del BIOS para imprimir. La macro debe
incluir una prueba para el estado de la impresora y debe prever cualquier lnea que se imprima con
cualquier longitud.
22-9. Corrija la macro de la figura 22-6 de modo que pase por alto la divisin si el divisor es cero.
j
i
j
\
j
j
j
]
j
j
!
:
I
CAPTULO 23
Enlace de subprogramas
OBJETIVO
INTRODUCCIN
Hasta este captulo, los programas que hemos presentado han consistido en un solo mdulo ensamblado y autnomo. Sin embargo, es posible desarrollar un programa que conste de un programa
principal enlazado con uno o ms subprogramas ensamblados por separado. Hay varias razones
para organizar un programa en subprogramas:
Enlazar entre lenguajes; por ejemplo, combinar la potencia del cmputo de un lenguaje de
alto nivel con el procesamiento eficaz del lenguaje ensamblador.
Facilitar el desarrollo de proyectos grandes, en los que diferentes equipos producen sus
mdulos por separado.
Traslapar partes de un programa durante la ejecucin a causa del gran tamao del programa.
Cada programa es ensamblado por separado y genera su propio mdulo de cdigo objeto
(.OBJ). Entonces, el enlazador enlaza los mdulos objeto en un mdulo ejecutable (.EXE). Habitualmente, el programa principal es el que inicia la ejecucin y llama a uno o ms subprogramas.
Los subprogramas a su vez pueden llamar a otros subprogramas.
411
Enlace de subprogramas
412
Programa
principal
Programa
principal
Sub-2
Captulo 23
Sub-3
Figura 23-1
Jerarqua de programa
La figura 23-1 muestra dos ejemplos de una jerarqua de un programa principal y tres
subprogramas. En la parte (a), el programa principal llama a los subprogramas 1, 2 y 3. En la
parte (b), el programa principal llama a los subprogramas 1 y 2 y slo el subprograma 1 llama al
subprograma 3.
Existen numerosas formas de organizar subprogramas, pero la organizacin tiene que tener
sentido para el ensamblador, para el enlazador y para la ejecucin. Tambin tiene que tener cuidado
de situaciones en las que, por ejemplo, el subprograma 1 llama al subprograma 2, que llama al
subprograma 3, quien a su vez llama al subprograma 1. Este proceso, conocido como recursin,
puede hacerse funcionar, pero si no se maneja con cuidado, puede provocar interesantes errores
de ejecucin.
SEGMENTOS
Esta seccin cubre varias opciones utilizadas para los segmentos. El formato general para una
directiva completa SEGMENT es
n_seg
SEGMENT
[alinear]
[combinar]
['clase']
Tipo align
El operador alinear (align) le indica al ensamblador que alinee el segmento nombrado al inicio de
una frontera particular de almacenamiento:
BYTE
Llamadas intrasegmento
413
PUBLIC
COMMON
SEGMENT
PARA NONE
CODESEG
SEGMENT
'Code'
'Code'
LLAMADAS INTRASEGMENTO
Las instrucciones CALL usadas hasta este momento han sido llamadas intrasegmento; esto es, el
procedimiento llamado est en el mismo segmento de cdigo que el procedimiento que llama. Una
llamada (CALL) intrasegmento es cercana si el procedimiento llamado est definido o si es por
omisin es NEAR (esto es, dentro de 32K). La operacin CALL empuja el registro IP a la pila y
Enlace de subprogramas
414
Captulo 2 3
reemplaza el IP con el desplazamiento de la direccin destino. Por tanto una llamada cercana hace
referencia a un procedimiento (cercano) que se encuentra en el mismo segmento.
Ahora considere una llamada (CALL) intrasegmento que consista del cdigo objeto E8
2000, en donde E8 es el cdigo de la operacin y 2000 es el desplazamiento de un procedimiento
llamado. La operacin guarda el IP en la pila y almacena el 2000 como desplazamiento 0020 en el
IP. Entonces el procesador combina la direccin actual en el CS con el desplazamiento en el IP
para la siguiente instruccin a ejecutar. Al salir del procedimiento llamado, un RET (cercano)
saca de la pila el IP almacenado y regresa a la siguiente instruccin despus de CALL:
CALL
proc
cerc
, L l a m a d a c e r c a n a :
;
proc
cerc
PROC
cerc
IP, e n l a z a
a proc
en la
pila
cerc
NEAR
RET
proc
el
guarda
, R e g r e s o c e r c a n o :
saca
IP
y regresa
ENDP
Una llamada intrasegmento puede ser cercana, como se describi, o lejana si la llamada es
a un procedimiento definido como lejano dentro del mismo segmento. RET es cercano si aparece
en un procedimiento NEAR y lejano si aparece en un procedimiento FAR.
LLAMADAS INTERSEGMENTO
Una llamada (CALL) es clasificada como lejana si el procedimiento llamado est definido como
FAR o como EXTRN, con frecuencia en otro segmento. La operacin CALL primero guarda en
la pila el contenido del registro CS e inserta una nueva direccin de segmento en el CS. Despus
guarda en la pila el IP e inserta un nuevo desplazamiento de direccin en el IP. (Los datos
guardados en el CS e IP proporcionan la direccin de la instruccin que sigue de forma inmediata
a CALL.) De esta manera, ambas direcciones del segmento de cdigo y el desplazamiento son
guardados para regresar del procedimiento llamado. Una llamada a otro procedimiento siempre es
una llamada a un intersegmento lejano:
CALL
proc_lej
;Llamada
;
p r o c _ _lej
proc
lej
PROC
el
lejana:
CS,
el
IP
guarda
enlaza
en
la
proc
pila
lej
NEAR
RET
, R e g r e s o l e j a n o :
ENDP
remueve
IP,
CS y
regresa
Considere una llamada (CALL) intersegmento que consta del cdigo objeto 9A 0002 AF04. El 9A
hex es el cdigo de la operacin para un CALL intersegmento. La operacin guarda en la pila el
415
MAINPROG
EXTRN
PROC
SUBPROG:FAR
FAR
CALL
SUBPROG
MAINPROG
ENDP
SUBPROG
PUBLIC SUBPROG
PROC
FAR
SUBPROG
RET
ENDP
Figura 23-2
IP actual y almacena el nuevo desplazamiento 0002 como 0200 en el IP. Despus guarda en la pila
el CS y almacena la nueva direccin de segmento AF04 como 04AF en CS. Los nmeros en el CS
e IP se combinan para establecer la direccin de la primera instruccin a ejecutar en el subprograma
llamado:
Segmento de cdigo:
Desplazamiento en IP:
Direccin efectiva:
04AF0H
+ 02OOH
04CF0H
Al salir del procedimiento llamado, un RET intersegmento (lejano) revierte la operacin CALL
removiendo de la pila las direcciones originales IP y CS y envindolas a sus respectivos registros.
La pareja CS:IP ahora apunta a la direccin de la siguiente instruccin despus del CALL original, en donde la ejecucin se reasume.
La diferencia entre un CALL cercano y uno lejano es bsicamente que un CALL cercano
slo reemplaza el desplazamiento IP, mientras que un CALL lejano reemplaza tanto la direccin
del segmento CS como del desplazamiento IP.
;CALL
(llamada)
al subprograma
Enlace de subprogramas
416
El
enlazador
Object
Run
List
Modules
File
File
Libraries
Respuesta
solicita
[.OBJ]:
[filespec.EXE]
[NUL.MAP]:
[.LIB]:
Captulo 2 3
D : MAINPROG+ D : SUBPROG
D:COMBPROG
(o
cualquier
nombre
vlido)
CON
[Enter]
El enlazador hace corresponder los EXTRN en un mdulo objeto con los PUBLIC en el otro e
inserta las direcciones de desplazamiento requeridas. Despus combina los dos mdulos objetos
en un mdulo ejecutable. Si es incapaz de establecer la correspondencia entre las referencias, el
enlazador enva mensajes de error; esprelos antes de intentar ejecutar el mdulo.
La directiva EXTRN
La directiva EXTRN indica al ensamblador que el elemento llamado un dato procedimiento o
etiqueta est definido en otro ensamblado. (MASM 6.0 introdujo el trmino EXTERN.) EXTRN
tiene el formato siguiente:
EXTRN nombre:tipo
[,
...]
Puede definir ms de un nombre, hasta el final de la lnea, o bien codificar instrucciones adicionales EXTRN. El otro mdulo ensamblado a su vez debe definir el nombre e identificarlo como
PUBLIC. La entrada tipo puede ser ABS (una constante), BYTE, DWORD, FAR, NEAR, WORD
o un nombre definido por un EQU, y debe ser vlido en trminos de la definicin real de un
nombre;
BYTE, WORD y DWORD identifican datos a los que hace referencia un mdulo, pero otro
mdulo los define.
NEAR y FAR identifican a un procedimiento o etiqueta de instruccin a los que hace referencia
un mdulo pero otro mdulo los define.
La directiva PUBLIC
La directiva PUBLIC indica al ensamblador y al enlazador que la direccin de un smbolo especificado definido en el ensamblado actual estar disponible para otros mdulos. El formato general
para PUBLIC es
PUBLIC
smbolo
. . .]
Puede definir ms de un smbolo, hasta el final de la lnea, o bien codificar instrucciones PUBLIC
adicionales. La entrada smbolo puede ser una etiqueta (incluyendo etiquetas PROC), una variable
o un nmero. Entradas no vlidas incluyen nombres de registros y smbolos EQU que definen
valores mayores de dos bytes.
La llamada de procedimientos lejanos y el uso de EXTRN y PUBLIC ofrecera un poco de
dificultad, aunque se requiere de mucho cuidado para crear datos definidos en un mdulo conocido en otros mdulos.
417
Examinemos tres diferentes tipos de crear datos conocidos entre programas: por medio de
EXTRN y PUBLIC, definicin de datos en subprogramas y paso de parmetros.
418
Enlace de subprogramas
0000
0000
0080
0040[????]
0000
0000
0002
0004
0140
2500
0000
0 0O0
0000 B8
R
0003 8E D8
0005 Al 0002 R
0008 8B 1E 0 0 0 0 R
000C 9A 0000
0011 B8 4C00
0014 C D 21
0016
0016
Segmentos
TITLE
P 2 3 M A I N 1 (EXE)
Llama
EXTRN
P23SUB1:FAR
STACKSG
STACKSG
DATASG
QTY
PRICE
DATASG
SEGMENT PARA
DW
0140H
DW
2500H
ENDS
CODESG
BEGIN
BEGIN
CODESG
grupos
a m e
Length
0016
0004
0080
CODESG
DATASG
STACKSG
Symbols:
a m e
Type
F PROC
L FAR
L WORD
L WORD
BEGIN
P23SUB1
PRICE
QTY
0 000
0000
0000 F7 E3
0002 CB
0003
00 0 3
Segmentos
subprograma
'Stack'
'Data'
Align
PARA
PARA
PARA
Combine
NONE
NONE
STACK
Valu
000 0
0000
0002
0 0 00
Attr
CODESG
External
DATASG
DATASG
Subprograma
Class
'CODE'
'DATA'
'STACK'
Length
P23SUB1
CODESG
P23SUB1
P23SUB1
CODESG
grupos
a m e
a m e
P23SUB1
Link Map
Object Modules:
Stop
0007FH
TITLE
Length
0003
Align
PARA
Combine
NONE
Type
F PROC
Valu
0000
Attr
CODESG
P23MAIN1+P23SUB1
Length ame
00080H STACKSG
Figura 23-3
0 016
llamado
CODESG
Symbols:
Start
OOOOOH
al
Captulo 23
Class
STACK
cant.
Class
'CODE'
Global
Length=0003
419
at
DATA
CODE <-CODE <--
Nota:
de
2 segmentos
cdigo
0009:0000
Figura 23-3
(continuacin)
0F200H
+00020H
0F220H
El cargador de programa determina esta direccin al igual que nosotros y la sustituye en el operando
de CALL. P23SUB1 multiplica los dos nmeros en el AX y BX, con el producto en el DX:AX,
y realiza un regreso lejano a P23MAIN1 (porque RET est en un procedimiento FAR).
'Code'
Este CALL lejano almacena 2000H en el IP como 0020H y 200FH en el registro CS como
0F20[0]. Como el subprograma comparte un segmento de cdigo comn con el programa principal, el registro CS se establece con la misma direccin de inicio, 0F20H. Pero el CS:IP para
P23SUB2 ahora proporciona lo siguiente:
Direccin CS para P23MAIN2 y P23SUB2:
0F200H
Desplazamiento IP para P23SUB2:
+ 0020H
Direccin efectiva de P23SUB2:
0 F 2 2 OH
Por lo tanto, el segmento de cdigo del subprograma presumiblemente inicia en 0F220H. Es esto
correcto? El mapa del enlace no deja claro este punto, pero puede inferir la direccin del listado
del programa principal, que termina en el desplazamiento 0015H. (El mapa muestra 16H, que es
la siguiente localidad disponible.) Ya que el segmento de cdigo para el subprograma est defin-
Enlace de subprogramas
420
0000
0000
0080
0 0 4 0 [????]
0000
0000
0002
0004
0140
2500
0000
0000
0000
0003
0005
0008
oooc
0011
0014
0016
0016
B8
8E
Al
8B
9A
B8
CD
R
D8
0002 R
1E 0000 R
0 0 0 0 -4C00
21
TITLE
P 2 3 M A I N 2 (EXE)
Llama
EXTRN
P23SUB2:FAR
STACKSG
STACKSG
DATASG
QTY
PRICE
DATASG
SEGMENT PARA
DW
0140H
DW
2500H
ENDS
CODESG
BEGIN
BEGIN
CODESG
Segmentos
Data
al
subprograma
'Stack'
grupos
a m e
Length
0016
0004
0080
Align
PARA
PARA
PARA
Combine
PUBLIC
NONE
STACK
a m e
Type
F PROC
L FAR
L WORD
L WORD
Valu
0000
0000
0002
0000
Attr
CODESG
External
DATASG
DATASG
CODESG
DATASG
STACKSG
Symbols:
BEGIN
P23SUB2
PRICE
QTY
000 0
0000
0000
0002
0003
0003
Captulo 2 3
0016
P23SUB2
CODESG
P235UB2
P23SUB2
CODESG
Segmentos y grupos
a m e
CODESG
Symbols:
a m e
P23SUB2
Link Map
Object Modules:
Length
TITLE
F7 E3
CB
Subprograma
Class
'CODE'
'DATA'
'STACK'
Length
0003
Align
PARA
Combine
PUBLIC
Type
F PROC
Valu
0000
Attr
CODESG
llamado
Class
'CODE'
Global
Length=0003
P23MAIN2+P23SUB2
Figura 23-4
cant.
Code
421
segment
Figura 23-4
(continuacin)
do como PARA, inicia en una frontera de prrafo (divisible exactamente entre 10H, de modo que
el dgito de ms a la derecha es 0):
p r o g r a m a principal
I
0F200
...
(no usado)
subprograma
141F0
0F220
El enlazador coloca al subprograma en la primera frontera de prrafo posterior al programa principal, en el desplazamiento 00020H. Por lo tanto, el segmento de cdigo del subprograma inicia
en 0F200H ms 0020H, o 0F220H.
Examinemos ahora este mismo programa definido con directivas simplificadas de segmento.
170F
Esta vez, el nuevo valor de desplazamiento es 16H y la direccin del segmento es 0F17H. Puesto
que el subprograma comparte un segmento de cdigo comn con el programa principal, el registro
CS se establece con la misma direccin de inicio, 0F17(0), para ambos. Por tanto, la direccin de
P23SUB3 puede ser calculada como sigue:
Direccin CS para P23MAIN3 y P23SUB3:
Desplazamiento IP para P23SUB3:
Direccin efectiva de P23SUB3:
F 1 7 0H
+ 016H
F186H
Puede inferir la direccin a partir del listado del programa principal, que termina en el desplazamiento 0015H. (El mapa revela 16H, que es la siguiente localidad disponible.) Como el mapa
muestra el segmento de cdigo principal que inicia en 00000H, la siguiente frontera de palabra
despus de 0015 est en 00016H, en donde P23SUB3 inicia.
Enlace de subprogramas
422
TITLE
0000
0002
0140
2500
P 2 3 M A I N 3 (EXE)
Llama
.MODEL
SMALL
.STACK
64
EXTRN
P23SUB3:FAR
.DATA
DW
DW
QTY
PRICE
0000
0000 B8
R
0003 8E D8
0005 Al 0002 R
0008 8B 1E 0 0 0 0
000C 9A 0000
0011 B8 4C00
0014 CD 21
0016
R
E
BEGIN
Segmentos y grupos
a m e
DGROUP
_DATA
STACK
_TEXT
Symbols:
a m e
BEGIN
P23SUB3
PRICE
QTY
0000
0002
0003
Class
WORD
PARA
WORD
PUBLIC
STACK
PUBLIC
'DATA'
'STACK'
'CODE'
Type
F PROC
L FAR
L WORD
L WORD
Valu
0000
0000
00 02
00 0 0
P23SUB3
Segmentos y grupos
a m e
DGROUP
_DATA
_TEXT
. .
Symbols:
a m e
P23SUB3
entry
BEGIN
Combine
F7 E3
CB
Program
/Configura precio y
/
cantidad
/Llama al s u b p r o g r a m a
/Sale al DOS
Align
P23SUB3
Link Map
Object Modules:
FAR
AX,@data
DS, AX
AX,PRICE
BX,QTY
P23SUB3
AX,4C00H
21H
Length
GROUP
0004
0040
0016
TITLE
000
subprograma
0140H
2500H
.CODE
PROC
MOV
MOV
MOV
MOV
CALL
MOV
INT
ENDP
END
BEGIN
al
P23SUB3
-MODEL
. CODE
PROC
PUBLIC
MUL
RET
ENDP
END
Attr
_TEXT
Length
External
_DATA
_DATA
Subprograma
SMALL
FAR
P23SUB3
BX
Figura 23-5
at
0016
llamado
A X = p r e c i o , BX =
DX:AX = producto
cant.
P23SUB3
Length
GROUP
0000
0003
Align
Combine
WORD
WORD
PUBLIC
PUBLIC
Type
F PROC
Valu
0000
Attr
_TEXT
Class
'DATA'
CODE'
Global
Length=0003
P23MAIN3+P23SUB3
point
Captulo 2 3
0000:0000
423
MOV
AX, PRICE
8B 1E 0000 E
MOV
BX, QTY
El cdigo objeto Al significa mover una palabra desde la memoria hacia el AX, mientras que. 8B
significa mover una palabra desde la memoria hacia el BX. (Con frecuencia, las operaciones con
el AX requieren de menos bytes.) Para P23SUB4, el ensamblador no tiene manera de conocer las
localidades de QTY y PRICE, de modo que almacen ceros en los operandos para ambos MOV.
El rastreo de la ejecucin del programa revela que el enlazador ha completado el cdigo objeto de
los operandos como sigue:
Al
0200
8B
1E 0000
El cdigo objeto ahora es idntico al generado por los tres programas precedentes en donde las
instrucciones MOV estn en el programa llamado. Este es un resultado lgico, ya que los operandos
en los tres programas hacen referencia a la misma direccin del segmento de datos en el registro
DS y a los mismos valores de desplazamiento.
El programa principal y el subprograma puede definir otros elementos de datos, pero slo
aquellos definidos como PUBLIC y EXTRN son conocidos en comn por ellos.
Enlace de subprogramas
424
0000
0000
0080
0040[????]
0000
0000
0002
0004
0140
2500
0000
0 000
0000 B8
0003 8E D8
0 0 0 5 9A 0 0 0 0
000A B8 4C00
000D CD 21
OOOF
OOOF
TITLE
P 2 3 M A I N 4 (EXE)
Llama
EXTRN
P23SUB4:FAR
PUBLIC
QTY,PRICE
STACKSG
STACKSG
DATASG
QTY
PRICE
DATASG
CODESG
BEGIN
R
E
BEGIN
CODESG
Segmentos y grupos
a m e
CODESG
DATASG
STACKSG
Symbols:
a m e
BEGIN
P23SUB4
PRICE
QTY
0000
0 0 00
0000
0003
0007
0009
0 00A
0 0 0A
Al 0000 E
8B 1E 0000
F7 E3
CB
subprograma
'Stack
'Data'
Length
OOOF
0004
0080
Align
PARA
PARA
PARA
Combine
PUBLIC
PUBLIC
STACK
Type
F PROC
L FAR
L WORD
L WORD
Valu
0000
0000
0002
0000
Attr
CODESG
External
DATASG
DATASG
Class
'CODE'
'DATA'
'STACK'
Length =
P23SUB4
Subprograma llamado
EXTRN
QTY:WORD,
PRICE:WORD
CODESG
P23SUB4
P23SUB4
CODESG
'CODE'
;DX:AX
Length
000A
Align
PARA
Combine
PUBLIC
Type
F PROC
V WORD
V WORD
Valu
0000
0000
0000
Attr
CODESG
Global
External
External
Figura 23-6
OOOF
Global
Global
TITLE
Segmentos y grupos
a m e
CODESG
Symbols:
a m e
P23SUB4
PRICE
QTY
al
Captulo 2 3
producto
Class
'CODE'
Length=000A
Paso de parmetros
Link Map
Object Modules:
Start
00000H
00080H
00090H
Stop
0007FH
00083H
000A9H
425
P23MAIN4+P23SUB4
Length
00080H
00004H
0001AH
Class
STACK
DATA
CODE
ame
STACKSG
DATASG
CODESG
at
Figura 23-6
0009:0000
(continuacin)
En una variacin del programa precedente, en la figura 23-7 define QTY en P23MAN5,
pero define PRICE en P23SUB5. En P23MAIN5 PRICE no existe, aunque P23SUB5 tiene que
conocer la localidad de ambos elementos. El segmento de cdigo de P23SUB5 tiene que recuperar
QTY de forma inmediata, mientras que el registro DS an contiene la direccin del segmento de
datos de P23MAIN5. Despus P23SUB5 guarda en la pila el DS y lo carga con la direccin de su
propio segmento de datos. P23SUB5 ahora puede obtener PRICE y realizar la multiplicacin de
QTY por PRICE.
Antes de regresar a P23MAIN5, P23SUB5 tiene que sacar el DS de la pila de modo que
P23MAIN5 pueda accesar su propio segmento de datos. (Tcnicamente, esto en realidad no es
necesario en este ejemplo, ya que P23MAIN5 regresa al DOS de manera inmediata, pero lo
haremos como una prctica estndar.)
Una nota final: podra hacer ambos segmentos de datos PUBLIC, con el mismo nombre y
clase. En ese caso, el enlazador los combinara, y P23SUB5 no tendra que guardar y sacar de la
pila el DS, ya que los programas usaran en mismo segmento de datos y la misma direccin de
DS. Dejaremos esta variante como ejercicio para que use corrija y rastree con DEBUG. El
segmento de cdigo de P23SUB5 se vera as:
EXTRN
QTY:WORD
ASSUME
CS:CODESEG,DS:DATASG
PUBLIC
P23SUB5
MOV
AX,PRICE
MOV
BX, QTY
; QTY en P2 3MAIN5
MUL
BX
/Producto en DX:AX
RET
PASO DE PARMETROS
Otra forma de hacer que se conozcan los datos por los subprogramas llamados es por medio del
paso de parmetros, en el que un programa pasa datos fsicamente mediante la pila. En este caso,
asegrese de que cada PUSH hace referencia a una palabra (o una palabra doble en sistemas
avanzados), ya sea en memoria o en un registro.
Pila de la estructura del programa
La pila de la estructura del programa es la parte de la pila que el programa que llama utiliza para
pasar parmetros y que el subprograma llamado utiliza para accesarlos. El subprograma llamado
Enlace de subprogramas
426
0000
0000
0080
0 0 4 0 [????]
0000
0000
0002
0140
0000
0000
0000 B8
0003 8E D8
0005 9A 0 0 0 0
000A B8 4C00
000D CD 21
00OF
000F
TITLE
P 2 3 M A I N 5 (EXE)
Llama
EXTRN
P23SUB5:FAR
PUBLIC QTY
STACKSG
STACKSG
DATASG
QTY
DATASG
SEGMENT PARA
DW
0140H
ENDS
CODESG
BEGIN
R
E
BEGIN
CODESG
Segmentos de grupos
a m e
CODESG
DATASG
STACKSG
Symbols:
a m e
BEGIN
P23SUB5
QTY
0000
0000
0002
2500
0000
0000
0000
0004
8B 1E
1E
0000
0005 B8
0008 8E D8
000A Al 0000
O00D F7 E3
OOOF IF
0010 CB
0011
0011
Length
000F
0002
0080
Align
PARA
PARA
PARA
Type
F PROC
L FAR
L WORD
Valu
0000
0000
0000
al
subprograma
'Stack'
'Data'
Combine
NONE
NONE
STACK
Class
'CODE'
'DATA'
'STACK'
Attr
CODESG
External
DATASG
Length
OOOF
Global
TITLE
P23SUB5
EXTRN
Subprograma
QTY:WORD
DATASG
PRICE
DATASG
SEGMENT
DW
ENDS
PARA 'Data'
2500H
CODESG
P23SUB5
llamado
R
R
P23SUB5
CODESG
Segmentos de grupos
a m e
CODESG
DATASG
Captulo 2 3
Length
0011
0002
Figura 23-7
Align
PARA
PARA
Combine
NONE
NONE
Class
'CODE'
'DATA'
427
Paso de parmetros
Symbols:
a m e
Type
F PROC
L WORD
V WORD
P23SUB5
PRICE
QTY
Link Map
Object Modules:
Start
00000H
00080H
00090H
00OA0H
OOOBOH
Stop
0007FH
00081H
00091H
000AEH
000C0H
Valu
0000
0000
0000
Attr
CODESG
Global Length=0011
DATASG
External
P23MAIN5+P23SUB5
Length
00080H
00002H
00002H
0000FH
00011H
ame
STACKSG
DATASG
DATASG
CODESG
CODESG
Class
STACK
DATA
DATA
CODE
CODE
OOOA:0000
Figura 23-7
(continuacin)
tambin puede utilizar la pila de la estructura del programa para almacenamiento temporal de
datos locales. El registro BP acta como un apuntador a la estructura. Para el paso de parmetros
haremos uso de ambos registros, el BP y el SP.
En la figura 23-8, el programa que llama P23MAIN6 guarda en la pila tanto PRICE como
QTY antes de llamar al subprograma P23SUB6. Inicialmente, el SP contiene el tamao de la pila,
80H. Cada palabra que se guarda en la pila disminuye en dos el SP. Despus del CALL, la pila de
la estructura aparece como sigue:
1200
200F
4001
78
7A
7C
0025
7E
1200
76
78
200F
4001
7A
7C
0025
7E
Enlace de subprogramas
428
TITLE
P 2 3 M A I N 6 (EXE)
Paso
EXTRN
P23SUB6:FAR
STACKSG
parmetros
0 00 0
0000 0040[????]
008 0
STACKSG
SEGMENT
DW
ENDS
0000
0000 014 0
0002 2500
00 04
DATASG
QTY
PRICE
DATASG
SEGMENT PARA
DW
014OH
DW
2500H
ENDS
0000
0000
CODESG
BEGIN
0000
0003
0005
0009
000D
0012
0015
0 017
0017
B8
8E
FF
FF
9A
B8
CD
R
D8
36 0002
36 0 0 0 0
0000
4C00
21
R
R
E
BEGIN
CODESG
Segmentos
Length
0017
0004
0080
Align
PARA
PARA
PARA
a m e
Type
F PROC
L FAR
L WORD
L WORD
Valu
0000
0000
0 002
000 0
BEGIN
P23SUB6
PRICE
QTY
TITLE
CODESG
P23SUB6
0000
0000
oooc
55
8B
8B
8B
F7
5D
CA
EC
46
5E
E3
08
06
0004
000F
O00F
Segmentos y
N
CODESG . .
Symbols :
N
P23SUB6
STACK 'Stack'
64 DUP(?)
'Data'
grupos
a m e
CODESG
DATASG
STACKSG
Symbols:
0000
0001
0003
0006
0009
000B
PARA
de
Captulo 2 3
P23SUB6
CODESG
P23SUB6
SEGMENT
PROC
ASSUME
PUBLIC
PUSH
MOV
MOV
MOV
MUL
POP
RET
ENDP
ENDS
END
Combine
PUBLIC
NONE
STACK
Attr
CODESG
External
DATASG
DATASG
Class
'CODE'
'DATA'
'STACK'
Length
0017
Subprograma llamado
Code'
PARA PUBLIC
FAR
CS:CODESG
P23SUB6
BP
BP, SP
AX,[BP+8]
;Obtiene precio
BX,[BP+6]
;Obtiene cantidad
;DX:AX = p r o d u c t o
BX
BP
4
grupos
Length
000F
Align
PARA
Combine
PUBLIC
Type
F PROC
Valu
0000
Attr
CODESG
Figura 23-8
Paso de parmetros
Class
'CODE'
Global
Length=000F
Stop
0007FH
00083H
OOOBEH
429
P23MAIN6+P23SUB6
Length
00080H
00004H
0002FH
ame
STACKSG
DATASG
CODESG
0009:0000
Class
STACK
DATA
CODE
Figura 23-8
(continuacin)
El 4, conocido como valoree la operacin pop, contiene el nmero de bytes en los parmetros que
se pasan (en este caso dos parmetros de una palabra cada uno). La operacin RET suma el valor
de la operacin pop al SP, corrigindolo a 80H. En efecto, puesto que los parmetros en la pila ya
no se necesitan, la operacin los deshecha y regresa correctamente al programa que llama. Note
que las operaciones POP y RET incrementan el SP, pero en realidad no borran el contenido de la
pila.
Si sigue las reglas generales estudiadas en este captulo debe ser capaz de enlazar un programa que conste de ms de dos mdulos ensamblados y hacer que los datos sean conocidos en todos
los mdulos. Pero tenga cuidado del tamao de la pila: para programas grandes, definirlo de 64
palabras podra ser una precaucin sensata, a causa de que podran tener muchas operaciones
PUSH y CALL.
El captulo 24 trata algunos conceptos importantes sobre la administracin de la memoria y
la ejecucin de programas traslapados. El captulo 26 proporciona caractersticas adicionales de
los segmentos, incluyendo la definicin de ms de un segmento de cdigo o de datos en el mismo
mdulo ensamblado y el uso de GROUP para combinarlos en un segmento comn.
E N L A C E DE P R O G R A M A S EN P A S C A L Y EN L E N G U A J E E N S A M B L A D O R
Esta seccin explica cmo enlazar un programa Pascal a un subprograma en lenguaje ensamblador.
El sencillo programa en Pascal de la figura 23-9, se enlaza a un subprograma en lenguaje ensamblador
cuyo propsito es slo colocar el cursor. El programa Pascal est compilado para producir un
mdulo .OBJ y el programa en lenguaje ensamblador est ensamblado para producir un mdulo
.OBJ. Entonces el enlazador combina estos dos mdulos .OBJ en un mdulo ejecutable .EXE.
El programa Pascal define dos variables llamadas t e m p r o w y t e m p c o l y acepta desde el
teclado, los valores de rengln y columna, para estas dos variables. El programa define el nombre
del subprograma en lenguaje ensamblador como s e t c u r s y define los dos parmetros como extern.
Enlace de subprogramas
430
program p23pascal
procedure
input,
set_curs(
output
const
const
row:
col:
Captulo 2 3
) ;
integer;
integer );
extern;
var
temp_row:
temp_col:
integer;
integer;
begin
write( 'Enter cursor row:
readln ( temp_row ) ;
'
);
'
) ,-
TITLE
23SETCUR
Subprograma
PUBLIC SET CURS
SET_CURS:
Parmetros
pasados:
ensamblador
Coloca el
Rengln
Columna
Nada
MOV
MOV
S I , [BP+8]
D H , [SI]
;SI a p u n t a al r e n g l n
,-Mueve a l r e n g l n D H
MOV
MOV
S I , [BP+6]
D L , [SI]
;SI a p u n t a a la c o l u m n a
,-Mueve l a c o l u m n a a l D H
MOV
MOV
INT
AH,02H
BH,0
10H
POP
RET
ENDP
ENDS
END
BP
4
;Regresa
Figura 23-9
por
Pascal
Regresados:
CODESEG
S E G M E N T PARA PUBLIC 'CODE'
SET_CURS PROC
FAR
ASSUME CS:CODESEG
PUSH
BP
:Registro
MOV
BP,SP
;Apunta a
SET_CURS
CODESEG
llamado
donde
fue
el
se
que
se
pasa
pasan
cursor
llamado
set_curs(
temp_row,
temp_col
);
Los valores guardados en la pila son: el apuntador a la pila del programa que llama, el
apuntador al segmento de regreso, el desplazamiento de regreso y la direccin de los dos parmetros
que se pasaron. En seguida se muestran los desplazamientos para cada entrada en la pila:
00
02
04
06
08
431
Ya que el subprograma en lenguaje ensamblador tiene que usar el registro BP, usted tiene
que guardar en la pila el BP para conservar su direccin para el regreso al programa Pascal. Note que
los pasos en el subprograma llamado son similares a los del programa de la figura 23-7.
Por lo regular, el registro SP direcciona entradas en la pila. Pero como usted no puede
utilizar SP para actuar como un registro de ndices, el paso despus de guardar en la pila el BP es
mover la direccin del SP en el BP, lo que le permite usar el BP como un registro de ndice para
accesar las entradas en la pila de la estructura.
El siguiente paso es accesar las direcciones de los dos parmetros en la pila de la estructura.
El primer parmetro que se pasa, el rengln, est en el desplazamiento 08H en la pila de la
estructura y puede ser accesado por BP + 08H. El segundo parmetro pasado, la columna, est en
el desplazamiento 06H y puede ser accesado por BP + 06H.
Cada una de las dos direcciones en la pila de la estructura tiene que ser transferida a uno de
los registros de ndice disponibles: BX, DI o SI. Este ejemplo utiliza [BP+08] para mover la
direccin del rengln al SI y despus utiliza [SI] para mover el contenido del parmetro pasado al
registro DH.
La columna es transferida al registro DL de manera similar. Despus el subprograma utiliza
el rengln y la columna en el registro DX en la INT 10H para colocar el cursor. Al salir, el
subprograma remueve de la pila el BP. La instruccin RET necesita un valor del operando que es
dos veces el nmero de parmetros; en este caso, 2 x 2, o 4. De manera automtica, los nmeros
son removidos de la pila y el control se transfiere de regreso al programa que realiz la llamada.
Si usted cambia un registro de segmento, asegrese de guardar en la pila (PUSH) la entrada
y de removerla de la pila (POP) al salir del subprograma. La prctica recomendada en Pascal es
conservar los registros DI, SI, BP, DS y SS. Tambin puede utilizar la pila para pasar valores
desde un subprograma a un programa que realiza la llamada. Aunque el subprograma de la figura
23-9 no regresa valores, Pascal esperara que un subprograma los regrese como una sola palabra
en el AX o como un par de palabras en el DX:AX.
Este programa trivial produce un mdulo mayor de 20K bytes. Un lenguaje compilador
suele generar considerablemente ms, sin que importe el tamao del programa fuente.
No suponga que otras versiones de Pascal necesariamente, siguen las convenciones que hemos utilizado aqu. La norma adecuada es la descrita en el manual del compilador, por lo regular
en una seccin cuyo ttulo empieza con "Interfacing . . . " o "Mixed Languages . . . " .
E N L A Z A N D O P R O G R A M A S EN C Y EN L E N G U A J E E N S A M B L A D O R
El problema con la descripcin del enlace de programas en C a programas en lenguaje ensamblador
es que las versiones d C tienen diferentes convenciones. (Para los requerimientos precisos,
consulte su manual de C.) Algunos puntos de inters son los siguientes:
Para versiones de C que son sensibles al uso de maysculas y minsculas, el nombre de los
mdulos en lenguaje ensamblador debe ser escrito exactamente igual que en la referencia
del programa en C.
432
Enlace de subprogramas
Captulo 2 3
La mayora de las versiones de C pasan los parmetros a la pila en una secuencia inversa
que la de otros lenguajes. Por ejemplo, considere la instruccin en C
A d d s (m, n) ,-
BP
MOV
BP,SP
MOV
D H , [BP + 4]
MOV
D L , [BP+S]
POP
BP
RET
Algunas versiones de C necesitan que un mdulo en ensamblador que cambia los registros
DI y SI los guarde en la pila al entrar y los saque al salir del subprograma en ensamblador.
El mdulo en ensamblador debe regresar los valores, si se necesitan, como una palabra en
el AX o dos palabras en el par DX:AX.
En algunas versiones de C, un programa en ensamblador que pone en uno la bandera DF
debe ponerla en cero (CLD) antes de regresar.
Cmo enlazar Microsoft C con Microsoft Assembler (C y ensamblador de Microsoft)
Convencin de nombres. En C y ensamblador de Microsoft, los mdulos de lenguaje
ensamblador deben usar una convencin de nombres de segmentos y variables compatible con la
de C. Todas las referencias del ensamblador a funciones y variables en el mdulo de C deben
iniciar con un carcter de subrayado (_). Adems, como C es sensible a maysculas y minsculas,
el mdulo en ensamblador debe utilizar el mismo tipo (maysculas o minsculas) para cualquier
nombre de variable en comn con el mdulo de C.
Registros. El mdulo en lenguaje ensamblador debe conservar los valores originales en
los registros BP, SP, CS, DS, SS, DI y SI.
Paso de parmetros.
1. Por referencia, ya sea como cercano (un desplazamiento en el segmento por omisin) o
como lejano (un desplazamiento en otro segmento). El mdulo ensamblador llamado puede
alterar directamente el valor definido en el mdulo de C.
2. Por valor, en el que el llamador en C pasa una copia de la variable a la pila. El mdulo en
ensamblador llamado puede alterar los valores pasados, pero no tiene acceso al valor original
de C. Si existe ms de un parmetro, C los guarda en la pila de derecha a izquierda.
433
TIPO DE DATO EN C
char
unsigned short/int
int, short
unsigned long
long
DB
DW
DW
DD
DD
BYTE
WORD
SWORD
DWORD
SWORD
REGISTRO
char
short, near, int (16 bits)
short, near, int (32 bits)
long, far (16 bits)
long, far (32 bis)
AL
AX
EAX
DX:AX
EDX:EAX
Al regresar de un mdulo llamado, emita RET sin ningn valor removido de la pila.
Compilacin y ensamblado. Utilice el mismo modelo de memoria para ambos lenguajes.
El enunciado .MODEL de ensamblador indica la convencin en C, como .MODEL SMALL,C.
Tambin utilice el interruptor de ensamblador apropiado para conservar el tipo (no local) de
nombres.
Segmentos. El segmento de cdigo debe ser llamado TEXT. El segmento de datos (dos,
si se necesitan) son llamados DATA para datos que se inicializarn a la entrada del bloque y
_BSS para datos no inicializados.
Convencin de nombres. Los mdulos de Turbo Assembler deben utilizar la convencin
de nombres para segmentos y variables que sea compatible con la de Turbo C. Todas las referen-
Enlace de subprogramas
434
Captulo 2 3
cas a funciones y nombres en el mdulo de C deben iniciar con un carcter de subrayado (_).
Adems, como C es sensible a maysculas y minsculas, el ensamblador debe utilizar el mismo
tipo de letra (maysculas o minsculas) para cualesquiera nombres de variables en comn con el
mdulo de C.
Registros. El mdulo en ensamblador puede utilizar libremente los registros AX, BX,
CX, DX, ES y de las banderas. Tambin puede emplear los registros BP, SP, CS, DS, SS, DI y
SI, siempre y cuando los guarde (en la pila) y los restaure (los remueva de ella).
Paso de parmetros. Turbo C pasa los parmetros por valor. Si hay ms de un parmetro,
Turbo los guarda en la pila de derecha a izquierda.
Regreso. El programa en ensamblador slo utiliza RET (sin valor de la operacin pop)
para regresar al mdulo en C. El mdulo en C lo saca de la pila al regresar.
Ejemplo de un programa C
La figura 23-10 ilustra el enlace de un programa en Turbo C con un mdulo en ensamblador. El
programa realiza las mismas acciones que el de Pascal de la seccin anterior: el programa C
acepta valores desde el teclado para el rengln y la columna y los pasa al subprograma en
ensamblador. El subprograma en ensamblador a su vez coloca el cursor y regresa al mdulo en C.
PUNTOS CLAVE
El operador para alinear le indica al ensamblador que alinee el segmento nombrado, iniciando
en una frontera particular de almacenamiento.
El operador para combinar le indica al ensamblador y al enlazador si combinan segmentos o
los mantienen separados.
Puede asignar la misma clase de segmentos relacionados de modo que el ensamblador y
enlazador los agrupen.
Una llamada (CALL) intrasegmento es cercana si el procedimiento llamado est definido o
por omisin es NEAR (cercano, dentro de 32K). Una llamada intrasegmento puede ser
lejana si es a un procedimiento lejano dentro del segmento.
Una llamada (CALL) intersegmento llama a un procedimiento en otro segmento y es definida
como FAR o como EXTRN.
En un programa principal que llama a un subprograma, se define el punto de entrada como
EXTRN; en el subprograma, como PUBLIC.
Si dos segmentos de cdigo van a ser enlazados en un segmento, defnalos con el mismo
nombre, la misma clase y el tipo combinar PUBLIC.
Por lo general es ms fcil (pero no necesario) definir datos comunes en el programa principal.
El programa principal define los datos comunes como PUBLIC y el subprograma (c
subprogramas) define los datos comunes como EXTRN.
435
Preguntas
#include
<stdio.h>
int main
/
(void)
int temp_row,
temp col/
TEXT
DGROUP
_set
PUBLIC
curs PROC
PUSH
MOV
MOV
MOV
MOV
MOV
INT
POP
RET
set curs ENDP
_TEXT
ENDS
END
/Parmetros
(argumentos)
set curs
NEAR
BP
BP, SP
AH, 02H
BX, 0
DH, ROW
DL, COL
10H
BP
/Restaura BP
/Regresa a donde
Figura 23-10
fue llamado
Enlace de C a ensamblador
PREGUNTAS
23-1. Proporcione cuatro razones para organizar un programa en subprogramas. Las tres preguntas siguientes se refieren al formato general para la directiva SEGMENT:
nom_seg
SEGMENT
[alinear]
[combinar]
['clase']'
23-2. (a) Para la opcin alinear de la directiva SEGMENT, cul es el valor por omisin? (b) Cul es el
efecto de la opcin BYTE? (Esto es, qu accin toma el ensamblador?)
436
Enlace de subprogramas
Captulo 2 3
23-3. (a) Para la opcin combinar de la directiva SEGMENT, cul es el valor por omisin? (b) Cundo
usara la opcin PUBLIC? (c) Cundo usara la opcin COMMON?
23-4. (a) Cul debe ser la opcin de clase del segmento de cdigo para la directiva SEGMENT? (b) Dos
segmentos tienen la misma clase, pero no la opcin combinar PUBLIC. Cul es el efecto de esto? (c)
Dos segmentos tienen la misma clase y la opcin combinar PUBLIC. Cul es el efecto de esto?
23-5. Distinga entre una llamada intrasegmento y una llamada intersegmento.
23-6. Un programa llamado MAINPRO llama a un subprograma llamado SUBPRO. (a) Qu instruccin
en MAINPRO informa al ensamblador que el nombre SUBPRO est definido fuera de su propio
ensamble? (b) Qu instruccin en SUBPRO es necesaria para hacer conocer su nombre a MAINPRO?
23-7. Suponga que MAINPRO en la pregunta 23-6 ha definido variables llamadas QTY como DB, VALU
como DW y PRICE como DW. SUBPRO divide VALU entre QTY y el cociente se almacena en
PRICE. (a) Cmo informa MAINPRO al ensamblador que las tres variables son conocidas fuera de
este ensamble? (b) Cmo informa SUBPRO a! ensamblador que las tres variables estn definidas en
otro ensamble?
23-8. Combine las preguntas 23-6 y 23-7 en un programa que funcione y prubelo.
23-9. Corrija la pregunta 23-6 de modo que MAINPRO pase las tres variables como parmetros. Sin
embargo, observe que SUBPRO regresa el precio calculado intacto en su parmetro.
23-10. Extienda la pregunta 23-9 de modo que MAINPRO acepte cualquier cantidad y nmero desde el
teclado, el subprograma SUBCONV convierta las cantidades ASCII a binario, el subprograma
SUBCALC calcule el precio y el subprograma SUBDISP convierta el precio binario a ASCII y
despliegue el resultado.
CAPTULO 24
Administracin de la memoria
del DOS
OBJETIVO
D e s c r i b i r el p r o c e s o de a r r a n q u e , la inicializacin del D O S , el
prefijo d e s e g m e n t o d e p r o g r a m a , e l e n t o r n o ( a m b i e n t e ) , control
de m e m o r i a , el cargador de programas y los programas residentes.
INTRODUCCIN
Este captulo describe en detalle la organizacin del DOS. Las operaciones introducidas son
la funcin 4A01H de la INT 2FH del DOS, la interrupcin de multiplexin, y estas funciones de la
INT 21H:
25H
31H
3306H
34H
35H
48H
49H
4AH
4BH
51H
52H
58H
438
Captulo 24
Direccin
de Inicio
FOOOOH
EOOOOH
DOOOOH
COOOOH
BOOOOH
AOOOOH
xxxxOH
xxxxOH
xxxxOH
00500H
00400HOOOOOH
Nota:
Contenido
rea
ROM
ROM
ROM
del
sistema
BIOS
BIOS
ROM
BIOS
Bffers de video
Bffers de video
Porcin transitoria
de
C0MMAND.COM,
en
el
tope de
la
RAM
Programas de usuario
Programas residentes
(si h a y a l g u n o )
Porcin residente de C0MMAND.COM
MSDOS.SYS e 10.SY
rea de comunicacin del DOS
rea de datos del BIOS
Tabla de d i r e c c i o n e s de_J.nterrupcin
La
memoria
convencional
El
rea
de
la
memoria
superior
El
rea
de
la
memoria
alta
es
de
La
memoria
64K
y va
de
va
FFFFOH
extendida
est
Figura 24-1
de
OOOOOH
va
(HMA
de
por
AOOOOH
AOOOOH
sus
siglas en
FFFFFH.
arriba
de
(640K) .
a FFFFOH
HMA.
Mapa de la memoria
(un
ingls)
mega).
439
COMMAND.COM
REA DE M E M O R I A ALTA
El procesador utiliza varias lneas de direcciones para accesar la memoria. Para el 80286 y
posteriores, la lnea nmero A20 puede direccionar un espacio de 64K conocido como rea de
memoria alta (HMA) desde F F F F : 10H hasta FFFF:FFFFH, justo abajo del lmite de un megabyte
del DOS.
Cuando la computadora corre en modo real (8086), por lo regular deshabilita la lnea A20
de modo que las direcciones que pasan este lmite "dan la vuelta" al inicio de la memoria.
Habilitar la lnea A20 permite direccionar localidades en la HMA. Desde DOS 5.0, puede indicar
al CONFIG.SYS que reubique el DOS de memoria baja en el HMA, y por tanto libere espacio
para los programas del usuario. Puede utilizar la funcin 3306H (obtener versin del DOS) de la
INT 21H para determinar la presencia del DOS en el HMA:
MOV
AX,3306H
INT
21H
/Llama al DOS
BL
BH
DL
DH
=
=
=
=
La INT 2FH del DOS (interrupcin de multiplexin), entre otros servicios, tambin proporciona
una verificacin (por medio de la funcin 4A01H) del espacio disponible en el HMA:
MOV
AX.4A01H
INT
2FH
, Llama al DOS
Direccin de terminacin
Manejador de Ctrl+Break
Deteccin de error en lectura/escritura en disco o incorrecta imagen de la
memoria de la FAT
Termina pero permanece residente (TSR; residente en memoria)
Administracin d e l a m e m o r i a d e l D O S
440
Captulo 2 4
04-09H
OA-ODH
OE-11H
12-15H
16-17H
18-2BH
2C-2DH
2E-31H
32-33H
34-37H
38-4FH
50-51H
52-5BH
5C-6BH
6C-7FH
80-FFH
441
01
01
01
00
02
FF
DISPOSITIVO
MANEJADOR
Consola
Consola
Consola
C O M (puerto serial)
Impresora
No asignado
0
1
2
3
4
5
DISPOSITIVO
AH,67H
;Peticin de manejadores
MOV
BX.count
;Nuevo nmero
INT
21H
;Llama al DOS
(20 a 65,535)
La cantidad de memoria requerida es un byte por cada manejador, redondeado al siguiente byte de
prrafo ms 16 bytes. La operacin crea la nueva tabla de manejadores fuera del PSP y actualiza
las localidades 32H y 34H del PSP. Una operacin no vlida pone en uno la bandera de acarreo y
coloca un cdigo de error en el AX.
PSP 2C-2DH: Direccin del segmento de entorno
Cada programa cargado para ejecucin tiene un entorno (ambiente) relacionado que el DOS almacena en la memoria, iniciando en una frontera de prrafo antes del segmento de programa. El
tamao por omisin es de 160 bytes, con un mximo de 32K. El entorno contiene comandos del
DOS como COMSPEC, PATH, PROMPT y SET que son aplicables al programa.
PSP 5C-6BH: FCB #1 estndar no abierto
El DOS formatea esta rea con un FCB # 1 , ficticio o real, con base en los caracteres (si hay) que
usted ingres despus de una peticin para el nombre de un programa que ser ejecutado, como
MASM D:PROGRAMl. ASM. El FCB #1 contiene el primer (o nico) nombre de archivo ingresado.
Administracin d e l a m e m o r i a d e l D O S
442
Captulo 2 4
00
20
20
20
20
20
20
20
20
20
20
20
...
00
20
20
20
20
20
20
20
20
20
20
20
...
8OH DTA:
0D
...
FCB 1 y FCB #2: Ambos son FCB ficticios. El primer byte de cada uno, 00H, se refiere
al nmero de unidad por omisin. Los bytes subsecuentes para el nombre y la extensin del
archivo estn en blanco, ya que el usuario no ingres texto despus del nombre del programa
tecleado.
DTA: El primer byte contiene el nmero de bytes tecleados despus del nombre CALCIT,
sin incluir el carcter Enter. Ya que no tecle algo ms despus del Enter, el nmero es cero. El
segundo byte contiene el carcter Enter 0DH, que fue presionado.
Ejemplo 2: Comando con operando de texto. Suponga que el usuario necesita ejecutar un
programa llamado COLOR y pasar un parmetro "BY" que le indica al programa poner azul (B)
sobre fondo amarillo (Y). El usuario teclea el nombre del programa seguido por el parmetro:
COLOR BY. Entonces el DOS coloca lo siguiente en el PSP:
5CH FCB #1:
00
42
59
20
20
20
20
20
20
20
20
20
...
00
20
20
20
20
20
20
20
20
20
20
20
...
8OH DTA:
03
20
42
59
0D
FCB til: El DOS configura el FCB #1 con 0OH como la unidad por omisin y 4259H (BY)
como el nombre del archivo. Observe que el DOS no sabe si el nombre del archivo es vlido.
DTA: Los bytes en 80H significan una longitud de 3, seguido por un espacio, "BY", y el
carcter Enter. Adems de la longitud, este campo contiene exactamente lo que se tecle.
Ejemplo 3: Comando con un operado nombre de archivo. Programas como DEL del DOS
permiten a los usuarios ingresar un nombre de archivo despus del nombre del programa. Por
ejemplo, si el usuario teclea DEL D:CALCIT.OBJ [Enter], el PSP contiene lo siguiente:
443
04 43 41 4C 43 49 54 20 20 4F 42 4A ...
C
O B J
00 20 20 20 20 20 20 20 20 20 20 20 ...
80H DTA:
OD 20 44 3A 43 41 4C 43 49 54 2E 4F 42 4A 0D ...
D
FCB # / ; El primer carcter indica el nmero de la unidad (04 = D), seguido por el
nombre del archivo, CALCIT, al que el programa hace referencia. Despus vienen dos espacios
en blanco que completan el nombre del archivo a ocho caracteres; finalmente, la extensin, OBJ.
DTA: La longitud de 13 (ODH) es seguida exactamente de lo que fue tecleado, incluyendo
el carcter Enter.
Ejemplo 4: Comando con dos operandos de nombre de archivo. Considere ingresar un
comando seguido por dos parmetros, como
COPY A:FILEA.ASM D:FILEB.ASM
01 46 49 4C 45 41 20 20 20 41 53 4D ...
F
A S M
04 46 49 4C 45 42 20 20 20 41 53 4D ...
F
80H DTA:
A S M
10 20 41 3A 46 49 4C 45 41 2E 41 53 4D 20 e t c . .
A :
F I L E A .
A S M
etc. . .
FCB 1:
FCB #2:
El primer byte, 04, se refiere a la unidad D, seguida por el nombre del archivo.
DTA: Los bytes contienen el nmero de caracteres ingresados (10H), un espacio (20H),
A:FILEA.ASM D:FILEB.ASM y el carcter Enter (ODH).
Cmo accesar el P S P
Para determinar la direccin del PSP, puede accesar sus datos para procesar archivos especificados o tomar una accin especial. Un programa .EXE no siempre puede suponer que su segmento
de cdigo sigue inmediatamente al PSP. La funcin 51H del DOS enva al registro BX la direccin del segmento del actual PSP. El cdigo siguiente obtiene la direccin del PSP y la guarda en
el registro ES:
MOV
AH,51H
INT
21H
;Llama al DOS
MOV
ES,BX
Administracin d e l a m e m o r i a d e l D O S
444
CMP
ES: BYTE
JE
EXIT
PTR[80H],0
.-Verifica
;
cero,
el
no
bfer
del
Captulo 2 4
PSP
hay datos
Para localizar el DTA para un programa .COM, slo coloque 80H en el registro SI, DI o
BX y accese su contenido:
MOV
SI,80H
.Direccin
CMP
BYTE
.-Verifica
JE
EXIT
PTR[SI,0
cero,
del
el
no
DTA
bfer
(DS:SI)
hay datos
P24ATTRB
CODESG
SEGMENT
ASSUME
BEGIN:
(.COM)
"Fija
el
atributo
carcter
del
archivo
en
normal'
PARA
CS:CODESG
ORG
100H
MOV
AL,ODH
,-Busca
MOV
CX, 21
,-Nmero
MOV
DI,82H
.-Direccin
REPNZ
SCASB
,-Busca
JNZ
***
,-No
DEC
DI
;Encontrado:
de
el
MOV
BYTE
AH,43H
,-Peticin
MOV
AL, 01
MOV
CX, 00
,- a n o r m a l
MOV
DX,82H
,-Cadena
INT
21H
;Llama
JC
***
/Error
PTR
[DI],0
inicial
con
00H
para
establecer
atributo
ASCIIZ
de
PSP
error
;Reemplazarlo
al
en
Enter
encontrado,
MOV
(Enter)
bytes
en
el
PSP
DOS
escritura?...
ENDS
END
BEGIN
BLOQUES DE MEMORIA
El DOS permite que cualquier nmero de programas sean cargados y permanezcan residentes.
Ejemplos de esto incluyen a RAMDISK, MOUSE y SIDEKICK. El DOS configura uno o dos
bloques de memoria para cada programa cargado. Precediendo de manera inmediata a cada bloque de memoria est un encabezado de arena (o registro de control de memoria) empezando en
una frontera de prrafo y que contiene los campos siguientes:
Bloques de memoria
00-00H
01-02H
03-04H
05-07H
08-OFH
445
Cdigo, en donde 4DH ('M') significa que ms bloques a continuacin y 5AH
( ' Z ' ) significa cero bloques a continuacin (el ltimo bloque). (sta es una interpretacin til, pero no es necesariamente la intencin original.)
Direccin del segmento del PSP del propietario. 0800H significa que el segmento pertenece al MSDOS.SYS y 0000H significa que est liberado y disponible.
Longitud del bloque de memoria, medida en prrafos.
Reservada.
Nombre de archivo del propietario, en formato ASCIIZ (desde el DOS 4.0).
Una lista enlazada hacia adelante conecta los bloques de memoria. El primer bloque de memoria,
configurado y apropiado por el MSDOS.SYS, contiene: los bfers de archivo del DOS, los FCB
usados por funciones de manejadores de archivos y controladores de dispositivos cargados por los
comandos DEVICE en el CONFIG.SYS.
El segundo bloque de memoria es la parte residente del C O M M A N D . C O M con su propio
PSP. Unos cuantos programas especiales, como FASTOPEN y SHARE, pueden ser cargados
antes del C O M M A N D . C O M .
El tercer bloque de memoria es el entorno maestro que contiene el comando COMSPEC, los
comandos PROMPT, los comandos PATH y las cadenas que se establecen por medio de SET.
Los bloques sucesivos incluyen cualesquiera programas residentes (TSR) y el programa
actual que se est ejecutando. Cada uno de estos programas tiene dos bloques; el primero es una
copia del entorno y el segundo es un segmento de programa con el PSP y el mdulo ejecutable.
INT 21H, funcin 52H: Obtiene direccin de la lista interna del DOS
El encabezado de arena para el primer bloque de memoria que pertenece a MSDOS.SYS puede
ser localizado por medio de una caracterstica no documentada: la INT 21H, funcin 52H. La
tabla de direcciones del DOS inicia con estas entradas:
OOH
04H
08H
OCH
DD
DD
DD
DD
Direccin
Direccin
Direccin
Direccin
La funcin 52H regresa la direccin del segmento de la lista de tablas de archivos del DOS (la
segunda entrada) en el ES y un desplazamiento en el BX. Por tanto ES:[BX-4] apunta a la entrada
precedente, que es una palabra doble en formato IP:CS que contiene la direccin del primer
encabezado de arena.
Para encontrar los bloques de memoria subsecuentes en la cadena:
1. Utilice la direccin del encabezado de arena para el bloque de memoria.
2. Sume 1 a la direccin del segmento del encabezado de arena para obtener el inicio de su
bloque de memoria. (El tamao del encabezado de arena es de 10H bytes.)
3. Sume la longitud del bloque de memoria, que se encuentra en los desplazamientos 03-04H
del encabezado de arena.
Para determinar los prrafos de memoria disponible para el ltimo programa, encuentre el
encabezado de arena que contiene " Z " en el byte O y realice los clculos anteriores. El ltimo
bloque tiene disponible, para l, todo la memoria superior restante.
Administracin d e l a m e m o r i a d e l D O S
446
Captulo 2 4 j
1
i
:
Ejemplo de r a s t r e o de bloques de m e m o r i a
Si utiliza DEBUG para rastrear por los bloques de memoria en su propio sistema, puede utilizar el j
comando H (hexadecimal) de DEBUG para aritmtica hexadecimal. selo as:
j
j
H valorl,valor2
'i
i
El comando H regresa la suma y la diferencia de los dos nmeros.
j
Para el ejemplo siguiente, DEBUG despliega el contenido de la memoria requerida. Tenga j
cuidado con la secuencia inversa de byte. El rastreo procede como se muestra a continuacin:
j
i
1. La funcin 52H regres 02CC[0] en el ES y 0026H en el BX. Como queremos cuatro bytes
a la izquierda de 0022H, utilice D 02CC:22 para desplegar la direccin del encabezado de
arena para el primer bloque de memoria en el formato IP:CS. Esto produce 00 00 56 0B.
Por lo tanto la direccin es 0B56[0].
2. Utilice D B56:0 para desplegar el primer encabezado de arena:
0
4D
AE
05
. . .
I
j
]
4D ("M") significa que siguen ms bloques de memoria; 0800 (0008H) indica que el bloque ]
de memoria pertenece a MSDOS.SYS, y AE05 (05AEH) es la longitud del bloque de memoria. 1
i
3. Localice el segundo encabezado de arena (COMMAND.COM):
B56[0]
+ l [0]
+ 5AE [ 0 ]
1105 [0]
]
j
1
i
06
1 1
64
0 1
. . .
1
|
j
En este momento, tambin podra examinar el contenido de C O M M A N D . C O M .
4. Localice el tercer encabezado de arena, el entorno maestro:
Localidad del encabezado de arena anterior:
1105[0]
Sume 1 prrafo:
+ l [0]
Sume la longitud de este bloque de memoria: + 164 [0]
j
j
i
126A [0]
j
i
447
INT
;Llama al DOS
21H
448
Captulo 24
AX.5803H
;Peticin
MOV
BX,linkflag
enlazar/desenlazar
INT
21H
rea
de
para
memoria
superior
CARGADOR DE PROGRAMA
Al cargar programas .COM y .EXE, el DOS realiza lo siguiente:
1. Configura bloques de memoria para el entorno y el segmento del programa.
2. Crea un prefijo de segmento de programa en su localidad 00H y carga el programa en 100H.
Adems de stos, los pasos de carga y ejecucin difieren para programas .COM y .EXE.
Una diferencia principal es que el enlazador inserta un registro de encabezado especial en un
archivo .EXE cuando lo almacena en disco; el cargador del DOS utiliza este registro para realizar
el cargado.
v
449
Cargador de programa
CS, DS, ES, SS
direccin del segmento
desplazamiento IP(100H)
programa
.COM
1<desplazamiento
Figura 24-2
SP
programa precede a los programas .COM y .EXE cargados en memoria. Los primeros dos bytes
del PSP contienen la instruccin INT 20H (regreso al DOS). Al cargar un programa .COM, el
DOS:
Establece los cuatro registros de segmento con la direccin del primer byte del PSP.
Establece el apuntador de la pila (SP) al final del segmento de 64K, desplazamiento FFFEH
(o al final de la memoria si el segmento no es lo bastante grande) y guarda en la pila una
palabra con ceros.
Establece el apuntador de instrucciones en 100H (el tamao del PSP) y permite controlar
para proceder a la direccin generada por CS:IP, la primera localidad inmediata posterior al
PSP. ste es el primer byte de su programa y debe contener una instruccin ejecutable. La
figura 24-2 ilustra esta inicializacin.
Carga y ejecucin de un programa .EXE
El enlazador almacena en disco un mdulo .EXE que consta de dos partes: un registro de encabezado que contiene informacin de control y de reubicacin, y el mdulo cargado real.
El encabezado es un mnimo de 512 bytes y puede ser ms grande si hay muchos elementos
reubicables. El encabezado contiene informacin acerca del tamao del mdulo ejecutable, dnde
ser cargado en memoria, la direccin de la pila y los desplazamientos de reubicacin que sern
insertados para direcciones incompletas de mquina. En lo que sigue, el trmino bloque se refiere
a un rea de 512 bytes en memoria.
00-01H 4D5A hex ( ' M Z ' ) identifica un archivo .EXE.
02-03H Nmero de bytes en el ltimo bloque del archivo .EXE.
04-05H Tamao del archivo, incluyendo el encabezado, en incrementos de bloque de 512
bytes. Por ejemplo, si el tamao es 1,025, este campo contendra 2 y 02-03H contendra 1.
06-07H Nmero de elementos en la tabla de reubicacin (vase 1CH).
08-09H Tamao del encabezado, en incrementos de 16 bytes (prrafo), para ayudar al
DOS a localizar el inicio del mdulo ejecutable que sigue al encabezado. El nmero mnimo
es 20H (32) (32 x 16 = 512 bytes).
0A-0BH Conteo mnimo de prrafos que deben residir por arriba del final del programa
cuando es cargado,
0C-0DH Interruptor de cargar alta/baja. Cuando est enlazado, usted decide si el programa,
para su ejecucin, se carga en una direccin de memoria baja (lo usual) o en una alta. El
nmero 0000H indica alta. De otra forma, esta localidad contiene el conteo mximo de
prrafos que deben residir por arriba del final del programa cargado.
0E-0F Desplazamiento en el mdulo ejecutable del segmento de la pila.
Administracin d e l a m e m o r i a d e l D O S
450
Captulo 2 4
D S , ES^ -
PSP
CS:IP
SS
Segmento
de
cdigo
Segmento
de
datos
Segmento
de
la
pila
<- D e s p l a z a m i e n t o
SP
451
or de programa
Despus de lo anterior, el DOS ha terminado con el encabezado y los desecha. Los registros
CS y SS estn correctamente establecidos, pero su programa tiene que establecer el DS (y ES) para
su propio segmento de datos:
MOV
AX, datasegname
MOV
DS,AX
MOV
ES,AX
registros DS y ES
Stop
Length
ame
Class
00000H
0003AH
003BH
CSEG
Code
00040H
0005AH
001BH
DSEG
Data
00060H
0007FH
0020H
STACK
Stack
El mapa proporciona la localidad relativa (no real) de cada uno de los tres segmentos. Observe
que algunos enlazadores los acomodan en orden alfabtico de nombre. De acuerdo con el mapa, el
segmento de cdigo (CSEG) inicia en 00000H; su posicin relativa es el inicio del mdulo ejecutable y su tamao es de 003BH bytes. El segmento de datos, DSEG, inicia en 00040H y tiene un
tamao de 001BH. sta es la primera direccin a continuacin de CSEG que se alinea con una
frontera de prrafo (una frontera es divisible entre 10H). El segmento de la pila, STACK, inicia
en 00060H, la primera direccin a continuacin de DSEG que se alinea en una frontera de prrafo.
DEBUG no puede desplegar un registro de encabezado despus de que un programa es
cargado para su ejecucin. El DOS reemplaza el registro del encabezado con el PSP. Sin embargo, existen varios programas de utileras en el mercado (o puede escribir el suyo) que permiten
ver el contenido hexadecimal de cualquier sector de disco. El encabezado para el programa que
estamos examinando contiene la siguiente informacin relevante, de acuerdo con su localidad
hexadecimal (el contenido de los campos est en secuencia inversa de byte):
OOH
02H
04H
06H
08H
OCH
OEH
10H
14H
16H
18H
Administracin d e l a m e m o r i a d e l D O S
452
Captulo 2 4
Cuando DEBUG carg este programa, el registro contena los valores siguientes:
S P
0 0 2 0
DS
1 3 8 F
ES
1 3 8 F
SS
13A5
CS
1 3 9 F
IP
0 0 0 0
Para mdulos .EXE, el cargador coloca la direccin del PSP en el DS y ES y en CS, IP, SS
y SP los valores del registro del encabezado. Veamos ahora cmo el cargador inicializa estos
registros.
Registro CS
De acuerdo con el registro DS, cuando el programa se carg, la direccin del PSP era 138F[0]H.
Ya que el PSP es de 100H de tamao, el mdulo ejecutable sigue inmediatamente a 139F[0]H,
que el cargador inserta en el registro CS:
Direccin inicial del PSP (vase DS):
Tamao del PSP:
138F0H
+ 100H
139F0H
El CS proporciona la direccin de inicio de la parte de cdigo del programa (CSEG). Puede usar
el comando para desplegar de DEBUG, D CS:0000, para ver el cdigo de mquina de un programa en memoria. El cdigo es idntico a la parte hexadecimal de la impresin .LST en ensamblador,
a diferencia de los operandos que .LST marca como R.
Registro SS
El cargador us el nmero 60H en el encabezado (en 0EH) para colocar la direccin de la pila en
el registro SS:
Direccin inicial del PSP (vase DS):
Tamao del PSP:
Desplazamiento de la pila (vase localidad 0EH en el encabezado:
13 8F0H
+ 10 OH
+
6 OH
Direccin de la pila:
13A5 0H
Registro SP
El cargador us 20H del encabezado (en 10H) para inicializar el apuntador de la pila al tamao de
la pila. En este ejemplo, la pila fue definida como 16 DUP(?), esto es, 16 campos de dos bytes =
32, o 20H. El SP apunta al tope actual de la pila.
Registro DS
El cargador usa el registro DS para establecer el punto de inicio para el PSP en 138F[0]. Puesto
que el encabezado no contiene una direccin inicial para el DS, su programa tiene que inicializarla:
0 0 0 4
0 0 0 7
B8
SE
R
D8
MOV
AX,DSEG
MOV
D S , A X
453
El ensamblador deja sin llenar la direccin de mquina de DSEG, que se convierte en una entrada
en la tabla de reubicacin en el encabezado, tratada anteriormente. DEBUG muestra la instruccin completada como
B8 A313
13 9F0H
4 OH
Direccin DS:
13A30H
DIRECCIN
MAPA DE DESPLAZAMIENTO
CS
139F[0]H
OOH
DS
13A3[0]H
40H
SS
13AS[0]H
SOH
Como ejercicio, rastree cualquiera de sus programas .EXE enlazados con DEBUG y observe los datos cambiados en los registros:
INSTRUCCIN
REGISTROS CAMBIADOS
MOV
AX, DSEG
IP y AX
MOV
DS,AX
IP y DS
MOV
ES,AX
IP y ES
El DS ahora contiene la direccin correcta del segmento de datos. Puede usar D DS:00 para ver
el contenido de DSEG y usar D SS:00 para ver el contenido de la pila.
A S I G N A C I N Y L I B E R A C I N DE M E M O R I A
Los servicios del DOS le permiten asignar, liberar y modificar el tamao de un rea de memoria. Los
usos ms comunes para estos servicios son con los programas residentes y programas que cargan
a otros programas para su ejecucin. Bajo el DOS, que fue diseado como un ambiente de un solo
usuario, un programa que necesita cargar otro programa para ejecucin tiene que liberar algn
espacio de su memoria.
I N T 21H, funcin 48H: Asignacin de m e m o r i a
Para asignar memoria para un programa, solicite la funcin 48H y en el BX coloque el nmero
necesario de prrafos:
MOV
AH,48H
MOV
BX,paragraphs
,-Nmero de prrafos
INT
21H
;Llama al DOS
Administracin d e l a m e m o r i a d e l D O S
454
Captulo 2 4
A H . 4 9H
Peticin
LEA
ES,seg-address
Direccin
INT
21H
Llama
al
para
del
liberar
bloque
memoria
por
asignada
prrafos
DOS
Una operacin exitosa pone en cero la bandera de acarreo y almacena 00H en el segundo y tercer
bytes del bloque de memoria, lo que significa que ya no est en uso. Una operacin no exitosa
pone en uno la bandera de acarreo y regresa en el AX un cdigo de error (07 = bloque de
memoria destruido o 09 = direccin no vlida de bloque de memoria).
INT 21H, funcin 4AH: Modifica el bloque de memoria asignada
La funcin 4AH puede aumentar o disminuir el tamao de un bloque de memoria. Inicialice el BX
con el nmero de prrafos conservados para el programa y el ES con la direccin del PSP:
MOV
AH,4AH
,Peticin
MOV
BX,paragraphs
;Nmero
LEA
ES, PSP-address
,-Direccin
INT
21H
; Llama
de
al
para
modificar
la
memoria
asignada
prrafos
del
PSP
DOS
Un programa puede calcular su propio tamao restando el final del ltimo segmento de la direccin del PSP. Asegrese que usa el ltimo segmento, si su enlazador reacomoda los segmentos en
orden alfabtico.
Una operacin exitosa pone en cero la bandera de acarreo. Una operacin no exitosa la pone
en uno y regresa en el AX un cdigo de error (07 = bloque de memoria destruido, 08 = memoria
insuficiente y 09 = direccin no vlida de bloque de memoria) y regresa en el BX el tamao
mximo posible (si se hizo un intento de aumentarlo). Una direccin errnea en el ES provoca un
error 07.
CARGA Y EJECUCIN DE UNA FUNCIN DE PROGRAMA
Examinemos ahora cmo hacer que un programa ejecutndose cargue y a su vez ejecute un
subprograma. La funcin 4BH permite a un programa cargar un subprograma en memoria para
ejecucin. Cargue estos registros:
455
AH, 4BH
Peticin para
cargar
MOV
AL,code
Cdigo de la funcin
LEA
BX,para-block
LEA
DX.path
INT
21H
Llama al DOS
Una operacin no vlida pone en uno la bandera de acarreo y regresa un cdigo de error en el AX.
AL = OOH: C a r g a r y ejecutar
Esta operacin carga un programa .EXE o.uno .COM en la memoria, establece un prefijo de
segmento de programa para l y le transfiere el control para la ejecucin. Como todos los registros, incluyendo la pila, son cambiados, la operacin no es para inexpertos. El bloque de parmetros
direccionado por el ES:BX tiene el formato siguiente:
DESPLAZAMIENTO
OOH
02H
06H
OAH
OBJETIVO
OOH
OBJETIVO
Administracin d e l a m e m o r i a d e l D O S
456
02H
Captulo 2 4
06H
OAH
OEH
12H
OBJETIVO
00H
02H
Un error pone en uno la bandera de acarreo y regresa un cdigo de error en el AX, como se
describi en la figura 18-1.
Programa: Cargar y ejecutar
El programa en la figura 24-4 solicita al DOS que realice el comando DIR para la unidad D. El
programa primero utiliza la funcin 4AH para reducir sus requerimientos de memoria a su tamao
real: la diferencia entre su ltimo (ficticio) segmento ZNDSEG y el inicio de su PSP. Observe que
en este momento el ES an contiene la direccin del PSP, como se carg al entrar. (Las instrucciones ASSUME anteriores y siguientes a MOV BX,SEG ZNDSEG aparecen porque son requeridas por MASM 5 . 1 , pero no por algunos otros ensambladores.) El mdulo es de 80 bytes, as
que el PSP (10H prrafos) y el programa (8 prrafos) tienen un total de 18H prrafos.
La funcin 4BH con cdigo 00 en el AL maneja la carga y ejecucin del COMMAND.COM.
El programa despliega las entradas del directorio para la unidad D.
INT 21H, funcin 4DH: Obtiene el valor de regreso del subprograma
Esta operacin recupera el valor de regreso que el ltimo subprograma envi cuando lo termin la
funcin 4CH o 31H. Los valores regresados son:
AH = Mtodo de terminacin del subprograma, en donde
00H = Terminacin normal
01H = Terminado por C t r l + C
02H = Error crtico de dispositivo
03H = Terminado por la funcin 31H (mantiene el programa)
AL = Valor de regreso desde el subprograma
TITLE
P24EXDOS
SSEG
SSEG
DSEG
PARAREA
DIRCOM
FCB1
FCB2
PROGNAM
DSEG ENDS
CSEG
BEGIN
(EXE)
Stack
SEGMENT
LABEL
DW
DW
DW
DW
DW
DW
DW
DB
DB
DB
DB
PARA 'Data'
BYTE
0
OFFSET DIRCOM
DSEG
OFFSET FCB1
DSEG
OFFSET FCB2
DSEG
17, ' /C" DIR D : , 1 3
16 DUP(O)
16 DUP(O)
'D:COMMAND. C O M , 0
SEGMENT
ASSUME
PROC
MOV
ASSUME
MOV
ASSUME
MOV
SUB
INT
JC
MOV
MOV
MOV
MOV
MOV
LEA
LEA
INT
JC
MOV
JMP
PARA C o d e
CS:CSEG,DS: DSEG,SS:SSEG,ES:DSEG
FAR
AH, 4AH
;Reduce la memoria asignada
CS:ZNDSEG
;Final del segmento
BX,SEG ZNDSEG
CS:CSEG
CX,ES
; menos inicio del
BX,CX
;
segmento del p r o g r a m a
21H
;Hay espacio suficiente?
E10ERR
AX,DSEG
;Establecer DS y ES
DS, AX
ES.AX
AH, 4BH
;Peticin para cargar
AL, 00
y ejecutar
BX,PARAREA
; COMMAND . COM
DX,PROGNAM
21H
Error en la ejecucin?
E20ERR
;OK, no hay cdigo de error
AL, 00
X10XIT
MOV
JMP
AL, 01
X10XIT
;Cdigo de error 1
MOV
JMP
AL, 02
X10XIT
/Cdigo de error 2
MOV
INT
ENDP
ENDS
AH,4CH
21H
;Peticin
para salir al DOS
,0
E10ERR:
E2 0ERR:
X10XIT:
BEGIN
CSEG
ZNDSEG
ZNDSEG
SEGMENT
ENDS
BEGIN
END
Figura 24-4
;Segmento mudo
(ficticio)
Administracin d e l a m e m o r i a d e l D O S
458
Captulo 2 4
TRASLAPE DE PROGRAMAS
El programa en la figura 24-5 utiliza el mismo servicio que el de la figura 24-4, pero esta vez slo
carga un programa en memoria sin ejecutarlo. El proceso consiste en un programa principal,
P24CALLV, y dos subprogramas, P24SUB1 y P24SUB2.
P24CALLV es el programa principal, con estos segmentos:
STACKSG
SEGMENT
PARA
STACK
'Stackl'
DATASG
SEGMENT
PARA
'Datal'
CODESG
SEGMENT
PARA
'Codel'
ZENDSG
SEGMENT
;Segmento
ficticio
(vaco)
SEGMENT
PARA
'Data2'
CODESG
SEGMENT
PARA
'Code2'
Los segmentos de P24CALLV estn ligados primero, porque sus clases difieren: ' D a t a l ' ,
'Data2', ' C o d e l ' , 'Code2' y as sucesivamente. A continuacin est el mapa de enlace para
P24C A L L V + P 2 4 S U B 1 :
Start
Stop
Length ame
Class
00000H
0007FH
00080H STACKSG
Stackl
00080H
000C2H
00043H DATASG
Datal
000D0H
0016DH
0009EH CODESG
Codel
00170H
00170H
00000H ZENDSG
00170H
00185H
00016H DATASG
Data2
00190H
001AFH
00020H CODESG
Code2
P24SUB2 tambin es llamado por P24CALLV, pero es enlazado por separado. Sus segmentos son:
DATASG
SEGMENT
PARA
'Data'
CODESG
SEGMENT
PARA
'Code'
Stop
Length ame
Class
00000H
00015H
00016H DATASG
Data
00020H
0003EH
0001FH CODESG
Code
459
Traslape de programas
TITLE
P24CALLV (EXE)
Llama a un subprograma y lo traslapa
EXTRN
P24SUB1:FAR
STACKSG
STACKSG
DATASG
PARABLK
FILENAM
ERRMSG1
ERRMSG2
ERRMSG3
DATASG
CODESG
BEGIN
SEGMENT
LABEL
DW
DW
DB
DB
DB
DB
ENDS
PARA 'Datal'
WORD
;Bloque de parmetros
0
0
F:\P24SUB2.EXE',0
'Modify mem e r r o r
'Allocate error
'
'Seg cali error
SEGMENT
PROC
ASSUME
MOV
MOV
CALL
CALL
PARA 'Codel'
FAR
CS : CODESG, DS : DATASG, SS : STACKSG
AX,DATASG
DS,AX
Q10SCR
/Recorre la p a n t a l l a
P24SUB1
L l a m a al subprograma 1
MOV
ASSUME
MOV
ASSUME
MOV
SUB
INT
JC
AH, 4AH
CS:ZENDSG
BX,SEG ZENDSG
CS:CODESG
CX, ES
BX,CX
21H
A3 0ERR
/Comprime
MOV
MOV
MOV
MOV
INT
JC
MOV
AX,DS
ES,AX
AH,48H
BX,40
21H
A40ERR
PARABLK,AX
/Inicializa ES para
/ este servicio
/Asigna memoria para
hay 40 prrafos
MOV
MOV
LEA
LEA
INT
JC
MOV
MOV
MOV
LEA
CALL
JMP
AH.4BH
AL, 03
BX,PARABLK
DX, FILENAM
21H
A50ERR
AX,PARABLK
PARABLK+ 2 , AX
PARABLK,2OH
BX, PARABLK
DWORD PTR [BX]
A90
;Carga el subprograma 2
;
sin ejecutarlo
CALL
LEA
CALL
JMP
Q20SET
DX,ERRMSG1
Q30DISP
A90
/Coloca el cursor
CALL
LEA
CALL
JMP
Q20SET
DX,ERRMSG2
Q30DISP
A90
/Coloca el cursor
la memoria
/Direccin del
salir
traslapar
A3 0ERR:
/Despliega mensaj e
A4 0ERR:
Figura 24-5
/Despliega mensaj e
Administracin d e l a m e m o r i a d e l D O S
460
Captulo 2 4
A5 0ERR:
CALL
LEA
CALL
JMP
Q2 0SET
DX,ERRMSG3
Q30DISP
A90
;Coloca
MOV
INT
ENDP
AH,4CH
21H
/ Sale
el
/Despliega
cursor
mensaje
A90 :
BEGIN
Servicio
Q10SCR
Q10SCR
Q20SET
Q20SET
Q30DISP
Q30DISP
CODESG
ZENDSG
ZENDSG
TITLE
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
NEAR
AX,0600H
BH,1EH
CX,0000
DX,184FH
10H
PROC
MOV
MOV
MOV
MOV
INT
RET
ENDP
NEAR
AH,02H
B H , 00
D H , 12
D L , 00
10H
PROC
MOV
MOV
MOV
INT
RET
ENDP
ENDS
NEAR
AH,40H
BX, 01
CX, 16
21H
SEGMENT
ENDS
END
P24SUB1
de
la
pantalla
de
video:
/Peticin para
/
c o l o c a r el c u r s o r
/Designa DX
/Peticin para
/Manejador
/Longitud
/Segmento
desplegar
(vaco)
mudo
BEGIN
Subprograma
llamado
DATAS G
SUBMSG
DATAS G
SEGMENT
DB
ENDS
PARA 'Data2
'Subprogram
CODESG
P24SUB1
SEGMENT
PROC
ASSUME
PUBLIC
PUSH
MOV
MOV
MOV
MOV
MOV
MOV
INT
MOV
MOV
MOV
PARA
Code2
FAR
CS:CODESG,DS: DATASG
P24SUB1
DS
/Guarda DS del
AX, D A T A S G
/Inicializa DS
DS, AX
/Peticin para
AH,02H
/
el c u r s o r
BH, 0 0
DH, 05
DL, 00
10H
/Peticin para
AH,40H
,-Manejador
BX, 01
/Longitud
CX, 22
Figura 24-5
1 reporting
(continuacin)
llamador
colocar
desplegar
Traslape de programas
461
LEA
INT
POP
RET
ENDP
ENDS
END
DX,SUBMSG
21H
DS
TITLE
P24SUB2
Subprograma
DATASG
SUBMSG
DATASG
CODESG
P24SUB2
SEGMENT
PROC
ASSUME
PUSH
MOV
MOV
MOV
MOV
MOV
MOV
INT
MOV
MOV
MOV
LEA
INT
POP
RET
ENDP
ENDS
END
P24SUB1
CODESG
P24SUB2
CODESG
llamado traslapado
PARA 'Code'
FAR
CS : CODESG, DS : DATASG
Guarda DS del llamador
DS
AX, CS
Establece la direccin del primer
DS,AX
segmento en DS
AH,02H
Peticin para colocar
el cursor
BH, 00
DH, 10
DL, 00
10H
Peticin para desplegar
AH,40H
Manej ador
BX, 01
Longitud
CX, 22
DX,SUBMSG
21H
Restablece el DS del llamador
DS
Figura 24-5
(continuacin)
correcta el IP, pero ya que P24SUB1 tiene su propio segmento de datos, tiene que guardar en la
pila el DS del P24CALLV y establecer su propia direccin DS. P24SUB1 coloca el cursor,
muestra un mensaje, saca de la pila el DS y regresa al P24CALLV.
Para traslapar P24SUB2 sobre P24SUB1, P24CALLV tiene que comprimir su propio espacio de memoria, ya que el DOS ha dado todo el espacio disponible. El segmento superior de
P24CALLV es ZENDSG, que est vaco. P24CALLV resta la direccin de su PSP (aun en el ES)
de la direccin de ZENDSG. La diferencia es 270H (27H prrafos), calculado como el tamao del
PSP (100H) ms el desplazamiento de ZENDSG (170H), que es enviado al DOS para la funcin
4AH.
La funcin 48H del DOS asigna entonces memoria para dejar espacio y que P24SUB2 sea
cargado (traslapado) en la parte superior de P24SUB1, puesto de manera arbitraria en 40H prrafos. La operacin regresa la direccin cargada en el registro AX, que el P24CALLV almacena en
PARABLK. Esta es la primer palabra de un bloque parmetro que utilizar la funcin 4BH. La
funcin 4BH con cdigo 03 en AL carga P24SUB2 en la memoria. Observe la definicin en el
segmento de datos: F:\P24SUB2.EXE,0. La funcin 4BH hace referencia a CS y PARABLK, la
primera palabra contiene la direccin del segmento en donde el traslape ser cargado y la segunda
palabra es un desplazamiento, en este caso cero. Un diagrama puede ayudar a aclarar estos pasos:
Administracin d e l a m e m o r i a d e l D O S
462
Despus
de la
carga
inicial
Captulo 2 4
Despus
del servicio
48H se asigna
memoria
Despus
del servicio
4 A H se comprime
la memoria
000
PSP
000
PSP
000
PSP
100
P24CALLV
100
P24CALLV
100
P24CALLV
270
P24SUB1
270
P24SUB2
La llamada (CALL) lejana a P24SUB2 requiere una referencia definida como IP:CS, pero
PARABLK est en la forma CS:IP. Por lo tanto, el valor CS es movido a la segunda palabra y
20H es almacenado en la primer palabra para el IP, ya que el mapa de enlace muestra el valor
como el desplazamiento del segmento de cdigo de P24SUB2. La siguiente instruccin carga la
direccin de PARABLK en el BX y llama a P24SUB2:
LEA
BX, P A R A B L K
CALL
DWORD
PTR
/Direccin
[BX]
/Llama
de
PARABLK
P24SUB2
Observe que P24CALLV no hace referencia a P24SUB2 por nombre en su segmento de cdigo,
as que no necesita la instruccin EXTRN especificando P24SUB2. Como P24SUB2 tiene su
propio segmento de datos, primero guarda en la pila el DS e inicializa su propia direccin. Pero
P24SUB2 no estaba enlazado con P24CALLV. Como resultado, la instruccin MOV AX,DATASG
coloca en el AX slo la direccin del desplazamiento de DATASG,0[0]H y no su direccin de
segmento. Sabemos que CALL establece CS con la direccin del primer segmento, que (de acuerdo con el mapa) produce la direccin del segmento de datos. Mover el CS al DS da la direccin
correcta en el DS. Note que si el cdigo de P24SUB2 y de los segmentos de datos estuviera en una
secuencia diferente, la codificacin tendra que ser un poco distinta.
P24SUB2 coloca el cursor, muestra un mensaje, saca de la pila el DS y regresa a P24CALLV.
DEBUG fue indispensable para desarrollar este programa.
PROGRAMAS RESIDENTES
Varios programas populares y de shareware estn diseados para residir en memoria mientras
otros corren: se puede activar sus servicios oprimiendo una secuencia especial de teclas. Se
cargan los programas residentes despus que el DOS y antes de activar otros programas de procesamiento normal. Casi siempre son programas .COM y tambin son conocidos como "programas
residentes en memoria" (TSR; termina pero permanece residente).
La parte fcil de la escritura de un programa de stos es hacer que resida. En lugar de la
terminacin normal, se sale por medio de la funcin 31H de la INT 21H (mantener el programa).
La operacin necesita el tamao del programa en el registro DX:
MOV
AH,31H
/Peticin
MOV
DX,prog-zize
/Tamao
INT
21H
para
del
TSR
programa
463
Programas residentes
La parte no tan fcil implica la activacin del programa despus de que queda residente, ya
que no es un programa interno del DOS como CLS, COPY y DIR. Un enfoque comn es modificar la tabla de servicios de interrupcin de modo que los programas residentes interrumpan
cualquier tecleo, acten sobre un tecleo especial o una secuencia de tecleos y pasen por alto otros
tecleos. El efecto es que un programa residente, por lo comn, aunque no necesariamente, conste
de las partes siguientes:
1. Una seccin que redefina las localidades en la tabla de servicios de interrupcin.
2. Un procedimiento de inicializacin que ejecuta slo la primera vez el programa y que
realiza lo siguiente:
Reemplaza la direccin en las tablas de servicios de interrupcin con su propia direccin.
Establece el tamao de la parte del programa que permanece residente.
Utiliza una interrupcin que le indica al DOS que termine la ejecucin del programa actual
y conecte a la memoria la parte especificada del programa.
3. Un procedimiento que permanezca residente y que es activado, por ejemplo, por una entrada
especial desde el teclado o, en algunos casos, por un reloj.
En realidad, el procedimiento de inicializacin configura todas las condiciones para hacer
que el programa residente funcione y despus se borre l mismo. La organizacin de la memoria
ahora aparece como sigue:
Resto de la memoria disponible
Parte del programa de inicializacin
(permanece en memoria)
COMMAND.COM
IO.SYS y MSDOS.SYS
Tabla de servicios de interrupcin
Un programa residente puede utilizar las funciones de la INT 21H para accesar la tabla de
servicios de interrupcin, puesto que no hay seguridad de que computadoras ms avanzadas tendrn la tabla de interrupcin localizada en las mismas localidades de memoria.
INT 21H, funcin 35H: Obtiene la direccin de interrupcin
Para recuperar la direccin de una interrupcin particular, cargue el AL con el nmero de la
interrupcin requerida:
MOV
AH.35H
.MOV A L , i n t #
INT
,-Peticin de interrupcin
/Nmero de interrupcin
21H
Administracin d e ! a m e m o r i a d e l D O S
464
Captulo 2 4
A H , 2 5H
MOV
AL,#nt
LEA
DX.newaddr
INT
21H
Peticin
Nmero
Nueva
de
de
direccin
de
interrupcin
interrupcin
direccin
para
la
interrupcin
Programas residentes
TITLE
BIODATA
KBSTAT
BIODATA
CODESG
465
P24TSTNM (COM)
SEGMENT AT 40H
ORG
17H
DB
?
ENDS
teclado
SEGMENT PARA
ASSUME
CS : CODESG, DS : BIODATA
ORG
100H
BEGIN:
SAVINT9
TESTNUM:
JMP
DD
INITZE
PUSH
PUSH
PUSH
AX
CX
DS
;Guarda registros
MOV
MOV
MOV
TEST
JZ
AX, BIODATA
DS, AX
AL,KBSTAT
AL,00100000B
EXIT
IN
CMP
JL
CMP
JG
AL,60H
AL, 71
EXIT
AL, 83
EXIT
MOV
OUT
MOV
OUT
MOV
OUT
IN
MOV
OR
OUT
MOV
AL,10110110B
43H, AL
AX,1000
42H,AL
AL, AH
4 2 H, AL
AL,61H
AH, AL
AL, 03
61H, AL
CX,5000
LOOP
MOV
OUT
PAUSE
AL, AH
61H, AL
;Salto a la inicializacin
el puerto
71?
83?
numrico
Activar la bocina
Fijar
duracin
PAUSE:
Desactivar
bocina
EXIT:
POP
DS
POP
CX
AX
POP
JMP
CS:SAVINT9
Rutina de inicializacin
Restablecer
Reasumir INT
registros
09H
INITZE:
CLI
MOV
MOV
INT
MOV
MOV
MOV
MOV
MOV
INT
AH,25H
AL, 09
DX,OFFSET
21H
Figura 24-6
Programa residente
la
09H
466
CODESG
MOV
MOV
STI
INT
ENDS
END
AH,31H
DX,OFFSET
INITZE
,-Peticin p a r a p e r m a n e c e r
;Fijar tamao de la parte
Captulo 24
residente
residente
BEGIN
Figura 24-6
(continuacin)
y pasar a INT9SAV, que contiene la direccin original de la INT 09H. Ahora liberamos en
control para la interrupcin.
El ejemplo siguiente ayudar a clarificar el procedimiento. Primero explicamos una operacin convencional sin un TSR interceptando la interrupcin:
1. Un usuario presiona una tecla y el teclado enva la interrupcin INT 09H al BIOS.
2. El BIOS utiliza la direccin de la INT 09H en la tabla de servicios de interrupcin para
localizar su rutina de BIOS.
3. Entonces el control se transfiere a la rutina de BIOS.
4. La rutina obtiene el carcter y (si es un carcter estndar) lo enva al bfer del teclado.
A continuacin est el proceso para el programa residente:
1. Un usuario presiona una tecla y el teclado enva la interrupcin INT 09H al BIOS.
2. El BIOS utiliza la direccin de la INT 09H en la tabla de servicios de interrupcin para
localizar su rutina de BIOS.
3. Pero ahora la tabla contiene la direccin TESTNUM, el programa residente, al cual se
transfiere el control.
4. Si NumLock est activada y el carcter es un nmero del teclado numrico, TESTNUM
hace sonar la bocina.
5. TESTNUM sale por medio de un salto a la direccin original de la INT 09H guardada, que
transfiere el control a la rutina del BIOS.
6. La rutina obtiene el carcter y (si es un carcter estndar) lo enva al bfer del teclado.
Como este programa tiene la intencin de ser ilustrativo, puede modificarlo o expandirlo
para sus propios objetivos. Algunos programas comerciales que tambin reemplazan la direccin
en la tabla de la interrupcin 09H no permiten el uso concurrente de un programa residente como
ste.
INT 21H, funcin 34H: Obtiene la direccin de la b a n d e r a ocupada del D O S
Aunque es utilizada de manera interna por el DOS, algunos TSR la usan cuando solicitan una
interrupcin-del DOS para verificar si otra interrupcin est activa. Ya que el DOS no es reentrante
(esto es, no puede volver a entrar el DOS mientras est activo), el TSR tiene que esperar hasta que
el DOS no est ocupado, como lo indica la bandera de DOS ocupado, inDOS.
MOV
AH,34H
;Peticin
de
INT
21H
;Llama
DOS
CMP
ES:BYTE
JE
P T R [BX] , 0
;Prueba
al
si
la
ocupado
bandera
es
cero
Puntos clave
467
El servicio regresa la direccin de inDOS en el ES:BX. La bandera contiene el nmero de funciones del DOS que estn activas en ese momento, donde 0 significa ninguna. Puede ingresar el DOS
slo si inDOS es 0.
PUNTOS CLAVE
El registro de arranque est en la pista cero, sector 1, de cualquier disco que utilice FORMAT
/S para formatearlo. Cuando inicia el sistema, carga de manera automtica el registro de
arranque del disco y lo enva a la memoria. Entonces, el registro de arranque carga el
IO.SYS del disco a la memoria.
IO.SYS es una interfaz de nivel bajo con las rutinas del BIOS en ROM. Al inicio, IO.SYS
determina el estado de todos los dispositivos y equipo asociados con la computadora y
establece la tabla de direcciones para las interrupciones hasta la 20H. Tambin el IO.SYS
maneja las E/S entre la memoria y los dispositivos externos.
MSDOS.SYS es una interfaz de alto nivel para programas que estn cargados en la memoria
despus del IO.SYS. Sus operaciones incluyen el establecimiento, la tabla de direcciones
para interrupciones desde la 20H hasta la 3FH, la administracin del directorio y de los
archivos en disco, el manejo de bloqueo y desbloqueo de registros en disco y el manejo de
las funciones de la INT 21H.
C O M M A N D . C O M maneja los distintos comandos del DOS y ejecuta los archivos .COM,
.EXE y .BAT solicitados. Consiste en una pequea parte residente, una parte de inicializacin
y una parte transitoria. C O M M A N D . C O M es el responsable de cargar los programas
ejecutables desde el disco y enviarlos a la memoria.
El mdulo .EXE que el enlazador crea consiste en un registro de encabezado que contiene la
informacin de control y reubicacin y el mdulo real cargado.
Al cargar un programa .COM o uno .EXE, el DOS configura bloques de memoria para el
entorno y el segmento del programa. Precediendo a cada bloque de memoria est un
encabezado de arena de 16 bytes iniciando en una frontera de prrafo. Tambin el DOS crea
un PSP en la localidad OOH del segmento del programa y lo carga en 100H.
Al cargar un programa .COM, el DOS establece los registros de segmento con la direccin
del PSP, coloca el apuntador de la pila al final del segmento, guarda en la pila una palabra
con ceros y coloca el apuntador de instrucciones en 100H (el tamao del PSP). Despus, el
control procede a la direccin generada por CS:IP, la primera localidad que sigue al PSP.
Al cargar un programa .EXE, el DOS lee el registro de encabezado y lo enva a la memoria,
calcula el tamao del mdulo ejecutable y lee el mdulo en memoria en el segmento inicial.
Suma el valor de cada elemento en la tabla de reubicacin para el valor del segmento de
inicio. Coloca la direccin del PSP en el DS y ES; en el SS coloca la direccin del PSP, ms
100H, ms el valor de desplazamiento SP; en el SP coloca el tamao de la pila y en el CS la
direccin del PSP, ms 100H, ms el valor de desplazamiento CS en el encabezado. Tambin
el DOS establece el IP con el desplazamiento en 14H. El par CS:IP proporciona la direccin
inicial del segmento de cdigo para la ejecucin del programa.
Los campos tiles dentro del PSP incluyen el rea 1 de parmetros en 5CH, el rea 2 de
parmetros en 6CH y el rea de transferencia a disco en 80H.
Carga los programas residentes antes de activar otros programas de procesamiento normal.
Sale por medio de la funcin 31H de la INT 21H, la cual requiere el tamao del programa
en el DX.
468
Captulo 24
PREGUNTAS
24-1.
24-2.
24-3.
24-4.
24-5.
24-6.
24-7.
24-8.
24-9.
STOP
LENGTH
AME
CLASS
00000H
0002FH
00030H
STACK
STACK
00030H
0005BH
0002CH
CODESG
CODE
00060H
0007CH
0001DH
DATASG
DATA
DOS carga el programa con el PSP comenzando en la localidad 1A25[0]H. Mostrando los clculos
donde sea apropiado, el estado de los contenidos de cada uno de los registros en el tiempo de la carga
(no tome en cuenta la notacin inversa de bytes): (a)CS; (b)DS; (c)ES; (d)SS; (e)SP.
24-10. Un encabezado de arena inicia en la localidad EB6[0] y contiene lo siguiente: 4D COOE OAOO . . . . (a)
Para el DOS, qu significa el 4D (M)? (b) Si ste fuera el ltimo bloque de memoria, en que
diferira el contenido? (c) Cul es la localidad de memoria del siguiente encabezado de arena?
Muestre los clculos.
24-11. (a) Los programas residentes por lo comn interceptan las entradas desde el teclado. Exactamente en
dnde y cul es esta direccin interceptada? (b) En cules dos formas significativas difieren los
cdigos para la terminacin de un programa residente y de un programa normal?
OBJETIVO
Describir las reas de datos del BIOS y los servicios de interrupcin del BIOS.
INTRODUCCIN
El BIOS contiene un extenso conjunto de rutinas de entrada/salida y tablas que indican el estado de
los dispositivos del sistema. El DOS y los programas usuarios pueden solicitar ratinas del BIOS
para la comunicacin con los dispositivos conectados al sistema. El mtodo para realizar la interfaz
con el BIOS es el de las interrupciones de software. Este captulo examina las reas de datos (o
tablas) a las que el BIOS da soporte, el procedimiento de interrupcin y varios servicios de
interrrupcin.
El captulo cubre las interrupciones siguientes:
OOH Divisin entre cero
OFH
Control de LPT1
10H
Despliegue en video
11H
12H
04H Desbordamiento
13H
Entrada/salida de disco
14H
Comunicacin de entrada/salida
469
470
Captulo 25
16H
09H
17H
Salida a la impresora
OBH Control de C O M
18H
19H
Cargador de arranque
1AH
Leer y establecer
1BH
PROCESO DE ARRANQUE
En la PC, el ROM reside iniciando en la localidad FFFFOH. Al encender la computadora se
provoca un "arranque en fro". El procesador ingresa un estado de restablecer, pone todas las
localidades de la memoria en cero, realiza una verificacin de la paridad de memoria y coloca
FFFF[0]H en el registro CS y cero en el IP. Por lo tanto, la primera instruccin a ejecutar est en
FFFF:0, el punto de entrada al BIOS. El BIOS tambin almacena el nmero 1234H en 40[0]:72H
para sealar un C t r l + A l t + D e l subsecuente (rearranque), que no realiza la autoprueba precedente
cuando se enciende.
El BIOS verifica los diferentes puertos para identificar e inicializar dispositivos que estn
conectados, incluyendo INT 11H (determinacin del equipo) y la INT 12H (determinacin del
tamao de la memoria). Despus, empezando en la localidad 0 de memoria, el BIOS establece la
tabla de servicios de interrupcin que contiene las direcciones de las rutinas de interrupcin.
Enseguida, el BIOS determina si est presente un disco que contenga el DOS, y si es as,
ejecuta la INT 19H para accesar el primer sector de disco que contiene el cargador de arranque.
Este programa es un sistema operativo temporal al cual la rutina del BIOS transfiere el control
despus de cargarlo en memoria. El cargador de arranque tiene una sola tarea: cargar en memoria
la primer parte del sistema operativo real. Los archivos del DOS: IO.SYS, MSDOS.SYS y
C O M M A N D . C O M son cargados entonces desde el disco a la memoria.
471
15,14
DISPOSITIVO
11 -9
7,6
5,4
18H-18H
BIT
ACCIN
3
2
1
0
Alt presionada
Ctrl presionada
Shift izquierdo presionado
Shift derecho presionado
7
6
5
4
19H
1AH-1BH
ACCIN
Insert activada
CapsLock activada
NumLock activada
Scroll Lock activada
7
6
5
4
ACCIN
Insert presionada
CapsLock presionada
NumLock presionada
Scroll Lock presionada
BIT
3
2
1
0
ACCIN
Ctrl/NumLock presionada
SysReq presionada
Alt izquierdo presionado
Ctrl derecho presionado
472
1CH-1DH
1EH-3DH
Captulo 25
3FH
Estado del motor del disco. Si el bit 7 = 1, se est llevando a cabo una operacin de
escritura. Bit nmero 0 se refiere a la unidad A, 1 a B, 2 a C y 3 a la D; un valor 0
del bit significa que el motor est encendido.
40H
41H
OCH
02H
10H
03H
20H
04H
Sector no encontrado
40H
Fall la bsqueda
06H
08H
Sobrepas la DMA
42H-48H
Unidad no preparada
7
6
5
4
4AH-4BH
4CH-4DH
4EH-4FH
50H-5FH
60H-61H
62H
63H-64H
65H
66H
MODO
Monocromo
640 x 200 monocromo
320 x 200 monocromo
320 x 200 color
MODO
BIT
3
2
1
0
80
80
40
40
X
x
x
x
25
25
25
25
color
monocromo
color
monocromo
473
BIT
ACCIN
97H
474
Captulo 25
SERVICIOS DE INTERRUPCIN
Una interrupcin es una operacin que suspende la ejecucin de un programa de modo que el
sistema pueda realizar una accin especial. Ya hemos usado varias interrupciones de despliegue
de video, E/S de disco, impresin y para programas residentes. La rutina de interrupcin ejecuta
y por lo regular regresa el control al procedimiento que fue interrumpido, el cual entonces reasume
su ejecucin. El BIOS maneja las interrupciones 00H-1FH y el DOS maneja las interrupciones
20H - 3 F H .
Tabla de servicio de interrupcin
Cuando la computadora se enciende, el BIOS y el DOS establecen una tabla de servicios de
interrupcin en las localidades de memoria 000H-3FFH. La tabla permite el uso de 256 (100H)
interrupciones, cada una con un desplazamiento:segmento relativo de cuatro bytes en la forma
IP:CS. El operando de una instruccin de interrupcin tal como INT 05H identifica el tipo de
solicitud. Como existen 256 entradas, cada una de cuatro bytes, la tabla ocupa los primeros 1,024
bytes de memoria, desde 00H hasta 3FFH. Cada direccin en la tabla relaciona a una rutina de
BIOS o del DOS par un tipo especfico de interrupcin. Por lo tanto los bytes 0-3 contienen la
direccin para la interrupcin 0, los bytes 4-7 para la interrupcin 1, y as sucesivamente:
INT 00H|INT 0 1 H I N T 02H|INT 03H|INT 04H|INT 05H|INT 06H|
...
04H
08H
OCH
10H
14H
18H
475
(NMI) y la lnea de peticin de interrupcin (INTR). La lnea NMI reporta la memoria y errores
de paridad de E/S. El procesador siempre acta sobre esta interrupcin, an si emite un CLI para
limpiar la bandera de interrupcin en un intento por deshabilitar las interrupciones externas. La
lnea INTR reporta las peticiones desde los dispositivos externos, en realidad, las interrupciones
05H a la OFH, para el cronmetro, el teclado, los puertos seriales, el disco duro, las unidades de
disco flexible y los puertos paralelos.
Una interrupcin interna ocurre como resultado de la ejecucin de una instruccin INT o
una operacin de divisin que cause desbordamiento, ejecucin en modo de un paso o una peticin para una interrupcin externa, tal como E/S de disco. Los programas por lo comn utilizan
interrupciones internas, que no son enmascarables, para accesar los procedimientos del BIOS y
del DOS.
476
INT ODH, INT OFH:
respectivamente.
Captulo 25
INT OEH: Control de disco flexible. Seala actividad de disco flexible, como la terminacin de una operacin de E/S.
INT 10H: Despliegue en video. Acepta el nmero de funciones en el AH para el modo de
pantalla, colocacin del cursor, recorrido y despliegue; descrito en detalle en el captulo 10.
ENT 11H: Determinacin del equipo. Determina los dispositivos opcionales en el sistema
y regresa el valor en la localidad 40:10H del BIOS al AX. (A la hora de encender el equipo, el
sistema ejecuta esta operacin y almacena el AX en la localidad 40:10H; vase la seccin anterior, "rea de datos del BIOS", para mayores detalles.)
INT 12H: Determinacin del tamao de la memoria. En el AX, regresa el tamao de la
memoria de la tarjeta del sistema, en trminos de kilobytes contiguos, tal que: memoria de 640K
es 0280H, como se determin durante el encendido.
INT 13H: Entrada/salida de disco. Acepta varias funciones en el AH para el estado del
disco, sectores ledos, sectores escritos, verificacin, formato y obtener diagnstico; cubierto en
el captulo 19.
INT 14H: Las comunicaciones de Entrada/Salida. Proporciona una fila de bytes de E/S
(esto es, un bit a la vez) al puerto de comunicacin RS232. El DX debe contener el nmero del
adaptador RS232 (0-3 para C O M , 2, 3 y 4, respectivamente). Varias funciones son establecidas
por medio del registro AH.
Funcin 00H:
Inicializacin del puerto de comunicaciones. Establece los parmetros siguientes en el AL de acuerdo con el nmero del bit:
Vel. en baudios
7-5
000 = 110
001 = 150
010 = 300
011 = 600
100 = 1,200
101 = 2,400
110 = 4,800
111 = 9,600
Paridad
00
01
10
11
Bit d e p a r a d a
4-3
= ninguna
= impar
= ninguna
= par
Longitud de palabra
2
0 = 1
1=2
1-0
10 = 7 bits
1 1 = 8 bits
En el AX, la operacin regresa el estado del puerto de comunicaciones. (Vase la funcin 03H
para detalles.) A continuacin est un ejemplo que establece C O M a 1,200 baudios, sin paridad,
un bit de parada y longitud de 8 bit:
MOV
AH,00H
/Peticin
para
MOV
AL, 10000011B
;Parmteros
MOV
DX,00
/Puerto
INT
14H
/Llama
serial
al
BIOS
inicializar
COM
el
puerto
477
Funcin 01H: Carcter de transmisin. Cargue el AL con el carcter que la rutina transmite y el DX con el nmero de puerto. Al regreso, la operacin coloca en el AH el estado del
puerto. (Vase la funcin 03H.) Si la operacin es habilitada para transmitir el byte, tambin
establece el bit 7 del AH, aunque el propsito normal de este bit es reportar un error de tiempo
terminado. Asegrese de ejecutar la funcin OOH antes de utilizar este servicio.
Funcin 02H: Carcter recibido. Cargue el nmero de puerto en el DX. La operacin
acepta un carcter desde la lnea de comunicaciones y lo enva al AL. Tambin establece el AH
con el estado del puerto (vase la funcin 03H) para bits de error 7, 4, 3, 2 y 1. Por lo tanto un
nmero diferente de cero en el AX indica un error de entrada. Asegrese de ejecutar la funcin
OOH antes de utilizar este servicio.
Funcin 03H: Regresa estado del puerto de comunicaciones. Cargue el nmero del puerto
en el DX. La operacin regresa el estado de la lnea en el AH y el estado del mdem en el AL:
AH ( E S T A D O DE LA LNEA)
AL (ESTADO D E L MDEM)
7
6
5
4
3
2
1
0
7
6
5
4
3
2
1
0
Fuera de tiempo
Transmitir registro de corrimiento vaco
Trasmitir registro vlido vaco
Deteccin de ruptura
Error de enmarcado
Error de paridad
Error de sobrecorrida
Dato listo
Otras funciones de la INT 14H son 04H (inicializacin extendida) y 05H (control de puerto
ampliado de comunicacin).
I N T 15H: Servicios del sistema. Esta muy elaborada operacin proporciona un gran nmero de funciones en el AH, como las siguientes:
21H
Autoprueba de encendido
43H
Lee el estado del sistema
84H
Da soporte a palanca de juegos
88H
Determina el tamao de la memoria extendida
89H
Conmuta el procesador al modo protegido
C2H
Interfaz del ratn
Por ejemplo, con la funcin 88H en el AH, la operacin regresa en el AX el nmero de kilobytes
de memoria extendida. (Por ejemplo, 0580H significa 1408K bytes.) Como la operacin sale sin
reestablecer las interrupciones, sela as:
MOV A H , 8 8 H
INT
; desde el BIOS
STI
15H
I N T 16H:
Entrada desde el teclado. Acepta varias funciones en el AH para entrada
bsica desde el teclado; cubierta en el captulo 10.
478
Captulo 25
PUNTOS CLAVE
La ROM reside empezando en la localidad FFFFOH. Al encender la computadora se provoca
un "arranque en fri". El procesador ingresa un estado de restablecimiento, pone en cero
todas las localidades de memoria, realiza una verificacin de paridad de la memoria y establece
el registro CS en FFFF[0]H y el IP en cero. Por lo tanto, la primer instruccin a ejecutar
est en FFFF:0 o FFFFO, el punto de entrada al BIOS.
Al arranque, el BIOS verifica los diferentes puertos para identificar e inicializar dispositivos
que estn conectados. Entonces el BIOS establece una tabla de servicios de interrupcin,
empezando en la localidad 0 de memoria, que contiene las direcciones para las interrupciones
que aparezcan. Dos operaciones que realiza el BIOS son la determinacin del equipo y del
tamao de la memoria. Si un disco con el DOS est presente, el BIOS accesa el primer sector
del disco que contiene el cargador del arranque. Este programa carga los archivos del DOS:
IO.SYS, MSDOS.SYS y C O M M A N D . C O M desde el disco a la memoria.
El BIOS mantiene su propia rea de datos en memoria baja, empezando en la direccin del
segmento 40[0]H. Las reas relevantes de datos incluyen aquellas del puerto serial, el puerto
paralelo, equipo del sistema, teclado, unidad de disco flexible, control de video, disco duro
y reloj de tiempo real.
479
Preguntas
El operando en la instruccin de interrupcin, tal como INT 21H identifica el tipo de peticin.
Para cada uno de los 256 tipos posibles, el sistema mantiene una direccin de cuatro bytes
en la tabla de servicios de interrupcin en las localidades 0000H a 3FFH. Por lo tanto, los
bytes 0-3 contienen la direccin para la interrupcin 0, los bytes 4-7 para la interrupcin 1,
y as sucesivamente.
Las interrupciones del BIOS van desde la OOH hasta la 1FH e incluyen divisin entre cero,
impresin de pantalla, cronmetro, control de video, control de disco flexible, E/S de video,
determinacin de equipo y del tamao de la memoria, E/S de disco, E/S de comunicaciones,
entrada desde el teclado, salida a la impresora y cargador de arranque.
PREGUNTAS
25-1. Distinguir entre una interrupcin interna y una externa.
25-2. Distinguir entre una lnea NMI y una lnea INTR.
25-3. (a) Cul es la localidad de la memoria del punto de entrada al BIOS? (b) Al encender la computadora,
cmo es que el sistema se dirige a s mismo a su direccin?
25-4. Al arranque, el BIOS realiza las interrupciones 11H, 12H y 19H. Cul es el objetivo?
25-5. Cul es a localidad inicial del rea de datos del BIOS?
25-6. Los siguientes nmeros binarios fueron observados en el rea de datos del BIOS. Para cada parte,
identifique el campo y explique el significado del nmero.
(a) 10-11H: 10000010 00100101
(b) 17H: 11100001
(c) 18H: 00000011
(d) 96H: 00001100
25-7. Los siguientes nmeros binarios fueron observados en el rea de datos del BIOS. Para cada parte,
identifique el campo y explique el significado del nmero.
(a) 00-03H: F8 03 F8 02
(b) 08-0BH: 78 03 00 00
(c) 13-14H: 80 02
(d) 15-16H: 00 08
(e) 4A-4BH: 50 00
(0 60-61H: 0E 0D
(g) 84H: 18
25-8. Identifique las siguientes interrupciones del BIOS: (a) Divisin entre cero; (b) impresin de la pantalla;
(c) interrupcin del teclado; (d) despliegue en video; (e) E/S en disco; (f) entrada desde el teclado; (g)
salida de impresora; (h) obtiene estado del equipo; (i) determinacin del tamao de la memoria; (j) E/
S de comunicaciones.
CAPITULO 26
OBJETIVO
D e s c r i b i r las diferentes funciones de i n t e r r u p c i n del D O S .
INTRODUCCIN
Los dos mdulos del DOS, 10.SYS y MSDOS.SYS, facilitan el uso del BIOS. Ya que proporcio-1
nan muchas de las pruebas adicionales necesarias, las operaciones del DOS por lo general son ms j
fciles de usar que sus contrapartes del BIOS y por lo comn son independientes de la mquina. |
IO.SYS es una interfaz de nivel bajo con el BIOS que facilita la lectura de datos desde j
dispositivos externos hacia la memoria y la escritura de datos desde la memoria hacia dispositivos i
externos.
i
MSDOS.SYS contiene un administrador de archivos y proporciona varios servicios. Por)
ejemplo, cuando un programa usuario solicita la INT 21H, la operacin enva informacin al I
MSDOS.SYS por medio del contenido de los registros. Para completar la peticin, MSDOS.SYS J
puede traducir la informacin a una o ms llamadas a IO.SYS, el cual a su vez llama al BIOS. Las j
siguientes son las relaciones implicadas:
480
Usuario
Alto nivel
Peticin del
programa
para E/S
DOS
MSDOS.SYS
Bajo nivel
1
O
ROM
Externa
DOS
IO.SYS
BIOS
Dispositivo
481
Manejador del ratn. Proporciona servicios para el manejo del ratn. (Vase el
Captulo 26
AH,25H
MOV
AL,23H
LEA
DX,C10BRK
;Nueva
INT
21H
/Llama al DOS
C10BRK
2BH
2CH
2DH
2EH
2FH
30H
;Peticin establ.
en tabla de interrup.
/Rutina para
IRET
26H
27H
28H
29H
2AH
483
/Regreso de
Ctrl+Break
la interrupcin
484
Captulo 26
BL:CX = cero o nmero de serie, en 24 bits, del usuario (dependiente del fabri-j
cante). Vase tambin la funcin 3306H.
j
31H
Termina pero permanece residente. (Vase captulo 24.)
j
32H
Obtiene bloque de parmetros de la unidad (DPB). (Vase captulo 18.)
i
3300H
Obtiene estado de C t r l + C . Si la bandera de Ctrl + C est apagada (0), el DOS]
verifica por C t r l + C slo mientras maneja funciones de E/S de caracteres, 01H-]
OCH. Si la bandera est activada (1), el DOS tambin verifica mientras maneja]
otras funciones. Para obtener el estado, ponga la subfuncin 00H en el AL. Elj
valor regresado en el DL es 00H = verificacin deshabilitada o 01H = verifica-I
cin habilitada.
3300H
Obtiene estado de Ctrl + C. Si la bandera de Ctrl + C est apagada (0), el DOS
verifica por C t r l + C slo mientras maneja funciones de E/S de caracteres, 01HOCH. Si la bandera est activada (1), el DOS tambin verifica mientras maneja
otras funciones. Para establecer el estado, ponga la subfuncin 01H en el AL y
establezca el estado en el DL como 00H = deshabilita verificacin o 01H ={
habilita verificacin.
j
3305H
Obtiene unidad de arranque (disponible desde DOS 5). La operacin regresa en elj
DL la unidad (1 = A, etc.) usada para cargar el DOS.
j
3306H
Obtiene la versin del DOS (disponible desde DOS 5). La operacin regresa: j
BL = nmero principal de versin, como 7 para la versin 7.11
j
BH = nmero secundario de versin, como B hex (11) para la versin 7.11
j
DL = nmero de revisin en los bits 2-0
j
DH = bandera de versin del DOS (indica si el DOS est corriendo en memorial
convencional, en rea de memoria alta, o en ROM)
j
Aunque el comando SETVER del DOS puede falsear el nmero de versin delj
DOS, la funcin 3306H enva la versin verdadera.
i
34H Obtiene la direccin de la bandera de DOS ocupado (inDOS). (Vase el captulo 24. )j
35H
Obtiene la direccin de la tabla de interrupcin. (Vase el captulo 24.)
j
36H
Obtiene el espacio libre en disco. (Vase el captulo 18.)
j
38H
Obtiene/establece informacin dependiente del pas. Da soporte a varias funciones
concernientes a informacin especfica de varios pases, como el smbolo y formato monetario del pas, separadores de millares y lugares decimales y separadores
de fecha y hora. Carga el DX para la operacin:
DX = FFFFH: Establece el cdigo del pas que el DOS usa hasta que se indique
otra cosa.
42H
Mueve el apuntador del archivo. (Vase el captulo 17.)
]
1
4400H
4401H
4404H
4405H
4406H
4407H
4408H
440DH,
440DH,
440DH,
440DH,
440DH,
440DH,
440DH,
45H
46H
47H
48H
49H
4AH
4BH
4CH
4DH
4EH
4FH
50H
51H
52H
54H
56H
57H
5800H
5801H
5802H
5803H
59H
5AH
5BH
485
486
5CH
5DH
5EH
5FH
62H
65H
66H
67H
68H
6CH
Captulo 26
PUNTOS CLAVE
Interrupciones desde la 20H hasta la 3FH estn reservadas para operaciones con el DOS.
La INT 21H maneja operaciones como entrada desde el teclado, salida a la pantalla, salida
a la impresora, restablecer el disco, abrir/cerrar archivos, borrar archivo, leer/escribir
registros secuenciales, leer/escribir registros directos, terminar y permanecer residente
(residente en memoria), crear subdirectorios y terminar un programa.
PREGUNTAS
26-1. Qu interrupciones estn reservadas para el DOS?
26-2. Identifique las funciones para los siguientes servicios de la INT 21H del DOS: (a) entrada de
comunicaciones; (b) obtener la hora del sistema; (c) obtener la versin del DOS; (d) terminar pero
permanecer residente (residente en memoria);(e) obtener la direccin de la tabla de interrupciones; (f)
crear un subdirectorio; (g) obtener la cantidad de espacio libre en el disco; (h) obtener la direccin del
PSP.
26-3. Identifique las siguiente funciones de la INT 21H: (a) 05H; (b) OAH; (c) OFH; (d) 16H; (e) 35H; (f)
3CH; (g) 3DH; (h) 3FH; (i) 40H.
CAPTULO 27
Operadores y directivas
OBJETIVO
D e s c r i b i r con detalle los o p e r a d o r e s y directivas del lenguaje
ensamblador.
INTRODUCCIN
Las diferentes caractersticas del lenguaje ensamblador al principio tienden a ser un poco confusas. Pero una vez que ya se ha familiarizado con las caractersticas ms sencillas y comunes
descritas en los captulos precedentes, usted debe encontrar las descripciones en este captulo ms
fciles de entender y como una referencia a mano. Aqu, describimos los diferentes tipos de
especificadores, operadores y directivas. El manual del lenguaje ensamblador contiene unas cuantas caractersticas ms de uso marginalmente til.
ESPECIFICADORES DE TIPO
Los especificadores de tipo proporcionan el tamao de una variable de datos o la distancia relativa
de una etiqueta de instruccin. Los especificadores de tipo que dan el tamao de una variable de
datos son BYTE, WORD, DWORD, FWORD, QWORD y TBYTE. Aquellas que dan la distancia
de una etiqueta de instruccin son NEAR, FAR y PROC. Una direccin cercana, la cual slo es
un desplazamiento, se supone que es en el segmento actual; una direccin lejana, que consiste en
una direccin segmento:desplazamiento, puede ser usada para acceso a otro segmento.
487
Operadores y directivas
488
Captulo 27
Los operadores PTR y THIS, as como las directivas COM, EXTRN, LABEL y PROC,
utilizan especificadores de tipo.
OPERADORES
Un operador proporciona una facilidad para cambiar o analizar operandos durante un ensamblado.
Los operadores estn divididos en varias categoras:
Operadores de clculo: Aritmticos, ndice, lgicos, desplazamiento y nombre de estructura
de campo.
Operadores de macro: Varios tipos, tratados en el captulo 22.
Operadores de registro: MASK y WIDTH, tratados ms adelante en este captulo, con la
directiva RECORD.
Operadores relacinales: EQ, GE, GT, LE, LT y NE.
Operadores de segmento: OFFSET, SEG y pasar por alto el segmento.
Operadores de tipo (o atributo): HIGH, HIGHWORD, LENGTH, LOW, LOWWORD,
PTR, SHORT, SIZE, THIS y TYPE.
Como el conocimiento de estas categoras no es necesario, slo trataremos los operadores
en orden alfabtico.
Operadores aritmticos
Los operadores aritmticos incluyen los conocidos signos aritmticos y realizan aritmtica durante
un ensamble. En la mayora de los casos, podra realizar los clculos usted mismo, aunque la
ventaja de usar estos operadores es que cada vez que cambie el programa y lo reensamble, el
ensamblador de manera automtica recalcula los valores de los operadores aritmticos. A continuacin est una lista de los operadores, junto con un ejemplo de su uso y el efecto obtenido:
SIGNO
+
+
-*
/
MOD
TIPO
EJEMPLO
EFECTO
Adicin
Positivo
Resta
FLD1+25
+FLD1
FLD2-FLD1
Negacin
Multiplicacin
Divisin
Residuo
-FLD1
nm*3
nm/3
nml MOD nm2
Salvo para la adicin ( + ) y resta (-), todos los operadores deben ser constantes enteras. Los
siguientes ejemplos relacionados de expresiones enteras son ilustrativos:
valorl
12
;48
valorl
= valorl
;48
valorl
= valorl
;(-8)
(3)
-11
Operadores
489
MOV
1234H
; Carga 12H en CL
Operadores INDEX
Para una referencia directa a memoria, un operando de una instruccin especifica el nombre de
una variable definida, como es mostrado por COUNTER en la instruccin ADD CX,COUNTER.
Durante la ejecucin, el procesador localiza la variable especificada en la memoria por combinacin del valor del desplazamiento de la variable con la direccin del segmento de datos en el DS.
Para direccionamiento indirecto de la memoria, un operando hace referencia a un registro
base o ndice, constante, variables de desplazamiento y variables. El operador de ndice, que utiliza
corchetes, acta como un signo ms ( + ) . Un uso comn de indexamiento es para hacer referencia a
datos en tablas. Puede usar las operaciones siguientes para referenciar memoria indexada:
[Constante], i.e, un nmero o nombre inmediato entre corchetes. Por ejemplo, cargue la
quinta entrada de TABLEA en el CL (note que TABLEAfO] es la primer entrada):
TABLEA
DB
2 5 DUP(?)
;Tabla
definida
MOV
Registro ndice DI como [DI] y registro ndice SI como [SI], ambos en asociacin con el
registro de segmento DS. Por ejemplo, combine la direccin en el DS con la direccin de
desplazamiento en el SI y mueva el elemento referenciado al AX:
M O V AX, [SI]
[BX+SI+4] , AX
Operadores y directivas
490
Captulo 27
Operador LENGTH
El operador LENGTH regresa el nmero de entradas definidas por un operador DUP. La siguiente instruccin MOV regresa la longitud 10 al DX:
TABLEA
DW
10 DUP(?)
MOV
DX,LENGTH TABLEA
USADO
COMO
AND
expl AND
OR
expl
XOR
expl XOR
NOT
NOT
OR
EFECTO
exp2
exp2
exp2
expresin!
Conj uncin de
los b i t s
Disyuncin
de
los b i t s
Disyuncin
exlusiva
Invierte
los
de
los
bits
bits
;00010100B
MOV
BL,NOT 01010101B
;10101010B
Operadores L O W y L O W W O R D
El operador LOW regresa el byte bajo (de la derecha) de una expresin y LOWWORD (desde
MASM 6.0) regresa la palabra baja de una expresin. (Tambin vase el operador HIGH.)
Aqu est un ejemplo:
EQUVAL
EQU
12 3 4H
MOV
CL.LOW
EQUVAL
; Carga
34H
en
CL
Operador OFFSET
El operador OFFSET regresa la direccin de desplazamiento (esto es, la direccin relativa dentro
del segmento de datos o del segmento de cdigo) de una variable o de una etiqueta. El formato
general es
OFFSET
variable
etiqueta
DX, O F F S E T
TABLEA
Operadores
491
DX,TABLEA
Operador MASK
Vase "Directiva R E C O R D " en la seccin titulada "Directivas".
Operador P T R
El operador PTR puede ser usado en variables de datos y en etiquetas de instruccin. Utiliza los
especificadores de tipo BYTE, WORD, FWORD, DWORD, QWORD y TBYTE para especificar
un tamao en un operando ambiguo o para pasar por encima del tipo definido (DB, DW, DF, DD,
DF o DT) para variables. Tambin usa los especificadores de tipo NEAR, FAR y PROC para
pasar por alto la distancia implicada de etiquetas. El formato general es
tipo
PTR expresin
El tipo es el nuevo atributo, tal como BYTE. La expresin es una variable o constante. A continuacin estn unos ejemplos del operador PTR (tenga cuidado por FLDW, donde los bytes estn
en secuencia inversa de bytes):
FLDB DB
22H
DB
35H
FLDW DW
2672H
/Almacenado como
7226
(72)
ADD
(26)
MOV
(2335)
al AX
Una caracterstica que realiza una funcin semejante a PTR es la directiva LABEL, descrita
posteriormente.
Operador SEG
El operador SEG regresa direccin del segmento en el que una variable o etiqueta especificada es
colocada. Los programas que combinan segmentos ensamblados por separados son los ms adecuados para usar este operador. El formato general es
SEG variable o etiqueta
La siguiente instruccin MOV regresa la direccin del segmento en el que los nombres
referenciados estn definidos:
MOV
DX,SEG FLDW
/Direccin del
segmento de datos
MOV
DX,SEG A20
492
Operadores y directivas
Captulo 27
El segmento nombrado puede ser cualquiera de los registros de segmento o un nombre de segmento o de grupo. La expresin puede ser una constante, una expresin o una expresin SEG. Los
siguientes ejemplos pasan por alto el registro de segmento DS por omisin:
MOV
BH,ES:10H
;Accesa
desde
ES
ms
el
desplazamiento
10H
MOV
CX,SS:[BX]
,-Accesa
desde
SS
ms
el
desplazamiento
en BX
Una instruccin puede tener un operador de pasar por alto el segmento aplicado a un solo operando.
Operador SHL y SHR
Los operadores SHL y SHR hacen un corrimiento de una expresin durante un ensamblado. Los
formatos generales son:
expresin
SHL
contador
expresin
SHR
contador
En el ejemplo siguiente, el operador SHR hace un corrimiento de la constante de bit tres bits hacia
la derecha:
MOV
BL,01011101B
SHR
;Carga
00001011B
SHORT
etiqueta
El ensamblador reduce el cdigo de mquina de un operando de dos bytes a uno. Esta caracterstica es til para saltos cercanos que van hacia adelante, ya que de otra manera el ensamblador en
un inicio no sabe la distancia de la direccin del salto y puede suponer que es de dos bytes para un
salto lejano.
Operador SIZE
El operador SIZE regresa el producto de LENGTH veces TYPE y es til slo si la variable
referenciada contiene la entrada DUP. El formato general es
SIZE
variable
Operadores
493
Operador THIS
El operador THIS crea un operando con segmento y desplazamiento que son iguales a aqullos de
la posicin actual del contador. El formato general es
THIS
tipo
El especificador de tipo puede ser BYTE, WORD, DWORD, FWORD, QWORD o TBYTE para
variables y NEAR, FAR o PROC para etiquetas. Por lo comn usted utiliza THIS con la directiva
EQU, o signo igual ( = ). El ejemplo siguiente define FLDA:
FLDA
EQU
THIS
BYTE
LABEL
BYTE
Operador TYPE
El operador TYPE regresa el nmero de bytes, de acuerdo a la definicin de la variable referenciada.
Sin embargo, la operacin siempre regresa 1 para una variable de cadena y 0 para una constante
DEFINICIN
DB
DW
DD
DF
DQ
DT
10
STRUC
NEAR
etiqueta
FFFFH
FAR
etiqueta
FFFEH
DB
/Define un byte
TABLEA
DW
2 0 DUP (?)
MOV
/AX = 0001H
MOV
AX,TYPE
/AX = 0002H
MOV
CX,LENGTH
MOV
DX,SIZE
/Define 2 0 palabras
TABLEA
TABLEA
TABLEA
/CX = 000AH
(10)
/DX = 0014H
(20)
Como TABLEA est definida como DW, TYPE regresa 0002H, LENGTH regresa 000AH con
base en la entrada DUP y SIZE regresa type veces la longitud, o 14H (20).
494
Operadores y directivas
Captulo 27
Operador WIDTH
Vase "Directiva R E C O R D " en la seccin siguiente.
DIRECTIVAS
\
j
j
j
j
Esta seccin describe la mayora de las directivas de lenguaje ensamblador. El captulo 4 trata en
detalle las directivas para la definicin de datos (DB, DW, etctera) y el captulo 22 cubre las
directivas para las macro instrucciones, de modo que no sern repetidas aqu. Las directivas estn divididas en varias categoras:
Etiquetas de cdigo: ALIGN, EVEN, LABEL y PROC.
Asignacin de datos: ALIGN, EQU, EVEN, LABEL y ORG. DB, DW, DD, DF, DQ y I
DT, estudiadas en el captulo 4.
]
Control de listado: .CREF, .LIST, .PAGE, SUBTTL (SUBTITLE), TITLE, XCREF y |
.XLIST, estudiadas en este captulo. .LALL, .LFCOND, .SALL, .SFCOND, . T F C O N D y !
.XALL, estudiadas en el captulo 22.
|
v
Procesador: .8086, .286, .286P, .386, .386P, .8087, .287, .387, etctera.
j
I
j
1
|
Ya que el conocimiento de estas categoras no es necesario, estudiaremos las directivas j
(distintas de las relacionadas con macros) en orden alfabtico.
]
Directiva ALIGN
!
j
MASM 5.0 introdujo la directiva ALIGN para forzar al ensamblador alinee el siguiente elemento ]
de datos o instruccin de acuerdo a un valor dado. El formato general es
j
I
-1
ALIGN numero
|
i
El nmero debe ser una potencia d 2, tal como 2, 4, 8 o 16. Para el enunciado ALIGN 4, el ]
ensamblador avanza su contador de posicin a la direccin siguiente que sea divisible entre 4. Si j
el contador de posicin ya est en la posicin necesaria, no avanza. El ensamblador llena los bytes I
i
.i
495
Directivas
no usados con ceros para datos e instrucciones NOP. Note que ALIGN 2 tiene el mismo efecto
que EVEN.
La alineacin no se aprovecha en el procesador 8088, el cual accesa slo un byte a la vez,
pero puede aumentar la velocidad en procesadores ms avanzados.
Directiva .ALPHA
La directiva .ALPHA, colocada en o cerca del inicio de un programa, le indica al ensamblador
que acomode los segmentos en orden alfabtico. Pasa por encima de la opcin de ensamblador /S.
(Vase tambin la directiva .SEQ.)
Directiva ASSUME
ASSUME le indica al ensamblador que asocie nombres de segmento con los registros de segmento
CS, DS, ES y SS. El formato general es
ASSUME
reg-seg:nom-reg[...]
Entradas vlidas de registro de segmento son CS, DS, ES y SS, ms FS y GS en los procesadores
80386 y posteriores. Nombres vlidos de segmentos son aquellos de registros de segmentos,
NOTHING, GROUPs y una expresin SEG. Un enunciado ASSUME puede asignar hasta cuatro
registros de segmento, en cualquier orden. Las directivas simplificadas de segmento de manera
automtica generan un ASSUME.
En el enunciado ASSUME siguiente, CODESG, DATASG y STACK son los nombres que
el programa ha usado para definir a los segmentos:
ASSUME
CS:CODESG,DS:DATASG,SS:STACK,ES:DATASG
ES:NOTHING
Suponga que no asigna el registro ES ni usa NOTHING para cancelarlo. Entonces, para
referenciar un elemento de dato en el segmento de datos, un operando de instruccin puede usar el
operador para pasar por alto el segmento (:) para referenciar el registro ES, que debe contener una
direccin vlida:
MOV AX,ES:[BX]
/Utilice
MOV
AX,ES:FLDW
direccin inde>fada
Directiva .CODE
Esta directiva simplificada de segmento define el segmento de cdigo. Su formato general es
.CODE
[nombre]
Todo cdigo ejecutable debe ser colocado en este segmento. Para modelos TINY, SMALL y
C O M P A C T , por omisin el nombre del segmento es TEXT. Los modelos de memoria MDIUM y LARGE permiten mltiples segmentos de cdigo, los cuales se distinguen por medio del
nombre del operando. (Vase tambin la directiva .MODEL.)
Operadores y directivas
496
Capitulo 27
Directiva C O M M
Al definir una variable como COMM le da los atributos PUBLIC y EXTRN. De esta manera, no
tendra que definir la variable como PUBLIC en un mdulo y EXTRN en otro. El formato general es:
COMM
[NEAR/FAR]
etiqueta:tamao[:contador]
NEAR
FLDCOM:WORD
Directiva C O M M E N T
Esta directiva es til para mltiples lneas de comentarios. El formato general es
COMMENT
delimitador
[comentarios]
[comentarios]
delimitador
[comentarios]
El delimitador es el primer carcter diferente de espacio en blanco que sigue a COMMENT, tal
como % o + . El comentario termina en la lnea en la que aparece un segundo delimitador. En el
ejemplo siguiente se utiliza un signo ms como un delimitador:
COMMENT
Esta
en
por
no
rutina
la
cadena
busca
de
entrada
caracteres
vlidos.
Directiva .CONST
Esta directiva simplificada de segmento define un segmento de datos (o constante) con la clase
'const'. (Vase tambin la directiva .MODEL.)
Directiva .CREF
Esta directiva (que se tiene por omisin) le indica a ensamblador que genere una tabla de referencias
cruzadas. Sera usada a continuacin una directiva .XCREF que causa la supresin de la tabla.
Directivas .DATA y .DATA?
Estas directivas simplificadas de segmento definen segmentos de datos. .DATA define un segmento para inicializar datos cercanos; .DATA? define un segmento para datos cercanos no
497
Directivas
inicializados, por lo comn usada cuando se enlaza con lenguajes de alto nivel. Para un programa
en ensamblador autnomo, tambin puede definir datos cercanos no inicializados en un segmento
.DATA. (Vase, adems, las directivas .FARDATA y .MODEL.)
Directiva DOSSEG
Existen varias maneras de controlar la secuencia en la que el ensamblador acomoda los segmentos. (Algunas versiones lo hacen alfabticamente.) Puede codificar las directivas .SEQ o .ALPHA
al inicio de un programa, o puede ingresar las opciones del ensamblador /S o /A en el momento
del ensamblado. La directiva DOSSEG (.DOSSEG desde MASM 6.0) le indica al ensamblador
ignorar todas las dems peticiones y adoptar la secuencia de segmentos DOS bsicamente,
cdigo, datos y pila. Codifique esta directiva en o cerca del inicio del programa, principalmente
para facilitar el uso de CODEVIEW para programas autnomos.
Directiva E N D
La directiva END es colocada al final de un programa fuente. El formato general es
END
[direccin-inicial]
ENDP
ENDS
nombre
EQU expresin
Equivalencia de cadena:
El ensamblador reemplaza cada ocurrencia del nombre con el operando. Ya que EQU es utilizada para
reemplazo simple, no ocupa espacio de almacenamiento adicional en el programa objeto generado.
Operadores y directivas
498
Captulo 27
SUMA
EQU
CONTADOR
DIEZ
EQU
/Otro
10
/Valor
nombre
para
CONTADOR
numrico
INC
SUMA
;Incrementa
ADD
SUM,DIEZ
;Suma
10
CONTADOR
CONTADOR
EQU
<'Enter
BYPTR
EQU
<BYTE
MSG
product
PTR>
PRODMSG
MOV
number'>
SAVE,BYPTR
,-Reemplaza
[BX]
con
/Reemplaza
cadena
con
de
cadena
caracteres
de
caracteres
.ERR
.ERR1
.ERR2
.ERRE
.ERRNZ
.ERRDEF
.ERRNDEF
.ERRB
.ERRNB
.ERRIDN[I]
.ERRDIF[I]
ERROR
FORZADO
Cuando es encontrado
Durante la pasada uno de un ensamblador
Durante la pasada dos de un ensamblador
Por una expresin verdadera (0)
Por una expresin falsa (no 0)
Por smbolo definido
Por smbolo no definido
Por cadena en blanco
Por cadena no en blanco
Por cadenas idnticas
Por cadenas diferentes
condicin
ELSE
.ERR
#OUT
ENDIF
[mensaje]
499
Directivas
BYTELOCN DB ?
0017
EVEN
[0017
NOP]
0 018
WORDLOCN
DW ?
Directiva E X T R N
La directiva EXTRN (o EXTERN desde MASM 6.0) informa al ensamblador y al enlazador
acerca de las variables de datos y de las etiquetas que el actual ensamblado hace referencia, pero
que otro mdulo (enlazado al actual) define. El formato general es
EXTRN nombre:tipo
[,
... ]
SEGMENT
PUBLIC
CONVAL
DW ?
DSEGl
ENDS
CONVAL
500
Operadores y directivas
Captulo 27
Subprograma llamado:
EXTRN
DSEG2
CONVAL : FAR
SEGMENT
MOV
DSEG2
AX, CONVAL
ENDS
GROUP nom-seg
[,
nom-seg],
...
GROUP
SEGl,
SEG2
SEGl
SEGMENT
PARA
'Data'
ASSUME
DS:GROUPX
SEGl
ENDS
SEG2
SEGMENT
PARA
ASSUME
DS:GROUPX
SEG2
'Data'
ENDS
El efecto de usar GROUP es semejante al dar a los segmentos el mismo nombre y el atributo
PUBLIC.
Directiva INCLUDE
Puede tener secciones de cdigo ensamblado o macroinstrucciones que varios programas utilicen.
Si es as, puede almacenar stas en archivos de disco separados disponibles para usarse por
Directivas
501
cualquier programa. Considere una rutina que convierta cdigo ASCII a binario que est almacenada en la unidad D en el archivo con nombre CONVERT.LIB. Para accesar el archivo, inserte
un enunciado INCLUDE tal como
INCLUDE
D:CONVERT.LIB
LABEL
especificador-de-tpo
Para etiquetas, puede usar LABEL para redefinir cdigo ejecutable como NEAR, FAR o PROC,
tal como para un punto secundario de entrada en un procedimiento. Para variables puede usar los
especificadores de tipo BYTE, WORD, DWORD, FWORD, QWORD o TBYTE, o un nombre
de estructura, para redefinir elementos de datos y los nombres de las estructuras, respectivamente. Por ejemplo, LABEL le permite definir un campo a la vez como DB y como DW. Lo siguiente
ilustra el uso de los tipos BYTE y WORD:
REDEFB
LABEL
BYTE
FIELDW
DW
2532H
REDEFW
LABEL
WORD
FIELDB
DB
25H
DB
32H
MOV
AL, REDEFB
,-Mueve el p r i m e r byte
MOV
BX, REDEFW
,-Mueve 2 bytes
La primer instruccin MOV slo mueve el primer byte de FIELDW. El segundo MOV mueve los
dos bytes empezando en FIELDB. El operador PTR realiza una funcin similar.
Directiva . L I S T
La directiva .LIST (que es por omisin) causa que el ensamblador liste el programa fuente. Puede
usar la directiva .XLIST en cualquier parte en un programa fuente ensamblador para discontinuar
el listado. Una situacin comn es en donde los enunciados son comunes a otros programas y no
necesita listarlo otra vez. .LIST reasume el listado. Codifique ambas directivas sin operandos.
Operadores y directivas
502
Captulo 27
Directiva .MODEL
Esta directiva simplificada de segmento crea segmentos por omisin y los enunciados ASSUME y
GROUP necesarios. Su formato general es
.MODEL
modelo-memoria
SMALL
MDIUM
COMPACT
LARGE
HUGE
SMAL
.STACK
12 0
.DATA
[elemento
de
dato]
.CODE
[instrucciones]
END
Directiva ORG
El ensamblador utiliza un contador de localidades para llevar la cuenta de su posicin relativa en
un segmento de datos o de cdigo. Considere un segmento de datos con las definiciones siguientes:
DESPLAZAMIENTO
NOMBRE
OPERACIN
OPERANDO
CONTADOR DE LOCALIDADES
00
FLDA
DW
2542H
02
02
FLDB
DB
36H
03
03
FLDC
DW
212EH
05
05
FLDD
DD
00000705H
09
En un inicio, el contador de localidades es puesto en 00. Como FLDA es de dos bytes, el contador
de localidades se incrementa en 02 para la localidad del siguiente elemento. Como FLDB es un
Directivas
503
expresin
La expresin debe formar un nmero absoluto de dos bytes y no debe ser un nombre simblico.
Suponga que los siguientes elementos estn definidos despus de FLDD en la definicin anterior:
DESPLAZAMIENTO NOMBRE
OPERACIN
ORG
00
00
FLDX
DB
01
01
FLDY
DW
02
03
FLDZ
DB
04
ORG
09
El primer ORG restablece el contador de localidades a 00. Las variables que siguen FLDX,
FLDY y FLDZ redefinen estas localidades de memoria como FLDA, FLDB y FLDC, respectivamente:
Desplazamiento:
FLDA
FLDB
FLDC
FLDX
FLDY
FLDZ
FLDD
Un operando que contiene un signo de pesos ($), como en el segundo ORG, se refiere al
valor actual en el contador de localidades. Por tanto, el operando $ + 5 pone el contador de
localidades a 04 + 5, o 09, que es el mismo como despus de la definicin de FLDD.
Una referencia a FLDC es a un campo de un byte en el desplazamiento 03, y una referencia
a FLDZ es a un campo de un byte en el desplazamiento 0 3 :
MOV
AX,FLDC
;Una palabra
MOV
AL,FLDZ
;Un byte
Puede usar ORG para redefinir localidades de memoria en la manera precedente. Pero
asegrese que usted restablecer el contador de localidades al valor correcto y que tiene en cuenta
para todas las localidades de memoria rede finidas. Tambin, las variables redefinidas no deben
contener constandes definidas stas se traslaparan encima de las originales. ORG no puede
aparecer dentro de una definicin STRUC.
Directiva %OUT
Esta directiva le indica al ensamblador que dirija un mensaje al dispositivo de salida estndar (por
lo comn la pantalla). (Desde el MASM 6.0, el nombre es ECHO.) El formato general es
#OUT mensaje
Operadores y directivas
Captulo 27
1
Directiva PAGE
La directiva PAGE al inicio de un programa fuente especifica el nmero mximo de lneas a lista
en una pgina y el nmero mximo de caracteres en una lnea. Su formato general es
PAGE
[ [longitud] , ancho]
El ejemplo siguiente establece 60 lneas por pgina y 132 caracteres por lnea:
j
I
PAGE
60,132
El nmero de lneas por pgina puede ser en el rango de 10 a 255, y el nmero de caracteres por
lnea desde 60 hasta 132. Por omisin de un enunciado PAGE hace que el ensamblador suponga
PAGE 50,80. Para forzar que una pgina salte a una lnea especfica, tal como al final de un
segmento, codifique PAGE sin operando.
i
Directiva PROC
'
Un procedimietno es un bloque de cdigo que inicia con la directiva PROC y termina con ENDP. Un
uso comn es para una subrutina dentro de un segmento de cdigo. Aunque tcnicamente, usted
puede ingresar a un procedimiento en una lnea o por una instruccin JMP, la prctica comn es
utilizar CALL para entrar y RET para salir. El operando CALL puede ser un especificador de tipo
NEAR o FAR y RET supone el mismo tipo.
Un procedimiento que est en el mismo segmento que el programa que llama es un procedimiento NEAR (cercano) y es accesado por un desplazamiento:
I
nombre-proc
PROC
[NEAR]
'
nombre-proc
PUBLIC
nombre-proc
PROC
FAR
Una etiqueta lejana puede estar en otro segmento, el cual CALL accesa por una direccin y
desplazamiento de segmento.
Directiva de procesador
Estas directivas definen los procesadores que el ensamblador va a reconocer. La colocacin normal de las directivas de procesador es al inicio de un programa fuente, aunque podra codificarlas
dentro de un programa en un punto en donde quiera habilitar o deshabilitar un procesador. Una
referencia al 8086 tambin supone el 8088, y el .486 fue introducido por MASM 6.0.
j
.8086 habilita el 8086 y el coprocesador 8087 (el modo por omisin).
.186, .286, .386 y .486 permiten la configuracin de instrucciones e incluyen los procesadores
nombrados y su coprocesador asociado. Esto es, la directiva permite instrucciones de
procesadores anteriores. (Por ejemplo, .386 habilita .387, .286, .186 y .8086.)
505
Directivas
.186P, .286P, .386P y .486P habilita todos los conjuntos de instrucciones citados ms las
instrucciones privilegiadas del procesador.
Directiva PUBLIC
El objetivo de la directiva PUBLIC es para informar al ensamblador y al enlazador que los
smbolos identificados en un ensamblado sern referenciados por otros mdulos enlazados con el
actual. El formato general es
PUBLIC smbolo [, . . . ]
El smbolo puede ser una etiqueta, un nmero (hasta de dos bytes) o una variable. Para ejemplos,
vase la seccin "Directiva EXTRN" en el captulo 2 3 .
Directiva RECORD
La directiva RECORD le permite definir patrones de bits. Un objetivo es definir indicadores de
conmutacin como un bit o como de multibits. El formato general es
nom-reg RECORD nom-campo:ancho[=exp]
[,
...]
El nombre del registro y los nombres de campo pueden ser cualesquiera identificadores nicos. A
continuacin de cada nombre de campo est dos puntos (:) y un ancho el nmero de bits. El
rango de ancho es de 1 a 16 bits:
NMERO DE BITS DEFINIDOS
1-8
9-16
8
16
RECORD BIT1:3,BIT2:7,BIT3:S
BIT1 define los primeros 3 bits de BITREC, BIT2 define los siguientes 7 y BIT3 define los
ltimos 6. El total es de 16 bits, o una palabra. Puede inicializar valores en RECORD como sigue:
BITREC2
RECORD
BIT1:3=10IB,BIT2:7=0110110B,BIT3:G=011010B
Suponga que una definicin de RECORD est al inicio del segmento de datos. Dentro del
segmento de datos, debe estar otro enunciado que asigne espacio para el registro. Defina un
nombre vlido nico, el nombre del registro y un operando que consiste en parntesis angulares
(los smbolos menor y mayor que):
DEFBITS
BITREC
La asignacin para DEFBITS genera el cdigo objeto AD9AH (almacenado como 9AAD) en el
segmento de datos. Los parntesis angulares tambin pueden contener entradas que redefinan a
BITREC.
El programa de la figura 27-1 define BITREC como RECORD, pero sin valores iniciales en
el registro de campos. En este caso, un enunciado de asignacin en el segmento de datos inicializa
cada campo como se muestra dentro de los parntesis angulares.
Operadores y directivas
506
TITLE
CODESG
BEGIN:
P 2 7 R E C O R (COM)
Prueba de la directiva
S E G M E N T PARA 'Code'
ASSUME
CS:CODESG,DS:CODESG,SS:CODESG
ORG
100H
JMP
SHORT MAIN
BITREC
DEFBITS
RECORD
BITREC
BIT1:3,BIT2:7,BIT3: 6
<101B, 0110110B, 011010B>
MAIN
A10 :
PROC
NEAR
MOV
MOV
BH,WIDTH
AL, WIDTH
MOV
MOV
MOV
CL,BIT1
CL,BIT2
CL,BIT3
MOV
MOV
MOV
AX,MASK
BX,MASK
CX,MASK
MOV
AND
MOV
SHR
AX,DEFBITS
AX,MASK BIT2
CL,BIT2
'
AX,CL
MOV
MOV
SHR
MOV
INT
ENDP
ENDS
END
AX,DEFBITS
CL,BIT1
AX, CL
AX,4C00H
21H
0000
0100
0100
EB
0102
AD9A
0104
0104
0104 B7
0 1 0 6 BO
0108
0108 Bl
010A Bl
010C Bl
010E
010E B8
0111 BB
0114 B9
0117
0117 Al
011A 25
011D Bl
011F D3
0121
0121 Al
0124 Bl
0126 D3
0128 B8
012B CD
012D
35 0 1 2 D
36
02
10
07
B10 :
OD
06
00
CIO :
E000
1FC0
003F
R
0102
OD
E8
4C00
21
E10 :
MAIN
CODESG
.
.
.
.
,
.
,
.
and Groups:
a m e
a m e
BIT2
BIT3
CO
DIO
DEFBITS
E10
MAIN
Ancho:
de r e g i s t r o
(16)
de c a m p o
(07)
Contador de corrimiento
OD
06
0 0 hex
Mscara:
E000
1FC0
003F hex
BIT2 aislado:
obtiene registro
limpia BIT1 y 3
obtiene despl. 06
c o r r i . a la d e r e c h a
BIT1 aislado:
Obtiene registro
obtiene corri. 13
d e s p l . a la d e r e c h a
Sale al DOS
BEGIN
,
.
.
,
,
Width
Shift
0010
000D
0006
0000
fields
Mask
Width
0003
0003
E000
0007
1FC0
003F
0006
Initial
Length
012D
Align
PARA
Combine
NONE
Type
L NEAR
L NEAR
L NEAR
Valu
0104
0108
0100
Attr
CODESG
CODESG
CODESG
010E
0117
0102
0121
0104
CODESG
CODESG
CODESG
CODESG
CODESG
0006
,
0000
, L NEAR
. L NEAR
, L WORD
L NEAR
, N PROC
Figura 27-1
RECORD
,-Define r e g i s t r o
,-Inic. r e g i s t r o
registros:
a ra e
CODESG
Symbols:
A10
B10
BEGIN
BIT1
BIT2
BIT3
DIO :
0102
1FC0
06
E8
Estructuras
BITREC
BIT1
BIT2
BIT3
Segmenta
BITREC
BIT2
Captulo 27
0000
0000
0000
Class
CODE'
Lengtl
507
Directivas
no se refiere al contenido de BIT2. (En realidad, sera muy difcil.) En lugar de eso, el ensamblador
genera un operando inmediato que contiene un contador de corrimiento para ayudarle a aislar el
campo. El valor inmediato representa el nmero de bits que tendra que desplazar BIT2 para
ajustado a la derecha. En la figura 2-1, los tres ejemplos que siguen a B10 regresan el contador de
corrimiento para B I T l , BIT2 y BIT3.
O p e r a d o r M A S K . El operador MASK regresa una mscara (filtro) de bits en uno que
representa el campo especificado y, de hecho, define las posiciones de bits que el campo ocupa.
Por ejemplo, el MASK para cada uno de los campos definidos en BITREC es
CAMPO
BINARIO
HEXADECIMAL
BITl
1110000000000000
EOOO
BIT2
0001111111000000
1FC0
BIT3
0000000000111111
003F
En la figura 27-1, las tres instrucciones que siguen a CO regresan los valores de MASK
para B I T l , BIT2 y BIT3. Las instrucciones que siguen a DIO y E10 aislan BIT2 y B I T l , respectivamente, de BITREC. DIO obtiene el registro en el registro AX y utiliza un MASK de BIT2 para
realizar un A N D :
Registro:
101 0110110
011010
AND MASK B I T 2 :
000 1111111
000000
Resultado:
000 0110110
000000
El efecto es limpiar todos los bits excepto aquellos de BIT2. Las dos instrucciones siguientes
hacen que el AX recorra seis bits de modo que BIT2 est alineado a la derecha:
0000000000110110
(0036H)
(0005H)
Operadores y directivas
508
Captulo 27
Directiva SEGMENT
Un mdulo ensamblado consiste en uno o ms segmentos, parte de un segmento o aun partes de
varios segmentos. El formato general es
nom-seg
SEGMENT
nom-seg
ENDS
[alinear]
[combinar]
Pelase']
Todos los operandos son opcionales. Las siguientes subsecciones describen las entradas para
alinear, combinar y clase.
Alinear.
BYTE
WORD
DWORD
PARA
PAGE
direccin
direccin par (divisible entre 2)
direccin de palabra doble (divisible entre 4)
prrafo (divisible entre 10H)
direccin de pgina (divisible entre 100H)
PARA es usado comnmente para todos los tipos de segmentos. BYTE y WORD pueden ser
usados para segmentos que sern combinados dentro de otro segmento, por lo comn un segmento
de datos. DWORD es normalmente usada con procesadores 80386 y posteriores.
Combinar. Los operandos combinar NONE, PUBLIC, STACK y COMMON indican la
manera en que el enlazador maneja un segmento:
NONE (por omisin): El segmento ser separado lgicamente de otros segmentos, aunque
pueden estar adyacentes fsicamente. El segmento se supone tiene su propia direccin base.
PUBLIC: LINK carga segmentos PUBLIC del mismo nombre y clase adyacentes uno con
otro. Una direccin base se supone para tales segmentos PUBLIC.
STACK: LINK trata STACK lo mismo que PUBLIC. Debe haber definido al menos un
STACK en un programa .EXE enlazado. Si existe ms de una pila, el SP es puesto al inicio
de la primera pila.
C O M M O N : Si segmentos COMMON tienen el mismo nombre y clase, el enlazador les da
la misma direccin base. Durante la ejecucin, el segundo segmento se traslapa con el
primero. El segmetno ms grande determina el tamao del rea comn.
AT direccin-prrafo: El prrafo debe estar definido previamente. La entrada facilita la
definicin de etiquetas y variables en desplazamientos fijos dentro de reas fijas de memoria,
tal como la tabla de interrupciones en memoria baja o el rea de datos del BIOS en 40[0]H.
Por ejemplo, el cdigo en ROM define la posicin del bfer del despliegue de video como
VIDEO
RAM
SEGMENT
AT
0B800H
Directivas
509
El ensamblador crea un segmento mudo (ficticio) que proporciona, de hecho, una imagen de las
localidades de memoria.
' c l a s e ' . La entrada clase puede ayudar al enlazador a asociar segmentos con diferentes
nombres, identificar segmentos y controlar su orden. Clase puede contener cuaquier nombre
vlido, escrito entre apstrofos. El enlazador utiliza el nombre de los segmentos relacionados que
tienen el mismo nombre y clase. Ejemplos tpicos son 'Data' y 'Code'. Si define una clase como
' C o d e ' , el enlazador espera que el segmento contenga cdigo de instruccin. Tambin, el depurador CODEVIEW espera esa clase para el segmento de cdigo.
El enlazador combina los dos segmentos siguientes con el mismo nombre (CSEG) y clase
('Code') en un segmento fsico bajo el mismo registro de segmento:
Ensamblador
CSEG
mdulo 1
ASSUME
CSEG
Ensamblador
CSEG
mdulo 2
ENDS
CSEG
CS:CSEG
CS:CSEG
ENDS
Ya que puede querer controlar el orden de los segmentos dentro de un programa, es til
entender cmo el enlazador maneja el proceso. El orden original de los nombres de los segmentos
proporciona la secuencia bsica, que puede pasar por alto por medio del atributo PUBLIC y
nombres de clase. El ejemplo siguiente enlaza dos mdulos objeto (ambos mdulos contienen un
segmento llamado DSEGl con el atributo PUBLIC e idnticos nombres de clase):
Antes de enlazar los mdulos .OBJ:
mdulo 1
SSEG
SEGMENT
PARA STACK
mdulo 1
DSEGl
SEGMENT
mdulo 1
DSEG2
SEGMENT
PARA
mdulo 1
CSEG
SEGMENT
PARA 'Code'
mdulo 2
DSEGl
SEGMENT
mdulo 2
DSEG2
SEGMENT
PARA
mdulo 2
CSEG
SEGMENT
PARA 'Code'
Operadores y directivas
510
Captulo 27
mdulo
CSEG
SEGMENT
PARA
'Code'
mdulo
CSEG
SEGMENT
PARA
'Code'
mdulo
DSEG1
SEGMENT
PARA PUBLIC
mdulo
DSEG2
SEGMENT
PARA
mdulo
DSEG2
SEGMENT
PARA
mdulo
SSEG
SEGMENT
PARA STACK
'Data'
Puede anidar segmentos, siempre que un segmento anidado est contenido por completo
dentro del otro. En el ejemplo siguiente, SEG2 est contenido por completo dentro de SEG1:
SEGl
SEGMENT
r- SEG2
SEGMENT
L SEG2
ENDS
SEGl
ENDS
SEG1
inicio
SEG2
rea
SEGl r e s u m e
Directiva .SEQ
I
Esta directiva (que es por omisin), colocada cerca del inicio de un programa, le inidica al ensamblador
que deje segmentos en su secuencia original. Pasa por alto la opcin del ensamblador /A. (Vase
tambin la directiva .ALPHA.)
Directiva .STACK
Esta directiva simplificada de segmetno define la pila. Su formato general es
.STACK
[tamao]
j
f
El tamao por omisin de la pila es de 1,024 bytes, que puede pasar por alto. (Vase tambin laj
directiva .MODEL.)
j
Directiva STRUC
La directiva STRUC (STRUCT desde MASM 6.0) facilita la definicion de campos relacionadosdentro de una estructura. Su formato general es
511
Directivas
nom-estruct
STRUC
[campos
nom-estruct
definidos]
ENDS
Una estructura empieza con su nombre y la directiva STRUC y termina con el nombre y la
directiva ENDS. El ensamblador almacena los campos definidos uno despus del otro desde el
inicio de la estructura. Entradas vlidas son definiciones DB, DW, DD, DQ y DT con nombres de
campo opcionales.
En la figura 27-2, STRUC define una lista de parmetros llamada PARLIST para usarla con
la funcin OAH de la INT 21H, para ingresar un nombre va el teclado. Un enunciado subsecuente
asigna almacenamiento para la estructura, hacindola direccionable dentro del programa:
PARAMS
PARLIST
Los parntesis angulares (smbolo menor y mayor que) en el operando estn vacos en este ejemplo, pero puede usarlos para redefinir (pasar por alto) datos dentro de una estructura.
Las instrucciones pueden hacer referencia a una estructura de forma directa por su nombre.
Para referenciar campos dentro de una estructura, las instrucciones deben cualificarlas usando el
nombre asignado de la estructura (PARAMS, en el ejemplo), seguido por un punto que lo conecta
con el nombre del campo, como por ejemplo,
MOV AL , PARAMS . ACTLEN
Tambin puede usar el enunciado para asignar (PARAMS en la figura 27-2) para redefinir
el contenido de campos dentro de una estructura.
Directiva SUBTTL
La directiva SUBTTL (SUBTITLE desde MASM 6.0) hace que un subttulo de hasta 60 caracteres se imprima en la lnea 3 de cada pgina de un listado fuente en ensamblador. Puede codificar
SUBTTL cualquier nmero de veces. El formato general es
SUBTTL
texto
Directiva TEXTEQU
El formato general para esta directiva (introducida por MASM 6.0) es
TEXTEQU
[elemento-texto]
El operando elemento-texto puede ser una cadena literal, una constante precedida por el signo %
o una cadena que una macrofuncin ha regresado.
Directiva TITLE
La directiva TITLE hace que un ttulo de hasta 60 caracteres se imprima en la lnea 2 de cada
pgina de un listado fuente en ensamblador. Puede codificar TITLE una vez, al inicio. El formato
general es
TITLE
texto
512
Operadores y directivas
TITLE
CODESG
0000
0100
0100
EB
2C
0000
0001
0002
001B
19
00
0 0 1 9 [20]
0102
0103
0104
011D
19
00
0 0 1 9 [20]
57 6 8 61
73 2 0 7 4
6E 61 6D
012E
012E
0130
0133
0136
013A
013C
013E
0142
0144
0147
014A
014C
014C
42
74 20
68 65
65 3F
B4
BB
B9
8D
CD
B4
8D
CD
A0
40
0001
0011
16 0 1 1 D R
21
0A
16 0 1 0 2 R
21
0103 R
B8
CD
4C00
21
69
20
BEGIN:
P 2 7 D S T R U (COM)
Definicin de una estructura
SEGMENT PARA 'Code'
AS SUME CS:CODESG,DS :CODESG,SS:CODESG
ORG
100H
JMP
SHORT MAIN
PARLIST
MAXLEN
ACTLEN
NAMEIN
PARLIST
STRUC
DB
DB
DB
ENDS
PARAMS
PARLIST
PROMPT
DB
MAIN
PROC
MOV
MOV
MOV
LEA
INT
MOV
LEA
INT
MOV
MAIN
CODESG
and Groups:
a m e
CODESG
Symbols:
a m e
BEGIN
MAIN
PARAMS
PROMPT
,-Lista
L
N
L
L
25 D U P ( '
parmetros
')
/Asignacin
'What
is
de
almacenamient
t h e a m e ?'
NEAR
;Peticin de despliegue
AH,40H
BX, 01
CX, 17
/Longitud de la peticin
DX,PROMPT
,-Direccin d e l a i n d i c a c i n
21H
AH, 0AH
/Acepta entrada
DX, PARAMS
desde el teclado
21H
AL,PARAMS.ACTLEN
/Longitud de la entrada
AX,4C00H
/Sale al DOS
21H
BEGIN
Width
Shift
001B
0000
0001
0002
# fields
Mask
Width
0003
Length
014C
Align
PARA
Combine
NONE
Type
NEAR
PROC
0102
BYTE
Valu
0100
012E
CODESG
011D
Attr
CODESG
CODESG
Figura 27-2
de
25
p
MOV
INT
ENDP
ENDS
END
Estructuras y registros:
a m e
PARLIST
MAXLEN
ACTLEN
NAMEIN
Segments
Captulo 27
Initial
Class
'CODE
Length
0 01E
CODESG
Uso de la estructura
Directiva .XCREF
Esta directiva (llamada .NOCREF desde MASM 6.0) le indica al ensamblador que suprima la
tabla de referencias cruzadas. El formato general es
.XCREF
[nombre
[, n o m b r e ]
...]
Directivas
513
La omisin del operando provoca la supresin de todas las entradas en la tabla. Tambin puede
suprimir la referencia cruzada de elementos en particular. A continuacin estn unos ejemplos de
.XCREF y de .CREF.
XCREF
/Suprime
la referencia cruzada
.CREF
/Restablece
.XREF FIELDA,FIELDB
la referencia cruzada
Directiva .XLIST
Puede utilizar la directiva .XLIST (llamada .NOLIST desde MASM 6.0) en cualquier lugar en un
programa fuente para discontinuar la impresin de un programa ensamblado. Una situacin comn sera en donde los enunciados son comunes a otros programas y no necesita otro listado. La
directiva .LIST (por omisin) reasume el listado. Codifique ambas directivas sin operandos.
CAPTULO 28
El conjunto de instrucciones de la PC
OBJETIVO
E x p l i c a r el c d i g o de m q u i n a y p r o p o r c i o n a r u n a d e s c r i p c i n
del conjunto de instrucciones de la P C .
INTRODUCCIN
Este captulo explica el cdigo de mquina y proporciona una lista de las instrucciones simblicas
con una explicacin de su objetivo.
Muchas instrucciones tienen un objetivo especfico, de modo que una instruccin de lenguaje de mquina de un byte es adecuada. Veamos los ejemplos siguientes:
CDIGO DE
MQUINA
INSTRUCCIN
COMENTARIO
SIMBLICA
AX
Incrementa
AX
40
INC
50
PUSH
AX
Guarda
C3
RET
(cercano)
Regreso
corto
CB
RET
(lejano)
Regreso
lejano
desde
PD
STD
Pone
uno
bandera de
en
en
la
pila
la
AX
desde
un procedimiento
un
procedimiento
direccin
Ninguna de estas instrucciones hace referencia directa a memoria. Instrucciones que especifican
un operando inmediato, un registro de ocho bits, dos registros o una referencia a memoria son ms
complicadas y requieren de dos o ms bytes de cdigo de mquina.
514
515
Figura 28-1
Notacin de registro
El cdigo de mquina tiene una provisin especial para indicar un registro en particular y
otra para hacer referencia a memoria por medio de un byte de modo de direccionamiento.
NOTACIN DE REGISTROS
Las instrucciones que hacen referencia a un registro pueden contener tres bits que indican el
registro particular y el bit-w que seala si el ancho es de un byte (0) o de una palabra (1). Adems,
slo ciertas instrucciones pueden accesar los registros de segmentos. La figura 28-1 muestra las
notaciones completas de registros. Por ejemplo, el nmero 000 significa AH, si el bit w es 0 y AX
si es 1.
Aqu est el cdigo simblico y de mquina para una instruccin MOV con un operando
inmediato de un byte:
MOV
AH,00
I III
w reg = AH
En este caso, el primer byte del cdigo de mquina indica un ancho de un byte (w = 0) y se refiere
al registro AH (100). Veamos una instruccin MOV que contiene un operando inmediato de una
palabra, junto con su cdigo de mquina generado:
MOV
AX,00
111
w reg = AX
El primer byte del cdigo de mquina indica un ancho de una palabra (w = 1) y se refiere al
registro AX (000). En otras instrucciones, w y reg pueden ocupar posiciones diferentes.
El conjunto de instrucciones de la PC
516
mod
reg
r/m
Captulo 28
Adems, el primer byte del cdigo de mquina puede contener un bit que indica la direccin
de flujo. A continuacin est un ejemplo de la suma del AX al BX:
ADD
BX,AX
00000011
11
011
000
dw mod
reg
r/m
En el ejemplo, d = 1 significa que mod (11) y reg (011) describen el primer operando y r/m (000)
el segundo operando. Ya que w = 1, el ancho es de una palabra. Por lo tanto, la instruccin es
para sumar el AX (000) al BX (011).
El segundo byte del cdigo objeto indica la mayora de los modos de direccionamiento de
memoria. La seccin siguiente examina el modo de direccionamiento con mayor detalle.
Bits de modo
Los dos bits de modo distinguen entre direccionamiento de registro y de memoria. Enseguida se
explica su objetivo:
00
01
10
11
los bits r/m dan la opcin exacta de direccionamiento; no existe byte de desplazamiento.
los bits r/m dan la opcin exacta de direccionamiento; hay un byte de desplazamiento.
los bits r/m dan la opcin exacta de direccionamiento; hay dos bytes de desplazamiento.
r/m especifica un registro. El bit w (en el byte del cdigo de operacin) determina si es
una referencia a un registro de 8, 16 o 32 bits.
Bits reg
Los tres bits reg, en asociacin con el bit w, determinan el registro real de 8 o 16 bits.
Bits r/m
Los tres bits r/m (registro/memoria), en asociacin con los bits mod, determinan el modo de
direccionamiento, como se muestra en la figura 28-2.
r/m
000
001
010
011
100
101
110
111
mod=00
BX+SI
BX+DI
BP+SI
BP+DI
SI
DI
Direct
BX
mod=01
10
DS:[BX+SI+disp]
DS:[BX+DI+disp]
SS:[BP+SI+disp]
SS:[BP+DI+disp]
DS:[Sl+disp]
DS:[Dl+disp]
S S : [BP+disp]
DS:[BX+disp]
Figura 28-2
mod=ll
w=0
AL
CL
DL
BL
AH
CH
DH
BH
mod=ll
w=l
AX
CX
DX
BX
SP
BP
SI
DI
517
d = 1
w = 1
mod = 1 1
reg = 000
r/m = 011
0000 0011
11 000 011
II
M III III
dw mod reg r/m
BL 11110110
I
w
11 100 011
II III III
mod reg r/m
10100011. d d d d d d d d d d d d d d d d
palabra mem, AX
dw
byte-mem
11110110
I
II III III
w mod r e g r / m
El conjunto de instrucciones de la PC
518
Captulo 28
Para esta instruccin, aunque reg es 100, el multiplicando se supone estar en el AL. Mod = OC
indica una referencia a memoria y r/m = 110 significa una referencia directa a memoria. La
instruccin de mquina tambin contiene dos bytes subsecuentes que proporcionan el desplazamiento a la localidad de memoria.
El ejemplo siguiente ilustra la instruccin LEA, que especifica una direccin de una palabra:
LEA
DX,mem
10001101
00
010
110 x--x x x
I I III III
LEA
m o d r e g r/m
Reg = 010 designa el registro DX. Mod = 00 y r/m = 1 1 0 indican una referencia directa a una
direccin de memoria. Los dos bytes subsecuentes proporcionan el desplazamiento de esta localidad.
CONJUNTO DE INSTRUCCIONES
Esta seccin estudia el conjunto de instrucciones en orden alfabtico, aunque instrucciones muy
estrechamente relacionadas por conveniencia estn agrupadas juntas. Adems de la discusin
anterior del byte de modo y del bit w (ancho), las abreviaturas siguientes son importantes:
direc
direc-alta
direc-baja
datos
dato-alto
dato-bajo
despl
reg
519
Conjunto de instrucciones
binario en el AL para una subsecuente divisin binaria. Multiplica el AH por 10, suma el producto
al AL y pone en cero el AH.
Banderas. Afecta PF, SF y Z F . (AF, CF y OF estn indefinidas.)
Cdigo fuente. ADD (sin operando)
Cdigo objeto. 1 1 1 0 1 0 1 0 1 1 0 0 0 0 1 0 1 0 |
AAM: Ajusta ASCII despus de multiplicar
Operacin. Corrige el producto generado por la multiplicacin de dos nmeros BCD desempacados.
AAM divide el AL entre 10 y almacena el cociente en el AH y el residuo en el AL.
Banderas. Afecta P F , SF y Z F . (AF, CF y OF estn indefinidos.)
Cdigo fuente. AAM (sin operando)
Cdigo objeto. | 1 1 0 1 0 1 0 0 | ooooioio |
AAS: Ajusta ASCII despus de restar
Operacin. Corrige la diferencia de dos bytes ASCII en el AL. Si los cuatro bits de ms a la
derecha tienen un valor mayor que 9, o si la bandera CF es 1, AAS resta 6 del AL, resta 1 del AH
y pone en uno las banderas AF y C F . De otra forma, las banderas AF y CF son puestas en cero.
AAS siempre pone en cero los cuatro bits de ms a la izquierda del AL.
Banderas. Afecta AF y C F . (OF, PF, SF y ZF estn indefinidos.)
Cdigo fuente: AAS (sin operando)
Cdigo objeto, o o 1 1 1 1 1 1
ADC: Suma con acarreo
Operacin. Por lo comn es usado en suma de mltiples palabras binarias para acarrear un bit 1 al
siguiente paso de la aritmtica. ADC suma el contenido de la bandera CF (0/1) al primer operando, y despus suma el segundo operando al primero, al igual que ADD. (Vase tambin SBB.)
Banderas. Afecta A F , C F , OF, PF, SF y Z F .
Cdigo fuente. ADC {registro/memoria}, {registro/memoria/inmediato}
Cdigo objeto. Tres formatos:
Reg/mem con registro: | oooioodw|modreg/m|
Inmed a acumulador:
| o o o i o i o w | d a t o - - | d a t o si w = i|
Inmed a reg/mem:
| iooooosw|modoior/m|dato|dato
si sw=oi|
si sw=oi|
El conjunto de instrucciones de la PC
520
Captulo 28
Inmed a acumulador:
Inmed a reg/mem:
| ooiooodwmodreg/m|
| o o i o o i o w | d a t o - - | d a t o si w=i|
| iooooosw|mod i o o r / m j d a t o | d a t o
si sw=i|
BT
100,
BTC
111,
BTR
110,
BTS
101)
Conjunto de instrucciones
521
11101000|desp-bajo
|despl-alto|
|11111111|modOlOr/ml
|11111111|raod011r/m|
|10011010|desp-bajo|desp-alto|seg-bajo|seg-alto|
El conjunto de instrucciones de la PC
522
Captulo 28
| iooooosw|modiiir/m|dato
| d a t o s si sw=o |
523
Conjunto de instrucciones
| OlOOlreg |
Reg/memoria:
iiiiiiiiwimodooir/mi
Dividendo
(operando 1)
16-bit
32-bit
64-bit
AX
DX:AX
EDX:EAX
Divisor
(operando 2)
8-bit reg/memoria
16-bit reg/memoria
32-bit reg/memoria
Cociente
Residuo
Ejemplo
AL
AX
EAX
AH
DX
EDX
DIV BH
DIVCX
DIV ECX
El conjunto de instrucciones de la PC
524
Captulo 28
Tamao
Dividendo
(operando 1)
16-bit
32-bit
64-bit
AX
DX:AX
EDX:EAX
Divisor
(operando 2)
8-bit reg/memoria
16-bit reg/memoria
32-bit reg/memoria
Cociente
Residuo
Ejemplo
AL
AX
EAX
AH
DX
EDX
IDIV BH
IDIV CX
IDIV ECX
Conjunto de instrucciones
525
Tamao
Multiplicando
(operando 1)
Multiplicador
(operando 2)
Producto
Ejemplo
8-bt
16-bit
32-bit
AL
AX
EAX
8-bit registro/memoria
16-bit registro/memoria
32-bit registro/memoria
AX
DX:AX
EDX:EAX
IMUL BL
IMUL BX
IMUL ECX
Reg/memoria:
|010 00reg|
|iiiiiiiw|modooor/m|
ENT: Interrupcin
Operacin. Interrumpe el procesamiento y transfiere el control a uno de las 256 direcciones
(vector) de interrupcin empezando en el segmento 0, desplazamiento 0. INT realiza lo siguiente:
(1) guarda en la pila las banderas y restablece las banderas IF y TF; (2) guarda en la pila el CS y
coloca la palabra de orden alto de la direccin de interrupcin en el CS; y (3) guarda en la pila el
El conjunto de instrucciones de la PC
526
Captulo 28
Conjunto de instrucciones
527
El conjunto de instrucciones de la PC
528
Captulo 28
11101011|--despl--|
11101001|despl-bajo|despl-alto|
11111111|modlOOr/m|
]
1
11111111|modl01r/m|
11101010|despl-bajojdespl-altojseg-bajo
seg
alto |
Conjunto de instrucciones
529
El conjunto de instrucciones de la PC
530
Captulo 28
I 1 1 0 0 0 1 0 0 I m o d r e g r/m
0 0 0 0 1 1 1 1 I 1 0 1 1 0 1 0 0 I m o d r e g r/ml
I 0 0 0 0 1 1 1 1 I 1 0 1 1 0 1 0 1 m o d r e g r/ml
I 0 0 0 0 1 1 1 1 I 1 0 1 1 0 0 1 0 I m o d r e g r/ml
Conjunto de instrucciones
531
El conjunto de instrucciones de la PC
532
Captulo 28
100 0 0 1 0 W | m o d r e g r / m
llOOOllw j modOOOr/m j
1011wreg|
101000
datos--|datos
datos--|datos
si
w=l |
0w|dir-baja|dir-alta|
1010001w|dir-baja|dir-alta|
10001110|modOsgr/mj
(seg
seg
reg)
10001100|modOsgr/m
(seg
seg
reg)
Conjunto de instrucciones
533
Tamao
Multiplicando
(operando 1)
8-bit
16-bit
32-bit
AL
AX
EAX
Multiplicador
(operando 2)
8-bit registro/memoria
16-bit registro/memoria
3 2 - b i t registro/memoria
Producto
Ejemplo
AX
DX:AX
EDX:EAX
MUL BL
MUL BX
MUL ECX
534
El conjunto de instrucciones de la PC
Captulo 28
| ooooiodw | m o d r e g r / m |
o o o o n 0w d a t o s - - | d a t o s s i w = l |
i ioooooswimodooir/m--datos--datos
si w = i i
Conjunto de instrucciones
Registro:
Segmento reg:
Reg/memoria:
535
| 0 1 0 1 1 r e g |
| 0 0 0 s g l l l |
110001111
| 0 0 0 s g l l 0 |
Reg/memoria:
| 0 1 0 1 0 r e g |
i i i i m |modiior/m|
El conjunto de instrucciones de la PC
536
Captulo 28
! H O l O O c w ! mod011r/m |
(si c = 1 , e l c o r r i m i e n t o e s t e n C L )
537
Conjunto de instrucciones
1 1 1 1 0 0 1 1
| n o o i o i o | dato-bajo | dato-alto |
El conjunto de instrucciones de la PC
538
Captulo 28
| H O l O O c w | modlllr/m |
si
cuenta est
en C L )
si
swsoizl
539
Conjunto de instrucciones
Si una condicin probada es verdadera, la operacin establece el byte operando a uno, de otra
forma lo pone en cero. Un ejemplo es:
CMP
AX,BX
SETE
CL
/si es igual,
pone el CL en 1,
en caso contrario en 0
m i i o o i
El conjunto de instrucciones de la PC
540
Captulo 28
Conjunto de instrucciones
541
si w = i |
reg r/m
XLAT/XLATB: Traducir
Operacin. Traduce bytes en formatos diferentes, como de ASCII a EBCDIC. Se define una
tabla, se carga su direccin en el BX y despus se carga el AL con el valor que ser traducido. La
operacin utiliza el AL como un desplazamiento dentro de la tabla, selecciona el byte de la tabla
y lo almacena en el AL. (XLATB es un sinnimo para XLAT.)
Banderas. No las afecta.
Cdigo fuente. XLAT[AL] (AL operando es opcional)
Cdigo objeto. 1 1 0 1 0 1 1 1
XOR: Disyuncin (OR) exclusiva
Operacin. Realiza una disyuncin excluyeme sobre los bits de los dos operandos. Ambos operandos
son bytes, palabras o palabras dobles (80386 y posteriores), que el XOR compara bit a bit. Si
ambos coinciden, el bit en el primer operando se pone en cero; si los bits comparados son diferentes el bit en el primer operando se pone en uno. (Vase tambin AND y OR.)
Banderas. Afecta CF (0), OF(0), PF, SF y Z F . (AF est indefinido.)
Cdigo fuente. XOR {registro/memoria}, {registro/memoria/inmediato}
Cdigo objeto. Tres formatos:
Reg/mem con registro: | o o n o o d w | m o d reg r/m|
Inmed a reg/mem:
| ioooooow|mod n o r / m | d a t o
Inmed a acumulador:
|oonoiow|dato
|datos si
|datos si w=i|
w=i|
APNDICE A
Este apndice proporciona los pasos para convertir entre formatos hexadecimal y decimal. La
primera seccin muestra cmo convertir A7B8 hex al decimal 42,936, y la segunda seccin
muestra cmo convertir 42,936 de regreso a A7B8 hex.
160
+ 7
Multiplicar por 16
x 16
167
2,672
+ 11
2,683
542
543
Multiplicar por 16
16
42,928
Sumar el dgito siguiente, 8
+8
Nmero decimal
42,936
Tambin puede utilizar una tabla de conversin. Para A7B8H, piense en el dgito de ms a
la derecha (8) como la posicin 1, el siguiente a la izquierda (B) como la posicin 2, el siguiente
(7) como la posicin 3 y el de ms a la izquierda (A) como la posicin 4. Consulte a tabla A-l y
localice el valor para cada dgito hexadecimal:
Para
Para
Para
Para
la posicin
la posicin
la posicin
la posicin
1
2
3
4
(8), columna 1
(B), columna 2
(7), columna 3
(A), columna 4
=
8
=
176
=
1,792
= 40,960
Nmero decimal
42,936
C O N V E R S I N DE D E C I M A L A H E X A D E C I M A L
Para convertir el nmero decimal 42,936 a hexadecimal, primero divida 42,936 entre 16; el
residuo se convierte en el dgito hexadecimal de ms a la derecha, 6. Ahora divida el cociente,
2,683, entre 16; el residuo, 11 o B, se convierte en el siguiente dgito hexadecimal hacia la
izquierda. Desarrolle el nmero hexadecimal a partir de los residuos de cada paso de la divisin.
Contine de esta manera hasta que el cociente sea cero. Los pasos son como sigue:
OPERACIN
COCIENTE
RESIDUO
HEXADECIMAL
42,936/16
2,683/16
167/16
10/16
2,683
167
10
0
8
11
7
10
8
B
7
A
(ms a la derecha)
(ms a la izquierda)
Tambin puede utilizar la tabla A-l para convertir de decimal a hexadecimal. Para el nmero decimal 42,936, localice el nmero que sea igual o el siguiente menor que l. Anote el nmero
hexadecimal equivalente y su posicin en la tabla. Reste el nmero decimal de ese dgito hexadecimal
de 42,936, y localice la diferencia en la tabla. E' procedimiento funciona como sigue:
DECIMAL
HEX
42,936
-40,960
A000
Diferencia
Reste l siguiente nmero ms pequeo
1,976
-1,792
700
Diferencia
Reste el siguiente nmero ms pequeo
184
-176
B0
Diferencia
Nmero hexadecimal final
A7B8
H
e
X
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
Dec
H
e
X
0
4,096
8,192
12,288
16,384
20,480
24,576
28,672
32,768
36,864
40,960
45,056
49,152
53,248
57,344
61,440
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
Dec
H
e
X
0
256
512
768
1,024
1,280
1,536
1,792
2,048
2,304
2,560
2,816
3,072
3,328
3,584
3.840
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
Dec
H
e
X
D
e
c
0
16
32
48
64
80
96
112
128
144
160
176
192
208
224
240
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
APNDICE B
El trmino ASCII significa American Standard Code for Information Interchange, "cdigo estndar
estadounidense para intercambio de informacin". La tabla B-l lista la representacin de todos los
256 cdigos de caracteres ASCII (OOH a FFH), junto con sus representaciones hexadecimales.
Las categoras son:
00-1FH
20-7FH
80-FFH
A continuacin estn los cdigos de control desde OOH hasta 1FH; los que estn entre
parntesis no se imprimen:
HEX
00
03
06
09
OC
0F
12
15
CARCTER
(Nulo)
Corazn
Espada
(Tabulador)
(Avanza pgina)
(Shift in)
(Dev ctl 2)
(Reconocimiento neg)
HEX
01
04
07 .
0A
0D
10
13
16
CARCTER
Carita sonriente
Diamante
(Beep)
(Avance de lnea)
(Return)
(Lnea de datos esc)
(Dev ctl 3)
(Sincr. ociosa)
HEX
02
05
08
0B
0E
11
14
17
CARCTER
Carita sonriente
Club
(Retroceso)
(Tab vertical)
(Shift out)
(Dev ctl 1)
(Dev ctl 4)
(Fin de trans. de bloque )
545
Dec
H
e
X
0
268,435,456
536,870,912
805,306,368
1,073,741,824
1,342,177,280
1,610,612,736
1,879,048,192
2,147,483,648
2,415,919,104
2,684,354,560
2,952,790,016
3,221,225,472
3,489,660,928
3,758,096,384
4,026,531,840
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
Dec
H
e
X
0
16,777,216
33,554,432
50,331,648
67,108,864
83,886,080
100,663,296
117,440,512
134,217,728
150,994,944
167,772,160
184,549,376
201,326,592
218,103,808
234,881,024
251,658,240
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
Dec
H
e
X
Dec
0
1,048,576
2,097,152
3,145,728
4,194,304
5,242,880
6,291,456
7,340,032
8,388,608
9,437,184
10,485.760
11,534,336
12,582,912
13,631,488
14,680,064
15,728,640
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
0
65,536
131,072
196,608
262,144
327,680
393,216
458,752
524,288
589,824
655,360
720,896
786,432
851,968
917,504
983,040
APNDICE C
Palabras reservadas
El ensamblador reconoce algunas palabras con un significado especial; puede usar estas palabras
slo bajo condiciones prescritas. Las palabras que el ensamblador reserva pueden ser clasificadas
en cuatro categoras:
Si se utilizan para definir datos, muchas de las palabras reservadas que siguen pueden confundir al
ensamblador o causar un error al ensamblar.
Nombres de registros
AH, AL, AX, BH, BL, BP, BX, CH, CL, CS, CX, DH, DI, DI, DL, DS, DX, EAX, EBP,
EBX, ECX, EDI, EDX, EIP, ES, ES, ESI, FS, GS, IP, SI, SP, SS
Instrucciones simblicas
AAA, AAD, AAM, AAS; ADC, ADD, AND, ARPL, BOUND, BSF, BSR, BTn, CALL,
CBW, CDQ, CLC, CLD, CLI, CLTS, CMC, CMP, CMPSn, CWDn, DAA, DAS, DEC,
DIV, ENTER, ESC, HLT, IDIV, IMUL, IN, INC, INSw, INT, INTO, IRET, JA, JAE, JB,
547
546
(Cancelar)
19
(Escape)
1C
(Separador de registro) IF
00
01
02
03
04
05
06
07
08
09
0A
0B
OC
OD
OE
OF
10
_ 11
12
13
14
15
16
17
18
19
1A
IB
1C
ID
1E
IF
*
*
ii
1
20
21
22
23
24
25
26
27
28
29
2A
2B
2C
2D
2E
2F
30
31
32
33
34
35
36
37
38
39
3A
3B
3C
3D
3E
3F
1
II
#
$
O,
"5
&
1
' (
*
+
/
0
1
2
3
4
5
6
7
8
9
:
<
=
>
40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F
50
51
52
53
54
55
56
57
58
59
5A
5B
5C
5D
5E
5F
(Fin de medio)
(Separador de archivo)
(Separador unit)
A
B
C
D
E
F
G
H
I
J
K
L
M
N
0
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
60
61
62
63
64
65
66
67
68
69
6A
6B
6C
6D
6E
6F
70
71
72
73
74
75
76
77
78
79
7A
7B
7C
7D
7E
7F
a
b
c
d
e
f
g
h
i
j
k
1
m
n
o
P
q
r
s
t
u
V
w
X
y
z
80
81
82
83
84
85
86
87
88
89
8A
8B
8C
8D
8E
8F
90
91
92
93
94
95
96
97
98
99
9A
9B
9C
9D
9E
9F
a
9
i
i
i
ae
o
Pt
/
1A
ID
AO
Al
A2
A3
A4
A5
A6
A7
A8
A9
AA
AB
AC
AD
AE
AF
B0
Bl
B2
B3
B4
B5
B6
B7
B8
B9
BA
BB
BC
BD
BE
BF
(Sustituir)
(Separador de grupo)
r-
Apndice B
i
TI
J
"|
1
]
11
=1
1
CO
Cl
C2
C3
C4
C5
C6
C7
C8
C9
CA
CB
CC
CD
CE
CF
DO
Dl
D2
D3
D4
D5
D6
D7
D8
D9
DA
DB
DC
DD
DE
DF
L
-L
-r
\
L
[
f
=
$
=L
-U^r
-rr
lL
F
|r
]
=h
-J
jr
|
-
E0
El
E2
E3
E4
E5
E6
E7
E8
E9
EA
EB
EC
ED
EE
EF
F0
Fl
F2
F3
F4
F5
F6
F7
F8
F9
FA
FB
FC
FD
FE
FF
&
r
7T
E
O
M
T
e
Q
5
00
0
e
n
+
/
n
2
APNDICE D
Este apndice cubre las reglas para ensamblar, enlazar, generar archivos de referencias cruzadas
y convertir programas .EXE a .COM. La versin de ensamblador de Microsoft es MASM, la de
Borland es TASM y la de SLR System es OPTASM, todas ella son similares. Desde la versin 6.0
de Microsoft utiliza el comando ML, que realiza un ensamblado y enlace en un comando. Los
ejemplos en este apndice utilizan la unidad D; los usuarios de otras unidades pueden sustituir la
letra y ruta apropiadas.
ENSAMBLANDO UN PROGRAMA
Puede usar una lnea de comando para solicitar un ensamblado, aunque MAMS tambin proporciona indicaciones (prompts).
Ensamblando con una lnea de comando
El formato genera para usar una lnea de comando para ensamblar es
MASM/TASM [opciones] f uente [, ob j eto] [, listado] [,refcrz]
Palabras reservadas
548
Apndice C
JBE, JCXZ, JE, JECXZ, JG, JGE, JL, JLE, JMP, JNA, JNAE, JNB, JNBE, JNE, JNG,
JNGE, JNL, JNLE, JNO, JNP, JNS, JNZ, JO, JP, JPE, JPO, JS, JZ, LAHF, LAR, LDS,
LEA, LEA VE, LES, LFS, LGDT, LGS, LIDT, LLDT, LMSW, LOCK, LODSn, LOOP,
LOOPE, LOOPNE, LOOPNZ, LOOPZ, LSL, LSS, LSS, LTR, MOV, MOVSn, MOVSX,
MOVZX, MUL, NEG, NOP, NOT, OR, OUTn, POP, POPA, POPAD, POPF, POPFD,
PUSH, PUSHAD, PUSHF, PUSHFD, RCL, RCR, REN, REP, REPE, REPNE, REPNZ,
REPZ, RET, RETF, ROL, ROR, SAHF, SAL, SAR, SBB, SCASn, SETnn, SGDT, SHL,
SHLD, SHR, SHRD, SIDT, SLDT, SMSW, STC, STD, STI, STOSn, STR, SUB, TEST,
VERR, VERRW, WAIT, XCHG, XLAT, XOR
Directivas
ALIGN, .ALPHA, ASSUME, .CODE, COMM, COMMENT, .CONST, .CREF, .DATA,
.DATA?, DB, DD, DF, DOSSEG, DQ, DT, DW, ELSE, END, ENDIF, ENDM, ENDP,
ENDS, EQU, .ERRnn, EVEN, EXITM, EXTRN, .FARDATA, .FARDATA?, GROUP, IF,
IF1, IF2, IFB, IFDEF, IFDIF, IFE, IFIDN, IFNB, IFNDEF, INCLUDE, INCLUDELIB,
IRP, IRPC, LABEL, .LALL, .LFCOND, .LIST, LOCAL, MACRO, .MODEL, AME,
ORG, OUT, PAGE, PROC, PUBLIC, PURGE, RADIX, RECORD, REPT, SALL,
SEGMENT, .SEQ, .SFCOND, .STACK, STRUC, SUBTTL, .TFCOND, TITLE, .XALL,
.XCREF, .XLIST
Operadores
AND, BYTE, COMMENT, CON, DUP, EQ, FAR, GE, GT, HIGH, LE, LENGTH, LINE,
LOW, LT, MASK, MOD, NE, NEAR, NOT, NOTHING, OFFSET, OR, PTR, SEG, SHL,
SHORT, SHR, SIZE, STACK, THIS, TYPE, WHILE, WIDTH, WORD, XOR
Ensamblando un programa
551
Opciones de ensamblador
Las opciones de ensamblador para MASM, TASM y OPTASM incluyen las siguientes:
/A
/C
/D
/E
/H
/L
/ML
/MU
/MX
/N
/R
/S
IT
/V
/Wn
/Z
/ZD
/ZI
Puede solicitar opciones tanto en modo de peticin o de lnea de comando. Para peticiones,
por ejemplo, podra codificar MASM/A/V[Enter], y despus teclee el nombre del archivo de la
manera usual. O puede teclear las opciones en cualquier lnea de peticin; por ejemplo, como
Fuente noraarch
[.ASM]:
[Enter]
Las opciones /A/V le indican al ensamblador que escriba segmentos en orden alfabtico y despliegue diagnstico adicional al final del ensamblado.
Caractersticas adicionales de Turbo Assembler
Turbo Assembler le permite ensamblar varios archivos, cada uno con sus propias opciones, en
una lnea de comando. Tambin puede usar los comodines del DOS (* y ?). Para ensamblar todos
los programas fuente en el directorio actual, teclee TASM *. Para ensamblar todos los archivos
550
Apndice D
Objeto, proporciona un archivo OBJ. La unidad o ruta y el nombre del archivo pueden ser
los mismos o diferentes a los de la fuente.
Listado, provee de un archivo .LST que contiene los cdigos fuente y objeto. La unidad o
ruta y el nombre del archivo pueden ser los mismos o diferentes a los del fuente.
Refcrz, provee un archivo generado con los smbolos para un listado de referencias cruzadas.
La extensin es .CRF para MASM y .XRF para TASM. La unidad o ruta y el nombre del
archivo pueden ser los mismos o diferentes.
Este ejemplo escribe todos los archivos:
MASM
D:nombre,
ASM,D:nombre.
OBJ,D:nombre,
LST,D:nombre.
CRF
El siguiente comando abreviado permite, por omisin, los valores para los archivos objeto,
de listado y de referencias cruzadas, todos con el mismo nombre:
MASM
D:nomarchivo,
D:,D:,D:,
Este ejemplo solicita un archivo de referencias cruzadas pero no un archivo con el listado:
MASM
D:nomarchivo,
D:,,D:
filename
[ .ASM] :
Object
filename
[source.OBJ]:
Source
listing
[NUL.LST]:
Cross-reference
[NUL.CRF]:
Source filename identifica el archivo fuente. Teclee la unidad o ruta (si no es por omisin)
y el nombre del archivo fuente, sin la extensin ASM.
Object filename pregunta por el archivo objeto. La indicacin supone el mismo nombre de
archivo, aunque se podra cambiar. Para obtener un archivo objeto en la unidad D, teclee D:
y presione Enter.
Source listing proporciona un listado del ensamblador, aunque la indicacin supone que no
se quiere. Para obtener un listado en la unidad D, teclee D: y presione Enter.
Cross-reference provee de un listado de referencias cruzadas, aunque la peticin supone que
no se quiere. Para obtener una en la unidad D, teclee D: y presione Enter.
Para las ltimas tres peticiones, slo presione Enter si quiere aceptar los valores por omisin.
Enlace de un programa
553
archxref,archref
D:ASMPROG,D:
Uso de peticiones
Puede teclear slo CREF o TCREF sin lnea de comando. TCREF slo despliega el formato
general para el comando y una explicacin de sus opciones, mientras que CREF muestra estas
peticiones:
Cref
fllname
List filename
[.CRF]:
[cross-ref.REF]:
Para la primera peticin, teclee el nombre del archivo sin la extensin .CRF. Para la segunda
peticin, puede teclear la unidad y/o la ruta y aceptar el nombre del archivo por omisin.
ENLACE DE UN PROGRAMA
El enlazador de Microsoft es LINK y el de Borland es TLINK. LINK y TLINK aceptan lneas de
comando para solicitar un enlace. LINK tambin proporciona peticiones.
Enlace con una lnea de comandos
El formato general para usar una lnea de comando para enlazar es
LINK/TLINK
[opciones]
objfile,exefile[,mapfile][,libraryfile]
552
Apndice D
fuente PROG1.ASM, PROG2.ASM, etctera, teclee TASM PROG?. Puede teclear grupos (o
conjuntos) de nombres de archivos, con cada grupo separado por un punto y coma. El siguiente
comando ensambla PROG A y PROGB con la opcin /C y PROGC con la opcin /A:
TASM
/C
PROGA
PROGB;
/A
PROGC
[opciones]
nomarchs
[ [opciones]
nomarchs]
. . .
[/opciones e n l a c e ]
Align
Combine
Class
La columna ame da los nombres de todos los segmentos y grupos, en orden alfabtico. La
columna length da el tamao en hexadecimal, de cada segmento. La columna align da el tipo de
alineacin, tal como BYTE, WORD o PARA. Combine lista el tipo combinar definido, tal como
STACK para una pila, NONE en donde no est codificado tipo, PUBLIC para definiciones externas, o una direccin hexadecimal para tipos AT. La columna class lista los nombres de clase de
segmento, como estn codificados en la instruccin SEGMENT.
T a b l a de smbolos.
Type
Valu
Attribute
La columna ame lista los nombres de todos los elementos definidos, en orden alfabtico. La
columna type da el tipo, como sigue:
Opciones de EXE2BIN
555
LINK /CO nomarch
TLINK nomarch
...
...
/T archobj,archcom,CON
d:xreffile,d:reffile
[.CRF]:
[filename.REF]:
Para la primera indicacin, teclee el nombre del archivo .CRF, tal como D:EXASM1. Para la
segunda indicacin, puede teclear slo el nombre de la unidad y aceptar el nombre de archivo por
omisin. Esta seleccin hace que CREF escriba un archivo de referencias cruzadas llamado
EX ASM 1. REF en la unidad D.
OPCIONES DE EXE2BEN
El programa EXE2BIN del DOS convierte mdulos .EXE generados por MASM en mdulos
.COM, dado que el programa fuente fue originalmente codificado de acuerdo con los requisitos
.COM. Introduzca el comando siguiente:
554
Apndice C
Mapfile proporciona la generacin de un archivo con extensin .MAP que indica la localidac
relativa y el tamao de cada segmento y cualquier error que LINK ha encontrado. Un errot
comn es el fallo al definir el segmento de la pila. Ingresando CON le indica al ensamblado]
que muestre el mapa en la pantalla (en lugar de escribirlo en disco) de modo que pueda vei
de forma inmediata los errores.
Libraryfile proporciona la opcin de bibliotecas.
Para enlazar ms de un archivo objeto en un mdulo ejecutable, combnelos en uno como:
LINK D : PROGA+D : PROGB+D : PROGC
Modules
Run File
List File
Libraries
[.OBJ]:
[EXASM1.EXE]:
[NUL.MAP]:
[.LIB]:
Object Modules pregunta por el nombre(s) del mdulo(s) objeto que sern enlazados; s
omite la extensin, por omisin es .OBJ.
Run File solicita el nombre del archivo que ser ejecutado y permite por omisin el nombre
del archivo objeto. Slo necesita teclear la unidad y/o la ruta.
List File proporciona el archivo del mapa, aunque por omisin es N U L . M A P (esto es, sir
mapa). Al responder CON le indica al enlazador que despliegue el mapa en la pantalla, un*
seleccin adecuada.
Libraries pregunta por la opcin de bibliotecas, que est fuera del alcance de este libro.
Para las ltimas peticiones, slo presione Enter para aceptar los valores por omisin. E
ejemplo siguiente le dice al ensamblador que produzca archivos .EXE y .CON:
Object Modules
Run File
[.OBJ]:
[ASMPROG.EXE]:
List File
[NUL.MAP]:
Libraries
[.LIB]:
D:ASMPROG
D:
CON
[Enter]
[Enter]
[Enter]
[Enter]
APNDICE E
El programa DEBUG en el disco del DOS es til para escribir programas muy pequeos para
depurar programas en lenguaje ensamblador y para examinar el contenido de un archivo o de la
memoria. Puede ingresar uno de dos comandos para iniciar DEBUG:
1. Para crear un archivo o examinar memoria, teclee DEBUG sin especificar archivo.
2. Para modificar o depurar un programa (.COM o .EXE) o para modificar un archivo teclee
DEBUG con una especificacin de archivo, como DEBUG D:PROGC.COM.
El DOS carga a DEBUG en la memoria y DEBUG muestra un guin (-) como una indicacin. El rea de memoria para su programa es conocida como un segmento de programa. Los
registros CS,DS,ES y SS son inicializados con la direccin del prefijo de segmento de programa
(PSP) y su rea de trabajo empieza en PSP + 100H.
Una referencia a una direccin de memoria puede estar en trminos de un segmento y un
desplazamiento, tal como DS:120, o slo un desplazamiento, como 120. Tambin puede hacer
referencias directas a las direcciones de memoria, como 40:417, en donde 40[0]H es el segmento
y 417H es el desplazamiento. DEBUG supone que todos los nmeros ingresados estn en
hexadecimal, de modo que no tiene que teclear la H al final. Las teclas Fl y F3 funcionan para
DEBUG igual que para el DOS; esto es, Fl duplica el comando anterior un carcter a la vez y F3
duplica todo el comando anterior. Tambin DEBUG no distingue entre letras maysculas y minsculas.
A continuacin est una descripcin de cada comando DEBUG, en orden alfabtico.
557
556
D:nomarch
Apndice C
D:nomarch.COM
El primer operando es el nombre del archivo .EXE, que teclea sin extensin. El segundo operando
es el nombre del archivo .COM; puede cambiar el nombre, pero asegrese de codificar la extensin .COM. Borra los archivos .OBJ y .EXE.
559
C 050 L30 300
C 050 080
300
[direccin]
o D[rango]
Puede especificar una direccin inicial o una direccin inicial junto con un intervalo. La omisin
de un intervalo o longitud hace que se tome 80H. Ejemplos del comando D son:
D 200
Despliega
80H bytes
D CS:150
Despliega
D DS:20 L5
D 300 32C
80H bytes
empezando en DS:200H
empezando en CS:150H
E (ingresar).
Ingresa datos o instrucciones de mquina. Por omisin el registro es DS y
el formato general es
E direccin
[lista]
La operacin permite dos opciones: reemplazar bytes con aquellos de la lista o permitir la edicin
secuencial de bytes. Ejemplos de la primera opcin son los siguientes:
E 105 13 3A 21
E CS:211 21 2A
E 110
'cualquiera'
empezando en DS:105H
La operacin espera a que usted ingrese algo. Ingrese uno o ms bytes de valores hexadecimales,
separados por un espacio, empezando en DS: 12CH. Las cadenas de caracteres aceptan apstrofos
y comillas.
F (llenar). Llena un intervalo de localidades de memoria con valores de una lista. Por
omisin el registro es el DS. El formato general es
F intervalo
lista
Estos ejemplos llenan localidades en memoria empezando en DS:214H con bytes repeticiones de
'SAM':
558
Apndice E
[direccin]
El ejemplo siguiente crea un programa en lenguaje ensamblador que consiste en cinco instrucciones. Codifique las instrucciones en ensamblador (pero no los comentarios); a la izquierda,
DEBUG genera el segmento de cdigo (mostrado aqu como XXXX:) y un desplazamiento iniciando en 0100H:
A
(o A
100)
[Enter]
[Enter]
Explicacin
xxxx:0100
MOV
CX, [10D]
xxxx:0104
ADD
CX,1A
xxxx: 0107
MOV
xxxx:010B
JMP
100
[Enter]
Regresa
xxxx:010D
DW 2500
[Enter]
Define
[Enter]
[10D] , C X
Obtiene
Suma
[Enter]
[Enter]
un
contenido
valor
Almacena
Fin
del
CX
al
en
10D
inmediato
en
10D
inicio
constante
comando
Como DEBUG pone el IP a 100H a causa del tamao de PCP las instrucciones empiezan en 100H.
La ltima tecla Enter (esto es, dos en sucesin) indican a DEBUG finalizar el programa. Ahora
puede usar el comando U (desensamblar) para ver el cdigo de mquina y el comando T (rastrear)
para ejecutarlo.
Puede cambiar cualquiera de las instrucciones anteriores teniendo cuidado que la longitud de
la nueva instruccin sea igual a la de la anterior. Por ejemplo, para cambiar el ADD en 104H por
SUB, introduzca
A
xxxx:0104
104
SUB
[Enter]
CX,1A
[Enter]
[Enter]
Cuando reejecuta el programa el IP an est incrementado. Utilice el comando R para restablecerlo a 100H. Utilice Q para salir.
Observe que puede usar DB y DW para definir datos.
C (comparar). Compara el contenido de 2 bloques de memoria. El registro por omisin es
el DS y el formato general es
C
[rango]
[direccin]
Puede codificar el comando de una de dos formas: (1) una direccin inicial (comparar desde), una
longitud y una direccin inicial (comparar a); o (2) una direccin inicial y una direccin final
(comparar desde) y una direccin inicial (comparar a). Estos ejemplos comparan bytes que inician
el DS:050 con bytes que inician en DS:300:
561
El ejemplo siguiente carga 15H sectores, empezando en CS: 100 de la unidad 0 (A), iniciando en el sector 20H:
L 100 0 20 15
La operacin L regresa al BX:CX el nmero de bytes cargados. Para un archivo .EXE, DEBUG
ignora el parmetro de la direccin (si existe) y utiliza la direccin que carga en el encabezado
.EXE. Tambin quita el encabezado; para conservarlo, primero renombre el archivo con una
extensin diferente.
M (mover). Mueve (o copia) el contenido de localidades de memoria. Por omisin el
registro es el DS y el formato general es
M
intervalo direccin
Estos ejemplos copian los bytes empezando en DS:050H hasta 150H en la direccin que empieza
en DS:400H:
M DS:50 L100 DS:400
M DS:50
Utiliza un intervalo
150 DS:400
D:SAM.COM
La operacin pone el nombre de CS:80 en el PSP. El primer byte de CS:80 contiene la longitud
(OAH), seguida por el espacio y la especificacin de archivo (espec-arch). Entonces, puede utilizar L (cargar) o W (escribir) para leer o escribir el archivo.
O (Salida).
P (Proceed). Efecta una llamada a una subrutina (CALL), iteracin (LOOP), interrupcin (INT) o repite una cadena de instruccin (REP) hasta la siguiente instruccin. El formato
general es
P
[=direccin]
[valor]
R (registro).
formato general es
[nom-registro]
560
F
214
L21
'SAM'
Utiliza
una
214
234
'SAM'
Utiliza
un
longitud
rango,
de
214
Apndice E
21H
hasta
234H
[=direccin]
direccin
[direccin
...]
La entrada = direccin proporciona una direccin opcional de inicio. Las otras entradas proporcionan hasta 10 puntos de interrupcin. El ejemplo siguiente le indica a DEBUG que ejecuta hasta
la localidad 11 A:
G
11A
H (hexadecimal). Muestra la suma y diferencia de dos nmeros hexadecimales, codificado como H valor. La longitud mxima es de cuatro dgitos hexadecimales. Por ejemplo, H 14F 22
despliega el resultado 171 (suma) y 12D (diferencia).
I (entrada).
dir-de-puerto.
L (cargar). Carga un archivo o sector de disco en memoria. Existen dos formatos generales:
1. Carga un archivo con nombre:
L
[direccin]
Utilice el parmetro direccin para hacer que L cargue empezando en una localidad especfica.
La omisin de la direccin hace que L cargue en CS:100. Para cargar un archivo, observe
que ya se le debe haber puesto un nombre (vase N):
N
espec-arch
Nombre
Carga
del
el
archivo
archivo
en
CS:100H
[direccin
[unidad
inicio
nmero]]
Direccin proporciona la localidad de memoria para cargar los datos. (Por omisin es CS: 100.)
Unidad identifica la unidad de disco, en donde 0 = A, 1 = B, etctera.
Inicio especifica el nmero hexadecimal del primer sector por cargar. (Este es un nmero
relativo, en donde el cilindro 0, pista 0, sector 1, es el sector relativo 0.)
Nmero da el nmero hexadecimal de sectores consecutivos por cargar.
563
El rea especificada debe contener cdigo vlido de mquina, que la operacin muestra como
instrucciones simblicas. A continuacin se presentan tres ejemplos:
U 0100
U 100
140
si hubo
Note que DEBUG no traduce de forma apropiada algunas instrucciones de salto condicional,
aunque se ejecutan correctamente.
W (escribir). Escribe un archivo desde DEBUG. Primero debe ponrsele nombre al archivo, si no estaba ya cargado. El registro por omisin es el CS y el formato general es
W
[direccin
Escriba archivos slo con la extensin .COM, ya que W no da soporte al formato .EXE. (Para
modificar un programa .EXE, puede cambiar la extensin de manera temporal.) El ejemplo siguiente utiliza W sin operandos y coloca el tamao del archivo en la pareja BX:CX (primero
asegrese que el BX es cero):
N espec-arch
Nombre del
archivo
R CX
Solicita el registro CX
longitud
Escribe el archivo
562
Apndice E
R IP
R F
EN UNO
desbordamiento
direccin
signo
cero
acarreo
EN CERO
nv
up
pl(+)
nz
nc
0 V
dn
ng(-)
zr
cy
intervalo
lista
Si los caracteres son encontrados, la operacin enva sus direcciones; de otra forma no responde
El ejemplo siguiente busca la palabra "VIRUS" empezando en DS:300 en los siguientes 20001
bytes:
S
300
2000
"VIRUS"
Este ejemplo busca desde CS: 100 hasta CS:400 por un byte con 51H:
S
CS:100
400
51
T (rastrear). Ejecuta un programa en modo de un solo paso. Observe que, por lo comn
debe utilizar P (proceder) para rastrear a lo largo de las instrucciones INT. El registro por omi
sin es la pareja CS:IP y el formato general es
T
[=direccin]
[valor]
La entrada opcional = direccin le indica a DEBUG en dnde inicia el rastreo y el valor opciona
le indica el nmero de instrucciones por rastrear. La omisin de los operandos provoca qui
DEBUG ejecute la instruccin siguiente y despliegue los registros. A continuacin se presenta]
dos ejemplos:
TT
'
10
Ejecuta
Ejecuta
la
instruccin
las
siguientes
siguiente
16
(10H)
instrucciones
[direccin]
[rango]
qy Q
ry R
s y S
tyT
uy U
vy V
w y W
xy X
yy Y
z y Z
Barra espaciadora
25
26
32
31
18
19
10
13
IF
14
16
2F
11
2D
15
2C
39
TECLAS DE FUNCIN
Fl
F2
F3
F4
F5
F6
F7
F8
F9
FIO
FU
F12
NORMAL
3B 00
3C 00
3D 00
3E 00
3F
00
40
00
41
00
42
00
43
00
44
00
85
00
86
00
SHIFT
54
00
55
00
56
00
57
00
58
00
59
00
5A 00
5B 00
5C 00
5D 00
87
00
88
00
CTRL
5E
00
5F
00
60
00
61
00
62
00
63
00
64
00
65
00
66
00
67
00
89
00
8A 00
ALT
68
00
69
00
6A 00
6B 00
6C 00
6D 00
6E
00
6F
00
70
00
71
00
8B 00
8C 00
TECLADO NUMRICO
NORMAL
Ins y 0
52
00
End y 1
4F
00
Flecha abajo y 2
50
00
PgDn y 3
51
00
Flecha arriba y 4
4B 00
5 (teclado numrico)
4C 00
Flecha a la derecha y 6 4D 00
Home y 7
47
00
Flecha arriba y 8
48
00
PgUp y 9
49
00
+ (gris)
4E
2B
SHIFT
52
30
4F
31
50
32
51
33
4B
34
4C
35
4D 36
47
37
48
38
49
39
4E
2B
CTRL
92
00
75
00
91
00
76
00
73
00
8F
00
74
00
77
00
8D 00
84
00
90
00
ALT
kyK
lyL
m y M
ny N
oy 0
py P
6B
6C
6D
6E
6F
70
71
72
73
74
75
76
77
78
79
7A
20
565
25
26
32
31
18
19
10
13
IF
14
16
2F
11
2D
15
2C
39
4B
4C
4D
4E
4F
50
51
52
53
54
55
56
57
58
59
5C
20
25
26
32
31
18
19
10
13
IF
14
16
2F
11
2D
15
2C
39
0B
OC
0D
0E
OF
10
11
12
13
14
15
16
17
18
19
1A
20
25
26
32
31
18
19
10
13
IF
14
16
2F
11
2D
15
2C
39
00
00
00
00
00
00
00
00
00
4E
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
20
01
02
03
04
05
06
07
08
09
00
APNDICE F
En las listas siguientes, las teclas estn agrupadas en categoras. En cada una, las columnas
muestran el formato para una tecla normal (no en combinacin con otra tecla) y el formato cuando
est combinado con las teclas Shift, Ctrl y Alt. Bajo las columnas encabezadas por "Normal",
"Shift", "Ctrl" y "Alt" estn dos bytes hexadecimales tal como aparecen cuando la operacin del
teclado las enva a los registros AH y AL. Por ejemplo, al presionar la letra "a" el normal enva
1EH al AH para el cdigo de rastreo 61H y en el AL para el carcter ASCII. Cuando se oprime
junto con la tecla Shift ("A"), la letra enva lEh y 41H respectivamente. Los cdigos de rastreo
85H y superiores son para el teclado extendido de 101 teclas.
LETRAS
NORMAL
a y A
by B
c y C
dy D
e y E
fy F
gy G
hy H
ie I
1E
30
2E
20
12
21
22
23
17
24
jyJ
564
61
62
63
64
65
66
67
68
69
6A
SHIFT
1E
30
2E
20
12
21
22
23
17
24
41
42
43
44
45
46
47
48
49
4A
CTRL
1E
30
2E
20
12
21
22
23
17
24
01
02
03
04
05
06
07
08
09
0A
ALT
1E
30
2E
20
12
21
22
23
17
24
00
00
00
00
00
00
00
00
00
00
4B
4D
48
52
53
EO
EO
EO
EO
EO
567
4B
4D
48
52
53
EO
EO
EO
EO
EO
73
74
8D
92
93
EO
EO
EO
EO
EO
9B
9D
98
A2
A3
00
00
00
00
00
Las teclas de control tambin tienen identificacin de cdigos de rastreo, aunque el BIOS no las
enva al bfer del teclado. A continuacin estn sus cdigos de rastreo:
CapsLock
NumLock
ScrollLock
Shift (Izquierdo)
Shift (Derecho)
Alt
Ctrl
PrtScreen
3A
45
46
2A
36
38
ID
37
566
4A
53
37
2D
00
2A
FILA SUPERIOR
NORMAL
' y ly !
2y @
3y#
4y $
5 y %
6y "
7 y &
8 y *
9y (
Oy )
29
60
02
31
03
32
04
33
05
34
06
35
07
36
08
37
09
38
0A 39
0B
30
OC 2D
0D 3D
-y
= y +
TECLAS DE OPERACIN
NORMAL
Esc
Retroceso
Tab
Enter
01
0E
OF
1C
PUNTUACIN
NORMAL
[y {
ly}
; y
' y "
:
\y 1
, y <
. y>
/y?
1A
IB
27
28
2B
33
34
35
IB
08
09
OD
5B
5D
3B
27
5C
2C
2E
2F
4A
53
37
2D
2E
2A
SHIFT
29
02
03
04
05
06
07
08
09
OA
OB
OC
OD
7E
21
40
23
24
25
5E
26
2A
38
29
5F
2B
SHIFT
01
OE
OF
1C
IB
08
00
OD
SHIFT
1A
IB
27
28
2B
33
34
35
7B
7D
3A
22
7C
3C
3E
3F
8E
93
96
00
00
00
CTRL
03
00
07
1E
OC
IF
CTRL
01
OE
94
1C
IB
7F
00
OA
CTRL
1A
IB
IB
ID
2B
1C
4A
00
37
00
Apndice F
ALT
29
78
79
7A
7B
7C
7D
7E
7F
80
81
82
83
00
00
00
00
00
00
00
00
00
00
00
00
00
ALT
01
OE
A5
1C
00
00
00
00
ALT
1A
IB
27
28
2B
33
34
35
00
00
00
00
00
00
00
00
A continuacin estn las teclas duplicadas en los teclados ampliados (las primeras dos entradas son caracteres ASCII y el resto son teclas del cursor):
TECLA
NORMAL
Diagonal
Enter
Home
End
PageUp
PageDown
Flecha abajo
EO
EO
47
4F
49
51
50
2F
OD
EO
EO
EO
EO
EO
SHIFT
EO
EO
47
4F
49
51
50
2F
OD
EO
EO
EO
EO
EO
CTRL
95
EO
77
75
84
76
91
00
OA
EO
EO
EO
EO
EO
ALT
A4
A6
97
9F
99
Al
AO
00
00
00
00
00
00
00
Capitulo 4
569
CAPTULO 2
2-4. (a) El prefijo del segmento del programa (PSP).
2-5. (a) CS = la direccin del segmento de cdigo; IP = la direccin del desplazamiento de la primera
instruccin, por lo comn cero.
2-7. (a) El DOS define la pila para un programa .COM.
2-8. (a) Dos bytes (una palabra).
2-9. (a) 5A302.
2-10. (a) 5B37A.
CAPTULO 3
3-1. Los comandos estn identificados al inicio del captulo.
3-2. (a)DDS:264;(c)EDS:200A8B3 64.
3-3. (a)B82946.
3-4. ECS: 101 54.
3-5. (a) MOV AX, 3 0 04
ADD
AX,3000
NOP
CAPITULO 4
4-3. Nombre (de un elemento de dato) y etiqueta (de una instruccin).
4-4. (d) No vlido ya que inicia con un nmero; (e) vlido slo si se prefiere al registro AX.
4-6. (a) TITLE.
4-8. (a) Provoca alineacin de un segmento en una frontera, tal como la de un prrafo.
4-9. (a) Proporciona una seccin de cdigo relacionado, como una subrutina.
4-10. (a) END; (c) ENDS.
4-11. La directiva END le indica al ensamblador que no existen ms instrucciones por ensamblar; instrucciones
que hagan que el control regrese al sistema operativo son MOV AX,4C00H e INT 21H.
4-12. ASSUME SS:STKSEG,DS:DATSEG,CS:CDSEG.
4-15. (a)4;(c) 10; (e) 1.
4-16. TITLE 1 DB 'RGB Electronics'
4-17. (a) FLDA DD 73H
(c) FLDC DW ?
(e)FLDE DW 17, 19, 21, 26, 31
4-18. (a) ASCII 3238; (b) hex 1C.
4-19. (a) 28; (c) 3A732800.
CAPTULO 1
1-1.
1-2.
1-3.
1-4.
1-5.
1-6.
1-7.
1-8.
1-10.
'
568
1-12.
1-13.
1-15.
1-17.
Captulo 9
571
CAPTULO 8
8-1. (a) En el intervalo -128 a +127 bytes.
8-2. (a) En el intervalo -128 a +127 bytes. (b) El operando es un nmero de un byte que permite desde
OOH hasta 7FH (0 hasta +128) y de 80H a FFH (-128 a -1).
8-3. (a) 64B; (c) 5EA.
8-4. A continuacin se presentan algunas soluciones posibles:
MOV AX,00
MOV BX,01
MOV CX,12
MOV DX,0 0
B20 :
ADD AX,BX
MOV BX,DX
MOV DX,AX
LOOP B2 0
CAPITULO 9
9-1. (a) Rengln = 00 y columna .= 00
9-3. MOV
AX,0S0BH
; Peticin
MOV
MOV
CX,0C00H
MOV
DX,164H
INT
10H
9-4. MSSGE
DB
MOV
; la pantalla
AH,09H
;Request display
LEA
DX,MSSGE
; of date
INT
21H
570
CAPITULO 5
MOV
MOV
AX, D A T S E G
DS.AX
4OH
MOV
AL,4OH
SHL
AL,1
Desplazamiento
MOV
BL,22H
Multiplica
MUL
por
BL
la
izquierda
(Doble)
AL
22H
DB
40H
FIELDB
DB
22H
FIELDC
DW
CAPITULO 6
6-2. (a) El primer MOV mueve el valor inmediato 325AH; el segundo MOV mueve el contenido de las
localidades 325AH y 325BH al AX.
6-4. Mueve el contenido al CX de la localidad de memoria apuntada por la suma de la direccin de
desplazamiento en el BX, ms el SI, ms 4 (tcnicamente por DS:[BX + SI+4]).
6-5. (a) El procesador no puede mover datos directamente la localidad de una memoria a otra.
6-7.
(a)
MOV
AX,320
(c)
ADD
BX,40H
(e)
SHL FLDB, 1
(or S A L )
6-8. UseXCHNG.
6-9. Utilice LEA.
6-11. (a) Guarda en la pila las banderas, IP y CS, reemplaza las banderas IF y TF y almacena la direccin
de la interrupcin en el CS:IP.
CAPTULO 7
7-1. 64K.
7-4. Utiliza el rea alta del programa .COM o si es espacio no es suficiente ah, utiliza el final de la
memoria.
7-5. (a) EXE2BIN SAMPLE SAMPLE.COM.
573
Captulo 12
11-8. A cualquier presin o liberacin de una tecla.
11-10. (a) Localidad 40:1EH (41EH).
CAPITULO 12
12-1. (a) ES:DIyDS:SI
JCXZ
MOV
MOV
INC
INC
INC
INC
LOOP
label2: ...
label2
AX,[SI]
[DI], AX
DI
DI
SI
SI
labell
12-4. (a)
labell
12-5. Establezca el DF para un movimiento de derecha a izquierda. Para MOVSB, inicialice en NAME1 +9
y NAME2 + 9. Para MOVSW, inicialice en NAME1 +8 y en NAME2 + 8.
12-6. (a) CLD
Izquierda a derecha
MOV
CX, 20
LEA
SI,CONANME
LEA
DI,PRLINE
REP
MOVSB
Inicializa
para mover
2 0 bytes
Mueve
cadena
(c) CLD
LEA
SI,CONAME+2
LODSW
Izquierda a derecha
(e) CLD
CX, 2 0
2 0 bytes
LEA
SI,CONAME
Inicializa
LEA
DI,PRLINE
REPE
CMPSB
MOV
la direccin
Compara
cadena
PROC NEAR
Izquierda a derecha
CLD
MOV
CX,10
10 bytes
LEA
DI,AME1
Inicializa
la direccin
y el carcter de rastreo
H20 :
REPNE SCASB
Busca
JNE H3 0
, Encontr?
,-S,
JNE H2 0
MOV AL , 0 3
H30 :
RET
H10SCAS
ENDP
el siguiente byte
572
9-5.
DATE PAR
LABEL
BYTE
MAXLEN
DB
ACTLEN
DB
DATEFLD
DB
MOV
AH, OAH
;Espacio
para
diagonales
Enter
DUP('
;Peticin
LEA
DX,DATEPAR
INT
21H
de
de
datos
para
fijar
para
entrada
(c)
,-80
columnas
MOV
A L , 02
INT
10H
MOV
AH,060AH
/Peticin
MOV
B H , 07
/Video
MOV
CX,0000
/Pantalla
MOV
DX,184FH
INT
10H
el
modo
monocromtico
para
recorrer
10
lneas
normal
completa
A L , 04
/Diamante
MOV
B H , 00
/Pgina
MOV
BL, 0 1 0 1 1 0 1 0 B
/Verde
claro
MOV
CX, 05
/Cinco
veces
INT
10H
nmero
sobre
magenta
10-11. Primero establezca el modo grfico; despus utilice la INT 10H, funcin 0BH, para fijar el color del
fondo.
10-12. Primero establezca el modo grfico, despus lea el punto as:
MOV
AH,0DH
MOV
CX,13
MOV
DX,12
INT
10H
Peticin
para
leer
el
punto
Columna
Rengln
CAPITULO 11
11-1. (a) Localidad 40:17H (4127H).
11-2. (a) Entrada desde el teclado con repeticin en la pantalla. Requiere dos interrupciones si es una
funcin extendida.
11-4. (a) 48H; (c) 47H.
11-6. Utilice la funcin 00H o la 10H de la INT 16H, para ingresar y probar el cdigo de rastreo y utilice
la INT 10H para colocar el cursor.
575
Captulo 17
CAPITULO 15
15-2. TABLEX DW 50 DUP (' ').
15-3. (a) ITEMNO DB ' 0 6 7 1 0 7 1 4 7 2 1 7 2 4 '
(c) ITPRICE DW 9395,8225,9067,8580,1385
15-4. Los procedimientos siguientes constituyen una posible organizacin:
SUBRUTINA
B10READ
C10SRCH
D10MOVE
E10CONV
F10CALC
GIOCONV
K10DISP
PROPSITO
15-5. La rutina siguiente copia la tabla. Consulte la figura 15-7 para ordenacin de las entradas de la tabla.
SORTAB
DB
5 DUP(9 DUP(?))
LEA
SI,ITDESC
LEA
DI,SORTAB
la direccin de la tabla y
MOV
CX, 45
el nmero de caracteres
CLD
REP
Inicializa
Izquierda a derecha
MOVSB
Mueve
cadena
CAPTULO 16
16-1. 512.
16-4. (a) Un grupo de sectores (1, 2, 4 u 8) que el DOS trata como una unidad de espacio de almacenamiento
en disco.
16-5. (a) 40 cilindros x 9 sectores X 2 lados X 512 bytes = 368,640.
16-7. (a) Lado 0, pista 0, sector 1.
16-8. En el directorio, el primer byte del nombre de archivo es puesto a E5H.
16-11. (a) Posiciones 28-31 del directorio; (b) 0B4AH, almacenado como 4A0B.
16-12. (a) El primer byte (descriptor de medios) contiene F8H.
CAPITULO 17
17-1. (a) 02.
17-3. (b) M O V
AH,3CH
Peticin para
M O V
CX, 00
Archivo
crear
LEA
DX,PATH1
Cadena
INT
21H
Llama al DOS
JC
error
M O V
CUSTHAN,AX
Guarda el manejador
normal
ASCIIZ
574
12-8.
PATTERN
DB
DISPLAY
DB
03H,04H,05H,0B4H
80
DUP('
'),'$'
CLD
Izquierda
MOV
CX,20
20
LEA
SI, PATTERN
Inicializa
direccin
REP
MOVSW
derecha
bytes
Mueve
el
la
patrn
Despus utilice la funcin 09H de la INT 21H, para desplegar la variable DISPLAY.
CAPITULO 13
13-1. (a) 127 y 255.
13-3. (a) M O V AX , D A T A Y
ADD
AX D A T A X
MOV
D A T A Y , AX
; Suma DATAX
;
a DATAY
(a) M O V
AX, DATAX
MUL DATAY
;El
producto
est
en
el
DX:AX
(c) Vase la figura 13-4 para la multiplicacin de una palabra doble por una palabra.
13-7.
(a)
MOV
AX, D A T A X
MOV BL,25
,-Divide
DATAX
D I V BL
23
entre
CAPITULO 14
14-1. (a) ADD genera 6CH y AAA genera 0102H.
(c) SUB genera 02H y A AS no tiene efecto.
14-2.
LEA
SI,UNPAK
;Inicializa
MOV
CX,04
y 4
la
direccin
ciclos
B20 :
OR
INC
LOOP
[SI],30H
;Inserta
SI
ASCII
/Incrementa
B2 0
/Repite
para
el
byte
veces
14-3. Utilice como gua la figura 14-2, pero inicialice el CX con 03.
14-4. Utilice como gua la figura 14-3, pero inicialice el CX con 03.
14-5. (a) Convierta el decimal 46,328 a binario:
8X1 =
2 X 10 =
3 X 100 =
6 X 1000 =
4 X 10000 =
Decimal
Hex
8
20
300
6000
40000
8
14
12C
1770
9C40
B4F8
siguiente
Captulo 22
577
(b)
LEA
SI,NAMEFLD
;Inicializa el nombre
MOV
CX,longitud
; y la longitud
MOV
AH, 05H
,-Peticin para
MOV
DL, [SI]
,-Caracteres de nombre
INT
21H
INC
SI
B20 :
imprimir
LOOP B20
/Repetir
longitud veces
(c) Podra codificar un avance de lnea (OAH) al frente de la direccin. La solucin es similar a la
parte (b).
(e) Emita otro avance de pgina (OCH).
20-4. HEADING DB 13,10,15,'Title',12
20-5. (a) En el AH.
20-7. El CX no est disponible para realizar ciclos ya que el ciclo que imprime el nombre utiliza el CX.
Podra utilizar el BX as:
MOV
BX,05
/Establece 5 ciclos
DEC
BX
/Disminuye el
JNZ
C2 0
/Repite si an no es cero
C20 :
contador del
ciclo
C A P T U L O 21
21-1.
21-2.
21-3.
21-6.
(a) Unidad de medida para el movimiento del ratn en incrementos de 1/200 de una pulgada.
Todas estas funciones estn identificadas cerca del inicio del captulo.
Observe el efecto de las funciones 01H y 02H sobre la bandera.
Observe la figura que invierte los puertos paralelos LPT1 y LPT2.
C A P T U L O 22
22-1. La introduccin a este captulo da tres razones.
22-2. Los enunciados incluyen MACRO y ENDM.
22-5. (a) SALL.
22-6. (a)
MULTBY
MACRO
MULTPR, MULTCD
MOV
AL,MULTCD
MUL
MULTPR
ENDM
nombre-de-biblioteca
576
(a)
MOV
AH,3DH
;Peticin
MOV
A L , 00
;Slo
LEA
DX,PATH1
;Cadena
INT
21H
/Llama
JC
error
,-Si
MOV
CUSTHAN, AX
, G u a r d a m a n e j a d o r
para
abrir
lectura
ASCIIZ
al
hay
DOS
error,
sale
CAPTULO 18
Todas las preguntas para este captulo son ejercicios que implican el uso de DEBUG.
CAPTULO 19
19-2.
19-3.
19-5.
19-6.
f,i
AH,03H
;Peticin
MOV
AL, 0 3
;3
LEA
BX,OUTDSK
,-rea de s a l i d a
MOV
CH, 0 8
;Pista
MOV
CL,01
; S e c t o r 01
MOV
DH, 0 0
Cabeza
MOV
DL, 01
,-Unidad B
INT
13H
de
escritura
sectores
' * "
"'
08
:
3!
#0
CAPTULO 20
20-1. (a) 09.
20-3. (a) M O V
AH, 0 5H
MOV
DL,0CH
INT
21H
;Peticin
;Avance
de
para
imprimir
pgina
Captulo 26
C A P T U L O 25
25-1. Estos tipos se tratan al inicio del captulo en la seccin sobre interrupciones.
25-2. Estas lneas se tratan al inicio del captulo en la seccin sobre interrupciones.
25-3. (a) FFFF[0]H.
25-5. En 40[0]H.
25-6. (a) Estado del equipo; (c) segundo byte del estado del shift.
25-7. (a) Las direcciones de COM y COM2 (en secuencia inversa de bytes).
25-8. (a) INT OOH.
C A P T U L O 26
26-1. Las interrupciones de la 20H a la 3FH.
26-2. (a) 03H; (c) 30H o 3306H.
26-3. (a) Salida de impresora; (c) entrada que se enva al bfer del*teclado.
579
578
22-8. La definicin de la macro podra empezar con
BIPRINT
MACRO
PRTLINE,PRLEN
PRTLINE y PRLEN son argumentos mudos para la direccin y longitud, respectivamente, de la lnea
que ser impresa. Vase el captulo 20 para usar la INT 17H del BIOS para imprimir.
22-9. Observe que no puede utilizar un IF condicional para examinar por una divisin entre cero. Un IF
condicional funciona slo durante el ensamblado, mientras que la prueba debe ocurrir durante la
ejecucin del programa. Codifique las instrucciones en ensamblador tal como stas:
CMP
DIVISOR,00
;E1
divisor
JNZ
(pasa)
;No,
pasa
CALL
(rutina
de
mensaje
de
es
cero?
error)
CAPTULO 23
'
23-1.
23-2.
23-3.
23-4.
23-6.
23-7.
23-8.
23-9.
CAPTULO 24
24-1.
24-2.
24-4.
24-5.
24-6.
24-8.
24-9.
24-10.
24-11.
ndice
A
Abrir un archivo, 294, 297, 303, 318
Acarreo hacia/fuera del bit de signo,
5, 223
Acceso denegado, 150
Actual
fecha, 32, 42, 483
nmero de bloque, 316
nmero de registro, 316
581
ndice
un programa para ejecucin, 19,
22, 73
un programa, 455
un registro de segmento, 530
una cadena. Vase Instruccin
LODS
Cercana(o)
direccin, 102, 113, 114
llamada, 121, 413
procedimiento, 414
RET, 414
Cero a la extrema derecha para el
segmento de direccin, 11
Cerrar archivo, 294, 300, 318
CF (bandera). Vase Bandera de
acarreo
CGA (adaptador de video), 154, 157,
173, 180
Ciclo (ejemplo), 114
Cilindro, 283
Clasificacin de macros, 401
Cociente, 232
Cdigo de regreso, 57
Cdigos de rastreo, 185, 187, 188,
189, 190, 194, 195, 564
Columnas en pantalla, 137, 138
Comando DIR, 456
Comando LINK, 8 1 , 553
Comando M A S M , 73, 549
Comando ML, 81
Comando MODE, 75
Comando SORT (DOS), 300
Comando TASM, 7 3 , 549
Comando TCREF, 84, 553
Comando TLINK, 8 1 , 108, 553
Comentarios
en un programa, 49, 496
en una macro, 396
Comillas (en cadenas de caracteres),
62
C O M M A N D . C O M , 10, 20, 286, 438,
439
Comparacin
de datos en cadenas de caracteres,
200, 206
de datos, 118
instruccin de, 118, 522
Comparacin alfanumrica, 208
Compilador, 49
Comunicaciones
en BIOS, 476
en DOS, 482
en puerto, 476
Concatenacin (&) en macros, 402
Condicional
583
directivas de error, 498
directivas, 404
instrucciones de salto, 118
instrucciones de transferencia, 91
Conmutador de puertos de impresin,
390
Constante de palabra larga, 66
Constante numrica, 63, 64
Constante, 61
Contador de Mickey, 378, 383
Contador de posicin, 502
Contenido de una localidad de
memoria, 10
Control
carcter de, para impresin, 140,
146, 148
de datos, 330
teclas de, 183, 567
Control de dispositivo paralelo, 476
Control de E/S para dispositivos, 329,
485
Controlador (de discos), 283, 284
Conversin
de byte a palabra, 219
de decimal a hexadecimal, 543
de formato .EXE a .COM, 107
de formato ASCII a binario, 250,
253
de formato binario a ASCII, 250
de palabra a palabra doble, 522
Coordenada horizontal, 380
Coordenada vertical, 380
Copias de la FAT, 287
Coprocesador, 80x87, 237
Corchetes. Vase Operador de ndice
Correccin de una entrada en DEBUG,
37
Corrimiento
contador de, 507
de bits a la derecha, 128
de bits a la izquierda, 129
de bits, 127, 538, 539
para dividir, 236
para multiplicar, 231
valor del, 127
y redondeo de datos, 251
y rotacin de palabra doble, 131
Corrimiento a la derecha, 128
Corta(o)
direccin, 113, 114
entero, 238
real, 238
salto, 116
CRC (verificacin de redundancia
cclica), 328, 358
Crear
archivo en disco usando un
FCB, 316
archivo en disco, 294, 298. 299,
347
un subdirectorio, 338
CREF
comando, 84, 553, 555
directiva, 496
Ctrl+Break
direccin de salida, 440. 481
interrupcin, 478
peticin, 185
Ctrl + PrtSc, 475
Cursor
establecer, 11, 24, 55, 56, 58, 77,
82
tamao del, 159
D
Dato(s), 4, 37
bit, 2
bus de, 7, 8
definicin de, 61
elemento de, 61
instrucciones de transferencia de, 89
registro del segmento de. Vase
Registro DS
segmento de, 11, 24, 55, 56, 58,
77, 82
Datos comunes en subprogramas, 423
Datos de nmeros reales temporales,
238
Datos descriptivos, 4
Datos EBCDIC, 271
Datos no inicializados, 61
DEBUG
comando A, 29, 40
comando D, 29
comando E, 29, 32, 33, 38
comando G, 29
comando L, 292
comando N, 29, 43
comando P, 29, 41
comando Q, 29, 32
comando R, 29, 34
comando T, 29, 34
comando U, 29, 41
comando W, 29, 43
despliegue de memoria, 29
programa, 28, 557
DEBUG, comando M (mover), 561
DEBUG, comando A (ensamblar), 29,
558
582
tabla de manejadores de, 441
tamao de un, 316
rea de datos de tiempo terminado,
473
rea de datos del puerto paralelo, 470
rea de datos en un disco duro, 473
rea de memoria alta (HMA), 439
Argumento mudo en macros, 396
Aritmtica(o)
acarreo, 16, 223
desbordamiento, 223, 235
en registros de 32 bits, 222
informacin, 4, 217
instrucciones, 88, 217
operador, 488
Arreglo grfico mejorado. Vase EGA
ASCII
adicin, 243
ajustar antes de dividir. Vase
Instruccin A A D
ajustar despus de multiplicar..
Vase Instruccin A A M
ajustar despus de restar. Vase
Instruccin AAS
ajustar despus de sumar. Vase
Instruccin A A A
archivo, 307, 369
caracteres, 139, 165, 166, 197,
545
conjunto de caracteres, 546
datos, 7, 243, 2 7 1 , 272
divisin, 246
formato, 62, 2 4 1 , 242, 250
multiplicacin, 246
resta, 245
Asignacin de memoria, 453
Atributo
de archivo, 287, 343, 444
valor (pantalla), 138, 156, 161,
162, 165
Atributo de subrayado, 157
AUTOEXEC.BAT, 21
Aviso de derechos reservados, 31
ndice
Bandera de trampa (TF), 16, 101, 117
Bandera de verificacin de escritura,
335
Bandera InDOS, 466
Base
especificador de, 63
punto, 241, 253
BCD (decimal codificado en binario)
adicin, 248
formato, 241, 242, 250
valor, 67
Binario(a)
aritmtica, 4, 218
datos, 3, 217
resta, 5, 218
BIOS de bajo nivel, 136
BIOS, 9, 2 1 , 136
rea de datos, 20, 30, 353, 469, 470
byte de estado, 353
interrupciones, 469, 475
operaciones en disco, 352
Bit de signo, 5, 128, 218
Bit, 1, 2, 3, 89
de prueba, 520
instrucciones de corrimiento, 89
rastreo (bsqueda), 520
Bit-w (bit indicador del largo del
registro), 515
Bits de modo, 516
Bits r/m, 516
,, *
Bits reg (bits de registro), 516
585
ndice
memoria de acceso. Vase DMA
operando de memoria, 93
tabla de direccionamiento, 262
Directorios en disco, 285, 287, 292,
339, 346
Disco
archivos en, 294
rea de datos, 285, 286
rea de sistema, 285
rea de transferencia. Vase DTA
biblioteca en, 401
capacidad, 284
caractersticas, 282
controlador, 284, 358
estado de bsqueda, 472
estado del motor del, 472
estado, 472
parmetros de la unidad de, 359
procesamiento, 296
superficie del, 283
verificacin de escritura en, 328
Disco duro. Vase Disco
Disco flexible
rea de datos de la unidad de, 472
tipo de, 361
Dispositivo auxiliar, 148
Dispositivo, 148
Dividendo, 232
Divisin
ASCII, 246
binaria, 232, 523, 524
con signo. Vase Instruccin IDIV
entre cero, 235, 475
por corrimiento. 236
por resta, 235
sin signo. Vase Instruccin DIV
Divisin entre dos, 128
Dos puntos (:), para etiquetas, 113
DOS, 19, 21
administracin de memoria, 20, 437
bandera de ocupado, 466
bandera de versin, 484
cargador, 57, 78
comando SORT, 300
funciones INT 21H, 136, 481
interrupciones, 480
organizacin, 20
versin, 4 1 , 292, 439, 483, 484
DPB (bloque de parmetros de datos),
328, 329, 333
DTA (rea de transferencia a disco),
312, 317, 318, 442
Duplicar
un manejador de archivo, 344
un patrn, 211
DWORD
directiva. Vase DD
especificador de tipo, 412, 487
ndice
DEBUG, comando
DEBUG, comando
30, 559
DEBUG, comando
559
DEBUG, comando
DEBUG, comando
DEBUG, comando
446, 560
C (comparar), 558
D (desplegar), 29,
E (introducir), 29,
F (llenar), 559
G (Ir), 29, 560
H (hexadecimal),
Desplazamiento
v, <U
en un archivo, 311
<* >
en un segmento, 12, 25, 26, 93,
99, 102, 115
Despliegue de video grfico de color,
137, 157, 174
Despliegue en pantalla, 137, 148
Determinar el tipo de adaptador de
video, 178
Determinar si el medio es removible,
331
DF (bandera). Vase Bandera de
direccin
DF (definir palabra larga), 6 1 , 64. 66
Diagnstico (ensamblador), 85
Direccin
-, ,
alineacin, 101
!j
de un segmento, 491
>.>:
de una instruccin, 50
de una localidad de memoria, 10
del PSP, 485
desplazamiento, 94
.*-:.
Direccin cilindro-pista, 283
Direccin con numeracin par. Vase
Lmite de una palabra
Direccin efectiva, 419
Direccin final, 481
s ",
Direccionamiento
capacidad, 12
(
en modo byte, 515
operando, 92
;
Direccionamiento indirecto, 94
Directiva %OUT, 503
Directiva .ALPHA, 495
Directiva .CODE, 6 1 , 495
s "
Directiva .CONST, 496
;v
Directiva .DATA, 496
Directiva .DOSSEG, 497
Directiva .ENDIF, 4 0 1 , 404
Directiva .ERR, 498
Directiva .EXIT, 61
Directiva .FARDATA, 500
ndice
H
Hexadecimal
aritmtica, 6
formato, 6, 63, 542
representacin, 6
tabla de conversin decimal a, 544
HMA (rea de memoria alta), 439
Hora
del da en que fue creado el
archivo, 288
del sistema, 475, 478, 483
I
IBMBIO.COM/IBMDOS.COM, 20
Identificacin de modelo, 32
Identificador, 50
IF (bandera). Vase Bandera de
interrupciones
Impresora
caracteres de control, 365, 373
estado, 374
puerto, 375, 389
Independencia de dispositivo, 19
ndice
operador, 25 26, 9 3 , 94, 489
registro, 15, 127
Informacin dependiente del pas, 488,
486
Inicializacin, 20, 470
Inicializar
el puerto de impresin, 375
el ratn, 379
el registro DS, 56, 78
un programa .COM, 107
un programa .EXE, 55
unidad, 360
Inicio del bfer, 195
Inmediato(s)
datos, 32
operando, 93, 97
Instalacin del manejador de interrupciones para sucesos del ratn, 383
Instruccin (es), 51
cola de, 8, 114
conjunto de, 88, 518
etiqueta de una, 113
registro de apuntador a, 14
Instruccin A A A , 243, 518
Instruccin A A D , 245, 246, 518
Instruccin AAM, 245, 246, 519
Instruccin A A S , 243, 245, 519
Instruccin A D C , 222, 519
Instruccin A D D , 35, 218, 519
587
Instruccin A N D , 125, 520
Instruccin CALL, 113, 121, 123,
124, 413, 520
Instruccin CBW, 219, 521
Instruccin CDQ, 521
Instruccin CLC, 222, 521
Instruccin CLD, 202, 521
Instruccin CLI, 521
Instruccin CMC, 521
Instruccin CMP, 118, 522
Instruccin CMPS, 200, 206, 522
Instruccin CMPSB, 208, 522
Instruccin CMPSD, 522
Instruccin CMPSW, 208, 522
Instruccin D A A , 248, 523
Instruccin D A S , 248, 523
Instruccin DEC, 99, 119, 523
Instruccin DIV, 232, 233, 523
Instruccin ESC (Escape), 524
Instruccin HLT, 524
Instruccin IDIV, 232, 233, 524
Instruccin IMUL, 224, 226, 230, 524
Instruccin IN, 195, 388, 525
Instruccin INC, 99, 525
Instruccin INT, 4 1 , 101, 136, 525
Instruccin INTO, 526
Instruccin IRET, 474, 526
Instruccin IRETD, 526
Instruccin JC, 120, 131, 527
Instruccin JE, 119, 120, 527
Instruccin JMP, 113, 114, 528
Instruccin JNC, 120, 528
Instruccin JNE, 101, 119, 120, 529
Instruccin JNZ, 119, 120, 529
Instruccin JS, 120, 530
Instruccin JZ, 119, 120, 527
Instruccin LAHF, 530
Instruccin LDS, 530
Instruccin LEA, 99, 100, 530
Instruccin LES, 530
Instruccin LFS, 530
Instruccin LGS, 530
Instruccin LOCK, 531
Instruccin LODS, 200, 204, 531
Instruccin LODSB, 204, 531
Instruccin LODSD, 531
Instruccin LODSW, 205, 531
Instruccin LOOP, 113, 116, 531
Instruccin LOOPD, 531
Instruccin LOOPW, 531
Instruccin LSS, 530
Instruccin MOV, 26, 32, 35, 77, 95,
532
Instruccin MOVS, 200, 202, 211, 532
Instruccin MOVSD, 532
586
de Pascal y ensamblador, 429
de un programa .COM, 108
de un programa .EXE, 73
de un programa, 49, 81
mapa de, 82, 451
Ensamblado(r)
con indicadores, 550
con una lnea de comando, 549
de un programa, 73
diagnstico, 85
lenguaje, 48
opciones, 74, 551
pasos, 74
programa (.ASM), 44, 48
Ensamblador de dos pasadas, 79
Ensamblador de Microsoft, 552
Entero largo, 238
Entrada
*.
rea de, 141
dispositivo de, 148
estado de, 330
Entrada/salida (E/S), 20
Entradas de una tabla de ordenamiento, 274
Equipo
determinacin del, 476
estado del, 30, 470
Error
i;
clase, 335
cdigo de correccin de, 360
cdigo de regreso de, 298
cuando se ensambla, 75
diagnstico de, desde un
ensamblador, 85
Error crtico
direccin de salida de, 440
manejador de, 481
Error de fase entre pasos (pases o
pasadas), 80, 86
ES:NOTHING, 55
Escribir
datos de control a una unidad, 330
directamente en un registro, 319
directamente un bloque, 320
en el bfer de sector, 361
en el bfer extendido de sector,
360
en sectores, 356
en teletipo, 164
en un pixel de punto, 176
en un registro, 299, 317
un archivo en disco, 298
un sector de disco, 331
Espacio en disco, 329
Especificacin de archivo, 342
ndice
Especificadores de tipo, 487
V. O
Establecer
?
rea de exclusin del apuntador,
384
atributo de archivo, 343
bandera de direccin. Vase
Instruccin STD
cursor, 138, 159
direccin de interrupcin, 464
direcciones del PSP, 485
dispositivo de informacin, 330
enlace con memoria superior, 448
error extendido, 486
estrategia de asignacin de
:
memoria, 448
fecha y hora de archivo, 346
fecha, 483
hora, 478, 483
-.i
identificacin de medios, 332
lmites horizontales para el
apuntador, 382
lmites verticales para el apuntador,
383
modo de video, 155, 159, 175
modo grfico, 175, 178
paletas de colores, 176
!
registros de las paletas, 177
sensibilidad del ratn, 384
tamao del cursor, 159
tipo de disco flexible, 361
tipo de recurso, 362
ubicacin del apuntador (para el
ratn), 380
velocidad doble de umbral, 384
Establecer/restablecer verificacin de
escritura en disco, 328
Estacionar las cabezas del disco, 362
Estado
byte de, 353, 354
de la impresora, 375
de las banderas, 16
del puerto de comunicaciones, 477
Estado Ctrl+ C, 484
Estado de detencin, 524
Estado de terminacin, 298
Estructura (esqueleto) de un programa
.EXE, 56
Estructura de tubera, 9
Etiqueta de volumen, 288
"rt
Etiqueta, 113
Exhibicin
. '->
de
de
de
de
589
ndice
03H entrada de comunicaciones,
482
04H salida de comunicaciones, 482
05H salida a la impresora, 373
06H teclado y despliegue directo,
186
07H entrada directa del teclado sin
eco, 186
08H entrada del teclado sin eco,
186
09H despliegue de una cadena de
caracteres, 139
OAH entrada del teclado mediante
bfer, 141, 186
OBH verificacin del estado del
teclado, 186
OCH limpiar el bfer y solicitar una
entrada, 187
ODH reinicializa la unidad de
disco, 326
OEH selecciona la unidad de disco
por omisin, 326
OFH abrir un FCB de un archivo,
318
10H cerrar un FCB de un archivo,
318
11H buscar la primer entrada que
coincida en un disco, 482
12H buscar la siguiente entrada que
coincida en un disco, 482
13H borrar un FCB de un archivo,
482
14H leer registro secuencial de un
FCB. 319
15H escribir registro secuencial de
un FCB, 317
16H crear un archivo FCB, 317
19H determinar la unidad de disco
por omisin, 327
1BH obtener informacin de la
unidad de disco por omisin, 327
1CH obtener informacin de una
unidad especfica, 327
1FH obtener bloque de parmetros
de la unidad por omisin, 328
21H leer directamente registro del
FCB, 319
22H escribir directamente registro
del FCB, 319
23H obtener el tamao de un
archivo FCB, 482
24H establecer el campo de
registro aleatorio de FCB, 482
25H establecer la direccin de la
tabla de interrupciones, 464, 482
ndice
588
Instrucciones JNG/JNGE, 120, 528
Instrucciones JNL/JNLE, 120, 528
Instrucciones JNO/JNP/JNS, 120, 529
Instrucciones JO/JPO, 120, 529
Instrucciones JP/JPE, 120, 530
Instrucciones LOOPE/LOOPZ, 116,
531
Instrucciones LOOPNE/LOOPNZ,
116, 532
Instrucciones MOVSB/MOVSW, 203,
532
Instrucciones M O V S X / M O V Z X . 96,
533
Instrucciones RCL/RCR, 130, 536
Instrucciones REPE/REPZ, 202, 536
Instrucciones REPNE/REPNZ, 202,
536
Instrucciones RETF/RETN, 537
Instrucciones STOSB/STOSW, 205,
540
INT 00H Divisin entre cero, 475
INT 01H Un solo paso, 475
INT 02H Interrupcin no enmascarable, 475
INT 03H Punto de interrupcin, 475
INT 04H Desbordamiento, 475
INT 05H Impresin de pantalla, 475
INT 08H Cronmetro, 475
INT 09H Interrupcin desde el teclado,
195, 466, 475
INT 0BH Control del puerto C O M ,
475
INT 0CH Control del puerto COM2,
475
INT 0DH Control de dispositivos en
paralelo, 476
INT 0EH Control del disco flexible,
476
INT 0FH Control de dispositivos en
paralelo, 476
INT 10H Funciones de exhibicin de
video
00H establece modo del video,
155, 159, 173, 175
01H establece tamao del cursor,
159
02H establece posicin del cursor,
138, 159
03H lee la posicin del cursor, 160
04H lee la posicin de la pluma
ptica, 175
05H selecciona la pgina activa,
160
06H avanza una pantalla, 161
07H retrocede una pantalla, 162
ndice
Lnea NMI, 474
Lista de enlace, 275
Llamada
a un procedimiento, 121
a un segmento, 413, 414
Llamada en un segmento. 413
Llamada entre segmentos, 414
M
Macro(s)
biblioteca de, 401
comentarios en una, 396
cmo escribir una. 393
definicin de una, 394
expansin de una, 394
instrucciones, 393
Manejador de eventos (ratn), 383
Manejador no vlido de archivo, 148,
150
Mapa de memoria, 9, 2 1 , 438
Mquina
cdigo de, 24, 33, 37, 515
lenguaje de, ejemplo, 32
lenguaje de, instruccin, 49
Marcador de fin de archivo (1A hex),
310
MCGA (adaptador de video), 154, 157
Medios
bloque de, 154, 157, 180
byte descriptor de, 334, 335
identificacin de, 332
tipo de, 362
Medios removibles, 331
Megabyte, 3
Mejor ajuste, 447
Memoria de slo lectura. Vase ROM
Memoria. 1, 9. 10, 25
administracin de, 20, 437
bloques de, 444
determinacin del tamao, 3 1 , 476
estrategia de asignacin de, 447
modelo, 59, 502
referencias, 26
registro de control de. 444
tamao de, del rea de datos, 471
Men, 191
Mickey, 378
Microsoft C, 432
Modelo COMPACT, 59, 502
Modelo de memoria LARGE, 59, 502
Modelo HUGE, 502
Modelo MDIUM, 59, 502
M o d e l o SMALL, 59, 502
Modelo TINY, 59, 502
591
Modificacin del bloque de memoria
asignado, 454
Modo (pantalla), 155, 164, 175
Modo condensado (impresora), 373
Modo de impresin enfatizado, 374
Modo de paso sencillo, 29, 117, 475
Modo de texto, 137, 155, 156
Modo expandido (impresin), 374
Modo grfico, 137, 157, 173, 174
Modo protegido, 59
Modo real, 7, 12, 439
Mover el apuntador de archivo, 311
Mover una cadena de caracteres.
Vase Instruccin MOVS
MSDOS.SYS, 20, 286, 438, 480
Multipalabra
aritmtica, 220
multiplicacin con, 226
Multiplicacin
datos ASCII, 246
datos binarios, 224, 226, 524, 533
por corrimiento, 231
N
Nivel ms alto de procesamiento en
disco, 294
Nivel ms bajo de procesamiento en
disco, 294
Nombre (de un elemento de informacin), 50, 61
Nombre de archivo para su anlisis
sintctico, 341
Nombre de archivo, 287, 341
Nombre de segmento TEXT, 60, 79
Nombre del segmento DATA, 60, 79
Notacin en complemento a dos, 4
Nmero de cabezas de lecturaescritura, 287
Nmero de la unidad fsica, 287
Nmero de unidad, 287
Nmero total de sectores, 287
Nmeros negativos, 4, 65, 258
O
Obtener
atributo de archivo, 343
direccin de la bandera de DOS
ocupado, 466
direccin de la lista interna del
DOS, 445
direccin del PSP, 443, 485
direcciones de interrupcin, 463
directorio actual, 339
ndice
590
4FH encuentra la siguiente entrada
de un directorio que cumpla un
criterio, 345
50H establece la direccin del PSP,
485
51H obtiene la direccin del PSP,
443, 485
52H obtiene la direccin de la lista
del DOS, 445
54H obtiene el estado de la
verificacin, 335
56H renombra un archivo, 346
57H obtiene/establece la fecha y
hora de un archivo, 346
5800H obtiene la estrategia de
asignacin de memoria, 447
5801H establece la estrategia de
asignacin de memoria, 448
5802H obtiene enlace con la
memoria superior, 448
5803H establece enlace con la
memoria superior, 448
59H obtiene cdigo extendido de
error, 335
5AH crea un archivo temporal, 347
5BH crea un archivo nuevo, 347
5CH bloqueo/desbloqueo del acceso
a un archivo, 486
5DH establece tabla ampliada de
errores, 486
5EH servicios de red de rea local,
486
5FH servicios de red de rea local,
486
62H obtiene la direccin del PSP.
486
65H obtiene informacin ampliada
del pas, 486
66H obtiene/establece pgina global
de cdigo, 486
67H establece el total mximo de
manejadores, 441
6CH abre archivos, 486
descripcin/listado, 42, 137, 481
INT 22H direccin de terminacin,
481
INT 23H direccin de Ctrl/break, 481
INT 24H Manejador de error crtico,
481
INT 25H lectura absoluta en disco,
321, 481
INT 26H escritura absoluta en disco,
321, 481
INT 27H termina pero permanece
residente, 481
i ! :
K
Kilobyte, 3
L
Lectura secuencial, 303, 318
Leer
archivo en disco, 303
atributo o carcter, 162
bfer del sector, 361
bfer extendido de sector, 360
carcter del teclado, 187, 188
caracteres grficos, 175
contadores de movimiento del
ratn, 383
datos de control de una unidad, 330
directamente un bloque, 320
estado del disco, 354
hora, 478
posicin de la pluma ptica, 175
posicin del cursor, 160
punto de pixel, 177
registro, 304, 319
sector en disco, 334
sectores, 354
Lejana (o)
direccin, 102, 113
instruccin, RET, 415
llamada, 122, 414
procedimiento, 414
Lenguaje de alto nivel, 49
Lenguaje de bajo nivel, 49
Liberar la memoria asignada, 454
Lmite de un prrafo, 10, 11, 22, 53,
412
Lnea A20, 439
Lnea inicial de rastreo, 159, 160