Sunteți pe pagina 1din 116

Captulo I: INTRODUCCIN

1.1. - NUMEROS BINARIOS, OCTALES Y HEXADECIMALES.


El sistema de numeracin utilizado habitualmente es la base 10; es decir, consta de 10 dgitos (0-9) que podemos colocar
en grupos, ordenados de izquierda a derecha de maor a menor!
"ada posicin tiene un #alor o peso de 10
n
donde representa el lugar contado por la derecha$
1%&' ( 1 ) 10
%
* % ) 10
+
* & ) 10
1
* ' ) 10
0
E)plcitamente, se indica la base de numeracin como 1%&'10!
En un ordenador el sistema de numeracin es binario -en base +, utilizando el 0 el 1- hecho propiciado por ser
precisamente dos los estados estables en los dispositi#os digitales que componen una computadora!
,n-logamente a la base 10, cada posicin tiene un #alor de +
n
donde es la posicin contando desde la derecha
empezando por 0$
101+ ( 1 ) +
+
* 0 ) +
1
* 1 ) +
0
,dem-s, por su importancia utilidad, es necesario conocer otros sistemas de numeracin como pueden ser
el octal (base .) el hexadecimal (base 1/)! En este 0ltimo tenemos, adem-s de los n0meros del 0 al 9, letras -normalmente
en ma0sculas- de la , a la 1!
2legar a un n0mero en estos sistemas desde base + es realmente sencillo si agrupamos las ci3ras binarias de % en %
(octal) o de 4 en 4 (he)adecimal)$
5ase + a base .$ 101 011+ ( &%.
5ase + a base 1/$ 0010 1011+ ( +51/
, la in#ersa, basta con#ertir cada dgito octal o he)adecimal en binario$
5ase . a base +$ +4. ( 010 100+
5ase 1/ a base +$ +41/ ( 0010 0100+
6e ahora en adelante, se utilizar-n una serie de su3i7os para determinar el sistema de numeracin empleado$
8u3i7o
5as
e
E7emplos
b +
01101010
b
o,q . 1'&o
d 10 '.9d
h 1/ /,&h
En caso de que no aparezca el su3i7o, el n0mero se considera decimal; es decir, en base 10!
1.!. - CAMBIO DE BASE.
9ese a que las con#ersiones entre base + base . 1/ son pr-cticamente directas, e)iste un sistema general para
realizar el cambio de una base a otra! El paso de cualquier base a base 10 lo #imos antes$
/,&h ( / ) 1/
+
* 10 ) 1/
1
* & ) 1/
0
:n#ersamente, si queremos pasar de base 10 a cualquier otra habr- que realizar sucesi#as di#isiones por la base tomar
los restos$
donde 4 es el 0ltimo cociente (menor que la base) los restantes dgitos son los restos en orden in#erso!
1.". - ESTRUCTURA ELEMENTAL DE LA MEMORIA.
1!%!1! - 5:;!
;oda la memoria del ordenador se compone de dispositi#os electrnicos que pueden adoptar 0nicamente dos estados,
que representamos matem-ticamente por 0 1! "ualquiera de estas unidades de in3ormacin se denomina BIT, contraccin
de <binar digit= en ingl>s!
1!%!+! - 5?;E!
"ada grupo de . bits se conoce como byte u octeto! Es la unidad de almacenamiento en memoria, la cual est- constituida
por un ele#ado n0mero de posiciones que almacenan btes! 2a cantidad de memoria de que dispone un sistema se mide en
@ilobtes (1 @b ( 10+4 btes), en Aegabtes (1 Ab ( 10+4 @b), Bigabtes (1 Bb ( 10+4 Ab), ;erabtes (1 ;b ( 10+4 Bb) o
9etabtes (1 9b ( 10+4 ;b)!
2os bits en un bte se numeran de derecha a izquierda de 0 a ', correspondiendo con los e)ponentes de las potencias
de + que re3le7an el #alor de cada posicin! Cn bte nos permite, por tanto, representar +&/ estados (de 0 a +&&) seg0n la
combinacin de bits que tomemos!
1!%!%! - D:552E!
"ada grupo de cuatro bits de un bte constitue un nibble, de 3orma que los dos nibbles de un bte se llaman nibble
superior (el compuesto por los bits 4 a ') e in3erior (el compuesto por los bits 0 a %)! El nibble tiene gran utilidad debido a que
cada uno almacena un dgito he)adecimal$
5inari
o
Ee)
!
6ecima
l
5inari
o
Ee)
!
6ecima
l
0000 0 0 1000 . .
0001 1 1 1001 9 9
0010 + + 1010 , 10
0011 % % 1011 5 11
0100 4 4 1100 " 1+
0101 & & 1101 6 1%
0110 / / 1110 E 14
0111 ' ' 1111 1 1&
1.#. - O$ERACIONES ARITM%TICAS SENCILLAS EN BINARIO.
9ara sumar n0meros, tanto en base + como he)adecimal, se sigue el mismo proceso que en base 10$
9odemos obser#ar que la suma se desa-
1010 1010b rrolla de la 3orma tradicional; es decir$
* 0011 1100b sumamos normalmente, sal#o en el caso de
-------------- 1 * 1 ( 10+ , en cuo caso tenemos un aca-
1110 0110b rreo de 1 (lo que nos llevamos)!
1.&. - COM$LEMENTO A DOS.
En general, se de3ine como #alor negati#o de un n0mero el que necesitamos sumarlo para obtener 00h, por e7emplo$
11h "omo en un bte solo tenemos dos nibbles, es
* 01h decir, dos dgitos he)adecimales, el resultado es
------ 0 (obser#ar cmo el 1 m-s signi3icati#o subraado
100h es ignorado)! 2uego 11h(-1! Dormalmente, el bit '
se considera como de signo , si est- acti#o (a 1)
el n0mero es negati#o!
9or esta razn, el n0mero .0h, cuo complemento a dos es >l mismo, se considera negati#o (-1+.) el n0mero 00h,
positi#o! En general, para hallar el complemento a dos de un n0mero cualquiera basta con calcular primero
su 'o(pl)()to a uo, que consiste en cambiar los unos por ceros los ceros por unos en su notacin binaria; a
continuacin se le suma una unidad para calcular el 'o(pl)()to a *o+! "on una calculadora, la operacin es m-s
sencilla$ el complemento a dos de un n0mero A de bits es !
n
-A!
Ftro 3actor a considerar es cuando se pasa de operar con un n0mero de cierto tamaGo (e7!, . bits) a otro maor
(pongamos de 1/ bits)! 8i el n0mero es positi#o, la parte que se aGade por la izquierda son bits a 0! 8in embargo, si era
negati#o (bit m-s signi3icati#o acti#o) la parte que se aGade por la izquierda son bits a 1! Este 3enmeno, en cua
demostracin matem-tica no entraremos, se puede resumir en que el bit m-s signi3icati#o se copia en todos los aGadidos$ es
lo que se denomina la),t)+-. *)l +-/o$ los dos siguientes n0meros son realmente el mismo n0mero (el -%10)$ 1101+ (4
bits) 11111101+ (. bits)!
1.0. - A1RU$ACIONES DE BYTES.
;ipo 6e3inicin
9alabra + btes contiguos
6oble palabra
+ palabras contiguas (4
btes)
"u-druple
palabra
4 palabras contiguas (.
btes)
9-rra3o 1/ btes
9-gina +&/ btes, 1/ @b, etc!
8egmento /4 @btes
1.2. - RE$RESENTACIN DE LOS DATOS EN MEMORIA.
1!'!1! - DCAEHF8 5:D,H:F8$ m-)imo n0mero representable$
;ipo 8in signo
1 bte +&&
+
btes
/&!&%&
4
btes
4!+94!9/'!+9&
.
btes
1.!44/!'44!0'%!'09!&&1!/
1&
;ipo 9ositi#o Degati#o
1 bte 1+' -1+.
+
btes
%+!'/' -%+!'/.
4
btes
+!14'!4.%!/4' -+!14'!4.%!/4.
.
btes
9!++%!%'+!0%/!.&4!''&!.
0'
-
9!++%!%'+!0%/!.&4!''&!.0
.
2os n0meros binarios de m-s de un bte se almacenan en la memoria en los procesadores de :ntel en orden in#erso$
01+%4&/'h se almacenara$ /'h, 4&h, +%h, 01h!
1!'!+! - DCAEHF8 5:D,H:F8 "F6:1:",6F8 ED 6E":A,2 (5"6)!
"onsiste en emplear cuatro bits para codi3icar los dgitos del 0 al 9 (desperdiciando las seis combinaciones que #an de la
1010 a la 1111)! 2a #enta7a es la simplicidad de con#ersin aIde base 10, que resulta inmediata! 2os n0meros 5"6 pueden
almacenarse desempaquetados, en cuo caso cada bte contiene un dgitoBCD (5inar-"oded 6ecimal); o empaquetados,
almacenando dos dgitos por bte (para construir los n0meros que #an del 00 al 99)! 2a notacin BCD ocupa cuatro bits -un
nibble- por ci3ra, de 3orma que en el 3ormato desempaquetado el nibble superior siempre es 0!
1!'!%! - DCAEHF8 ED 9CD;F 12F;,D;E!
8on grupos de btes en los que una parte se emplea para guardar las ci3ras del n0mero (mantisa) otra para indicar la
posicin del punto 3lotante (e)ponente), de modo equi#alente a la notacin cient3ica! Esto permite traba7ar con n0meros de
mu ele#ado tamaGo -seg0n el e)ponente- con una maor o menor precisin en 3uncin de los bits empleados para
codi3icar la mantisa!
1!'!4! - "J6:BF ,8"::!
El cdigo ,!8!"!:!:! (,merican 8tandard "ode 3or :n3ormation :nterchange) es un con#enio adoptado para asignar a cada
car-cter un #alor num>rico; su origen est- en los comienzos de la :n3orm-tica tomando como muestra algunos cdigos de la
transmisin de in3ormacin de radioteletipo! 8e trata de un cdigo de ' bits con capacidad para 1+. smbolos que incluen
todos los caracteres al3anum>ricos del ingl>s, con smbolos de puntuacin algunos caracteres de control de la transmisin!
"on posterioridad, con la aparicin de los microordenadores la gran e)pansin entre ellos de los :5A-9" compatibles,
la ampliacin del cdigo ,8":: realizada por esta marca a . bits, con capacidad para 1+. smbolos adicionales, e)perimenta
un considerable auge, siendo en la actualidad mu utilizada recibiendo la denominacin o3icial de p-gina de cdigos 4%'
(EECC)! 8e puede consultar al 3inal de este libro! Es habitualmente la 0nica p-gina soportada por las 5:F8 de los 9"! 9ara
ciertas nacionalidades se han diseGado otras p-ginas espec3icas que requieren de un so3tKare e)terno! En las lenguas del
estado espaGol en las de la maora de los dem-s pases de la CE, esta tabla cubre todas las necesidades del idioma!
1.3. - O$ERACIONES L1ICAS EN BINARIO.
8e realizan a ni#el de bit pueden ser de uno o dos operandos$
Captulo II: AR4UITECTURA E HISTORIA DE LOS MICROORDENADORES
El ensamblador es un lengua7e de programacin que, por la traduccin directa de los mnemnicos a instrucciones
maquina, permite realizar aplicaciones r-pidas, solucionando situaciones en las que los tiempos de e7ecucin constitue el
3actor principal para que el proceso discurra con la su3iciente 3luidez! Esta situacin, que indudablemente s in3lue sobre la
eleccin del lengua7e de programacin a utilizar en el desarrollo de una determinada rutina, dada la aparicin de nue#os
compiladores de lengua7es de alto ni#el que optimizan el cdigo generado a ni#eles mu pr)imos a los que un buen
programador es capaz de realizar en ensamblador, no es la 0nica razn para su utilizacin!
Es sobradamente conocido que los actuales sistemas operati#os son programados en su maor parte en lengua7es de
alto ni#el, especialmente ", pero siempre ha una parte en la que el ensamblador se hace casi insustituible ba7o 6F8 es la
programacin de los drivers para los controladores de dispositi#os, relacionados con las tareas de m-s ba7o ni#el de una
m-quina, 3undamentalmente las operaciones de entradaIsalida en las que es preciso actuar directamente sobre los
dem-schips que acompaGan al microprocesador! 9or ello porque las instrucciones del lengua7e ensamblador est-n
ntimamente ligadas a la m-quina, #amos a realizar primero un somero repaso a la arquitectura interna de un
microordenador!
!.1. - AR4UITECTURA 5ON NE6MAN.
"entr-ndonos en los ordenadores sobre los que #amos a traba7ar desarrollar> a grandes rasgos la arquitectura 5o
N)7(a que, si bien no es la primera en aparecer, s que lo hizo pr-cticamente desde el comienzo de los ordenadores se
sigue desarrollando actualmente! "laro es que est- siendo desplazada por otra que permiten una maor #elocidad de
proceso, la RISC!
En los primeros tiempos de los ordenadores, con sistemas de numeracin decimal, una electrnica sumamente
complicada mu susceptible a 3allos un sistema de programacin cableado o mediante 3ichas, Lon DeKman propuso dos
)
) ,D6

) FH

) MFH

0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0
conceptos b-sicos que re#olucionaran la incipiente in3orm-tica$
a) 2a utilizacin del sistema de numeracin binario! 8impli3icaba enormemente los problemas que la implementacin
electrnica de las operaciones 3unciones lgicas planteaban, a la #ez proporcionaba una maor inmunidad a los 3allos
(electrnica digital)!
b) ,lmacenamiento de la secuencia de instrucciones de que consta el programa en una memoria interna, 3-cilmente
accesible, 7unto con los datos que re3erencia! 6e este 3orma la #elocidad de proceso e)perimenta un considerable
incremento; recordemos que anteriormente una instruccin o un dato estaban codi3icados en una 3icha en el me7or de los
casos!
;omando como modelo las m-quinas que aparecieron incorporando las anteriores caractersticas, el ordenador se puede
considerar compuesto por las siguientes partes$
- 2a Cnidad "entral de 9roceso, C!"!9!, m-s conocida por sus siglas en ingl>s ("9C)!
- 2a Aemoria :nterna, A:!
- Cnidad de Entrada 8alida, EI8!
- Aemoria masi#a E)terna, AE!
Healicemos a continuacin una descripcin de lo que se entiende por cada una de estas partes cmo est-n
relacionadas entre si$
- 2a Cnidad "entral de 9roceso ("9C) #iene a ser el cerebro del ordenador tiene por misin e3ectuar las operaciones
aritm>tico-lgicas controlar las trans3erencias de in3ormacin a realizar!
- 2a Aemoria :nterna (A:) contiene el con7unto de instrucciones que e7ecuta la "9C en el transcurso de un programa! Es
tambi>n donde se almacenan temporalmente las #ariables del mismo, todos los datos que se precisan todos los resultados
que de#uel#e!
- Cnidades de entrada salida (EI8) o :nputIFutput (:IF)$ son las encargadas de la comunicacin de la m-quina con el
e)terior, proporcionando al operador una 3orma de introducir al ordenador tanto los programas como los datos obtener los
resultados!
"omo es de suponer, estas tres partes principales de que consta el ordenador deben estar ntimamente conectadas;
aparece en este momento el concepto de bus$ el bus es un con7unto de lneas que enlazan los distintos componentes del
ordenador, por ellas se realiza la trans3erencia de datos entre todos sus elementos!
8e distinguen tres tipos de bus$
- D) 'ot8ol$ 3orman parte de >l las lneas que seleccionan desde dnde hacia dnde #a dirigida la in3ormacin,
tambi>n las que marcan la secuencia de los pasos a seguir para dicha trans3erencia!
- D) *ato+$ por >l, de 3orma bidireccional, 3luen los datos entre las distintas partes del ordenador!
- D) *-8)''-o)+$ como #imos, la memoria est- di#idida en pequeGas unidades de almacenamiento que contienen las
instrucciones del programa los datos! El bus de direcciones consta de un con7unto de lneas que permite seleccionar de
qu> posicin de la memoria se quiere leer su contenido! ;ambi>n direcciona los puertos de EI8!
2a 3orma de operar del ordenador en su con7unto es direccionar una posicin de la memoria en busca de una instruccin
mediante el bus de direcciones, lle#ar la instruccin a la unidad central de proceso -"9C- por medio del bus de datos,
marcando la secuencia de la trans3erencia el bus de control! En la "9C la instruccin se decodi3ica, interpretando qu>
operandos necesita$ si son de memoria, es necesario lle#arles a la "9C; una #ez que la operacin es realizada, si es preciso
se de#uel#e el resultado a la memoria!
!.!. - EL MICRO$ROCESADOR.
Cn salto importante en la e#olucin de los ordenadores lo introdu7o el microprocesador$ se trata de una unidad central de
proceso contenida totalmente en un circuito integrado! "omenzaba as la gran carrera en busca de lo m-s r-pido, m-s
pequeGo; r-pidamente el mundo del ordenador empez a ser accesible a pequeGas empresas e incluso a ni#el dom>stico$
es el boom de los microordenadores personales! ,unque cuando entremos en la descripcin de los microprocesadores
ob7eto de nuestro estudio lo ampliaremos, har> un pequeGo comentario de las partes del microprocesador$
- Cnidad aritm>tico-lgica$ Es donde se e3ect0an las operaciones aritm>ticas (suma, resta, a #eces producto di#isin)
lgicas (and, or, not, etc!)!
- 6ecodi3icador de instrucciones$ ,ll se interpretan las instrucciones que #an llegando que componen el programa!
- 5loque de registros$ 2os registros son celdas de memoria en donde queda almacenado un dato temporalmente! E)iste
un registro especial llamado de indicadores, estado o 3lags, que re3le7a el estado operati#o del microprocesador!
- 5loque de control de buses internos e)ternos$ super#isa todo el proceso de trans3erencias de in3ormacin dentro del
microprocesador 3uera de >l!
".!. - RE1ISTROS DEL 3930 Y DEL !30.
Estos procesadores disponen de 14 registros de 1/ bits (el +./ alguno m-s, pero no se suele emplear ba7o 6F8)! 2a
misin de estos registros es almacenar las posiciones de memoria que #an a e)perimentar repetidas manipulaciones, a que
los accesos a memoria son mucho m-s lentos que los accesos a los registros! ,dem-s, ha ciertas operaciones que slo se
pueden realizar sobre los registros! Do todos los registros sir#en para almacenar datos, algunos est-n especializados en
apuntar a las direcciones de memoria! 2a mec-nica b-sica de 3uncionamiento de un programa consiste en cargar los
registros con datos de la memoria o de un puerto de EI8, procesar los datos de#ol#er el resultado a la memoria o a otro
puerto de EI8! Fb#iamente, si un dato slo #a a e)perimentar un cambio, es pre3erible realizar la operacin directamente
sobre la memoria, si ello es posible! , continuacin se describen los registros del .0./!
,M 89 "8 :9
5M 59 68 3lags
"M 8: 88
6M 6: E8
Hegistros
de datos
Hegistros
punteros de
pila e ndices
Hegistros
de
segmento
Hegistro puntero
de instrucciones
3lags
- R)/-+t8o+ *) *ato+:
,M, 5M, "M, 6M$ pueden utilizarse bien como registros de 1/ bits o como dos registros separados de . bits (bte
superior e in3erior) cambiando la M por E o 2 seg0n queramos re3erirnos a la parte alta o ba7a respecti#amente! 9or e7emplo,
,M se descompone en ,E (parte alta) ,2 (parte ba7a)! E#identemente, Ncualquier cambio sobre ,E o ,2 altera ,MO$ #alga
como e7emplo que al incrementar ,E se le est-n aGadiendo +&/ unidades a ,M!
,M ( ,cumulador!
Es el registro principal, es utilizado en las instrucciones de multiplicacin di#isin en algunas instrucciones
aritm>ticas especializadas, as como en ciertas operaciones de car-cter espec3ico como entrada, salida traduccin!
Fbs>r#ese que el .0./ es su3icientemente potente para realizar las operaciones lgicas, la suma la resta sobre cualquier
registro de datos, no necesariamente el acumulador!
5M ( 5ase!
8e usa como registro base para re3erenciar direcciones de memoria con direccionamiento indirecto, manteniendo la
direccin de la base o comienzo de tablas o matrices! 6e esta manera, no es preciso indicar una posicin de memoria 3i7a,
sino la nmero BX (as, haciendo a#anzar de unidad en unidad a 5M, por e7emplo, se puede ir accediendo a un gran bloque
de memoria en un bucle)!
"M ( "ontador!
8e utiliza com0nmente como contador en bucles operaciones repetiti#as de mane7o de cadenas! En las instrucciones
de desplazamiento rotacin se utiliza como contador de . bits!
6M ( 6atos!
Csado en con7uncin con ,M en las operaciones de multiplicacin di#isin que in#olucran o generan datos de %+ bits!
En las de entrada salida se emplea para especi3icar la direccin del puerto EI8!
- R)/-+t8o+ *) +)/()to:
6e3inen -reas de /4 @b dentro del espacio de direcciones de 1 Ab del .0./! Estas -reas pueden solaparse total o
parcialmente! Do es posible acceder a una posicin de memoria no de3inida por alg0n segmento$ si es preciso, habr- de
mo#erse alguno!
"8 ( Hegistro de segmento de cdigo (code segment)!
"ontiene la direccin del segmento con las instrucciones del programa! 2os programas de m-s de /4 @b requieren
cambiar "8 peridicamente!
68 ( Hegistro de segmento de datos (data segment)!
8egmento del -rea de datos del programa!
88 ( Hegistro de segmento de pila (stacP segment)!
8egmento de pila!
E8 ( Hegistro de segmento e)tra (e)tra segment)!
8egmento de ampliacin para zona de datos! Es e)traordinariamente 0til actuando en con7uncin con 68$ con ambos
se puede de3inir dos zonas de /4 @b, tan ale7adas como se desee en el espacio de direcciones, entre las que se pueden
intercambiar datos!
- R)/-+t8o+ put)8o+ *) p-la:
89 ( 9untero de pila (stacP pointer)!
,punta a la cabeza de la pila! Ctilizado en las instrucciones de mane7o de la pila!
59 ( 9untero base (base pointer)!
Es un puntero de base, que apunta a una zona dentro de la pila dedicada al almacenamiento de datos (#ariables
locales par-metros de las 3unciones en los programas compilados)!
- R)/-+t8o+ *-')+$
8: ( Qndice 3uente (source inde))!
Ctilizado como registro de ndice en ciertos modos de direccionamiento indirecto, tambi>n se emplea para guardar un
#alor de desplazamiento en operaciones de cadenas!
6: ( Qndice destino (destination inde))!
8e usa en determinados modos de direccionamiento indirecto para almacenar un desplazamiento en operaciones
con cadenas!
- $ut)8o *) -+t8u''-o)+ o contador de programa$
:9 ( 9untero de instruccin (instruction pointer)!
Aarca el desplazamiento de la instruccin en curso dentro del segmento de cdigo! Es autom-ticamente modi3icado
con la lectura de una instruccin!
- R)/-+t8o *) )+ta*o o de indicadores (:la/+)!
Es un registro de 1/ bits de los cuales 9 son utilizados para indicar di#ersas situaciones durante la e7ecucin de un
programa! 2os bits 0, +, 4, /, ' 11 son indicadores de condicin, que re3le7an los resultados de operaciones del programa;
los bits del . al 10 son indicadores de control el resto no se utilizan! Estos indicadores pueden ser comprobados por las
instrucciones de salto condicional, lo que permite #ariar el 3lu7o secuencial del programa seg0n el resultado de las
operaciones!
1& 14 1% 1+ 11 10 9 . ' / & 4 % + 1 0

F
1
6
1
:
1
;
1
8
1
R
1

,
1

9
1

"
1
"1 ("arr 1lag)$ :ndicador de acarreo! 8u #alor m-s habitual es lo que nos llevamos en una suma o resta!
F1 (F#er3loK 1lag)$ :ndicador de desbordamiento! :ndica que el resultado de una operacin no cabe en el tamaGo
del operando destino!
R1 (Rero 1lag)$ :ndicador de resultado 0 o comparacin igual!
81 (8ign 1lag)$ :ndicador de resultado o comparacin negati#a!
91 (9arit 1lag)$ :ndicador de paridad! 8e acti#a tras algunas operaciones aritm>tico-lgicas para indicar que el
n0mero de bits a uno resultante es par!
,1 (,u)iliar 1lag)$ 9ara a7uste en operaciones 5"6!
61 (6irection 1lag)$ :ndicador de direccin! Aanipulando bloques de memoria, indica el sentido de a#ance
(ascendenteIdescendente)!
:1 (:nterrupt 1lag)$ :ndicador de interrupciones$ puesto a 1 est-n permitidas!
;1 (;rap 1lag)$ :ndicador de atrape (e7ecucin paso a paso)!
".". - RE1ISTROS DEL "30 Y $ROCESADORES SU$ERIORES.
2os %./ superiores disponen de muchos m-s registros de los que #amos a #er ahora! 8in embargo, ba7o el sistema
operati#o 6F8 slo se suelen emplear los que #eremos, que constituen b-sicamente una e)tensin a %+ bits de los
registros originales del .0./!
8e ampla el tamaGo de los registros de datos (que pueden ser accedidos en 3ragmentos de ., 1/ %+ bits) se aGaden
dos nue#os registros de segmento multipropsito (18 B8)! ,lgunos de los registros aqu mostrados son realmente de %+
bits (como E:9 en #ez de :9), pero ba7o sistema operati#o 6F8 no pueden ser empleados de manera directa, por lo que no
les consideraremos!
".#. - MODOS DE DIRECCIONAMIENTO.
8on los distintos modos de acceder a los datos en memoria por parte del procesador! ,ntes de #er los modos de
direccionamiento, echaremos un #istazo a la sinta)is general de las instrucciones, a que pondremos alguna en los
e7emplos$
:D8;HC"":JD 6E8;:DF, 1CED;E
6onde destino indica dnde se de7a el resultado de la operacin en la que pueden participar (seg0n casos) 1CED;E e
incluso el propio 6E8;:DF! Ea instrucciones, sin embargo, que slo tienen un operando, como la siguiente, e incluso
ninguno$
:D8;HC"":JD 6E8;:DF
"omo e7emplos, aunque no hemos #isto a0n las instrucciones utilizaremos un par de ellas$ la de copia o mo#imiento de
datos (AFL) la de suma (,66)!
%!4!1! - FHB,D:R,":JD 6E 6:HE"":FDE8$ 8EBAED;,":JD!
"omo a sabemos, los microprocesadores .0./ compatibles poseen registros de un tamaGo m-)imo de 1/ bits que
direccionaran hasta /4@; en cambio, la direccin se compone de +0 bits con capacidad para 1Ab, ha por tanto que recurrir
a alg0n arti3icio para direccionar toda la memoria! 6icho arti3icio consiste en lasementaci!n$ se trata de di#idir la memoria
en grupos de /4@! "ada grupo se asocia con un registro de segmento; el desplazamiento (o""set) dentro de ese segmento lo
proporciona otro registro de 1/ bits! 2a direccin absoluta se calcula multiplicando por 1/ el #alor del registro de segmento
sumando el o33set, obteni>ndose una direccin e3ecti#a de +0 bits! Esto equi#ale a concebir el mecanismo de generacin de
la direccin absoluta, como si se tratase de que los registros de segmento tu#ieran 4 bits a 0 (imaginarios) a la derecha
antes de sumarles el desplazamiento$
direccin ( segmento S 1/ * o33set
En la pr-ctica, una direccin se indica con la notacin 8EBAED;F$F118E;; adem-s, una misma direccin puede
e)presarse de m-s de una manera$ por e7emplo, %600h$0%00h es equi#alente a %6%0$0000h! Es importante resaltar que no
se puede acceder a m-s de /4 @b en un segmento de datos! 9or ello, en los procesadores %./ superiores no se deben
emplear registros de %+ bit para generar direcciones (ba7o 6F8), aunque para los c-lculos pueden ser interesantes (no
obstante, s sera posible con3igurar estos procesadores para poder direccionar m-s memoria ba7o 6F8 con los registros de
%+ bits, aunque no resulta por lo general pr-ctico)!
%!4!+! - AF6F8 6E 6:HE"":FD,A:ED;F!
- 6ireccionamiento inmediato$ El operando es una constante situada detr-s del cdigo de la instruccin! 8in embargo,
como registro destino no se puede indicar uno de segmento (habr- que utilizar uno de datos como paso intermedio)!
,66 ,M,0333h
El n0mero he)adecimal 0333h es la constante num>rica que en el direccionamiento inmediato se le sumar- al registro
,M! ,l traba7ar con ensambladores, se pueden de3inir smbolos 'o+tat)+ (o7o, no #ariables) es m-s intuiti#o$
dato ETC 0333h ; smbolo constante
AFL ,M,dato
8i se re3erencia a la direccin de memoria de una #ariable de la siguiente 3orma, tambi>n se trata de un caso de
direccionamiento inmediato$
dato 6U 0333h ; ahora es una #ariable
AF ,M,F118E; dato ; ,M ( Vdireccin de memoriaV de dato
9orque ha que tener en cuenta que cuando traduzcamos a n0meros el smbolo podra quedar$
1'1%$0,11 6U 111
AFL ,M,0,11
- 6ireccionamiento de registro$ 2os operandos, necesariamente de igual tamaGo, est-n contenidos en los registros
indicados en la instruccin$
AFL 6M,,M
AFL ,E,,2
- 6ireccionamiento directo o absoluto$ El operando est- situado en la direccin indicada en la instruccin, relati#a al
segmento que se trate$
AFL ,M,W&'61hX
AFL ,M,E8$W4+9"hX
Esta sinta)is (quitando la YhY de he)adecimal) sera la que admite el programa 6E5CB (realmente habra que poner, en el
segundo caso, E8$ en una lnea el AFL en otra)! ,l traba7ar con ensambladores, las ;a8-a<l)+ en memoria se pueden
re3erenciar con etiquetas simblicas$
AFL ,M,dato
AFL ,M,E8$dato
dato 6U 1+%4h ; #ariable del programa
En el primer e7emplo se trans3iere a ,M el #alor contenido en la direccin apuntada por la etiqueta dato sobre el
segmento de datos (68) que se asume por de3ecto; en el segundo e7emplo se indica de 3orma e)plcita el segmento
trat-ndose del segmento E8! 2a direccin e3ecti#a se calcula de la 3orma a #ista con anterioridad$ Hegistro de
segmento S 1/ * desplazamientoZdeZdato (este desplazamiento depende de la posicin al ensamblar el programa)!
- 6ireccionamiento indirecto$ El operando se encuentra en una direccin seGalada por un registro de segmentoS1/ m-s
un registro base (5MI59) o ndice (8:I6:)! (Dota$ 59 act0a por de3ecto con 88)!
AFL ,M,W59X ; ,M ( W88S1/*59X
AFL E8$W6:X,,M ; WE8S1/*6:X ( ,M
- :ndirecto con ndice o inde)ado$ El operando se encuentra en una direccin determinada por la suma de un registro de
segmentoS1/, un registro de ndice, 8: o 6: un desplazamiento de . 1/ bits! E7emplos$
AFL ,M,W6:*6E89X AFL ,M,despW6:X
,66 W8:*6E89X,5M ,66 despW8:X,5M
- :ndirecto con base e ndice o inde)ado a base$ El operando se encuentra en una direccin especi3icada por la suma de
un registro de segmentoS1/, uno de base, uno de ndice opcionalmente un desplazamiento de . 1/ bits$
AFL ,M,E8$W5M*6:*6E89X AFL ,M,E8$despW5MXW6:X
AFL "8$W5M*8:*6E89X,"M AFL "8$despW5MXW8:X,"M
Co(<-a'-o)+ *) 8)/-+t8o+ *) +)/()to = *)+pla>a(-)to.
"omo se #e en los modos de direccionamiento, ha casos en los que se indica e)plcitamente el registro de segmento a
usar para acceder a los datos! E)isten unos segmentos asociados por de3ecto a los registros de desplazamiento (:9, 89, 59,
5M, 6:, 8:); slo es necesario declarar el segmento cuando no coincide con el asignado por de3ecto! En ese caso, el
ensamblador genera un bte adicional (a modo de pre3i7o) para indicar cu-l es el segmento re3erenciado! 2a siguiente tabla
relaciona las posibles combinaciones de los registros de segmento los de desplazamiento$
"8 88 68 E8
:9 8 Do Do Do
8
9
Do 8 Do Do
5
9
con
pre3i7o
por
de3ecto
con pre3i7o con pre3i7o
5
M
con
pre3i7o
con pre3i7o
por
de3ecto
con pre3i7o
8:
con
pre3i7o
con pre3i7o
por
de3ecto
con pre3i7o
6:
con
pre3i7o
con pre3i7o
por
de3ecto
con
pre3i7o(1)
(1) ;ambi>n por de3ecto en el mane7o de cadenas!
2os %./ superiores admiten otros modos de direccionamiento m-s so3isticados, que se #er-n en el pr)imo captulo,
despu>s de conocer todas las instrucciones del .0./! 9or ahora, con todos estos modos se puede considerar que ha m-s
que su3iciente! 6e hecho, algunos se utilizan en mu contadas ocasiones!
".&. - LA $ILA.
2a pila es un bloque de memoria de estructura LI?O (2ast :nput 1irst Futput$ 0ltimo en entrar, primero en salir) que se
direcciona mediante desplazamientos desde el registro 88 (segmento de pila)! 2as posiciones indi#iduales dentro de la pila
se calculan sumando al contenido del segmento de pila 88 un desplazamiento contenido en el registro puntero de pila 89!
;odos los datos que se almacenan en la pila son de longitud palabra, cada #ez que se introduce algo en ella por medio de
las instrucciones de mane7o de pila (9C8E 9F9), el puntero se decrementa en dos; es decir, la pila a#anza hacia
direcciones decrecientes! El registro 59 suele utilizarse normalmente para apuntar a una cierta posicin de la pila acceder
inde)adamente a sus elementos -generalmente en el caso de #ariables- sin necesidad de desapilarlos para consultarlos!
2a pila es utilizada 3recuentemente al principio de una subrutina para preser#ar los registros que no se desean modi3icar;
al 3inal de la subrutina basta con recuperarlos en orden in#erso al que 3ueron depositados! En estas operaciones con#iene
tener cuidado, a que la pila en los .0./ es com0n al procesador al usuario, por lo que se almacenan en ella tambi>n las
direcciones de retorno de las subrutinas! Esta 0ltima es, de hecho, la m-s importante de sus 3unciones! 2a estructura de pila
permite que unas subrutinas llamen a otras que a su #ez pueden llamar a otras as sucesi#amente$ en la pila se almacenan
las direcciones de retorno, que ser-n las de la siguiente instruccin que pro#oc la llamada a la subrutina! ,s, al retornar de
la subrutina se e)trae de la pila la direccin a donde #ol#er! 2os compiladores de los lengua7es de alto ni#el la emplean
tambi>n para pasar los par-metros de los procedimientos para generar en ella las #ariablesautom#ticas -#ariables locales
que e)isten durante la e7ecucin del subprograma se destruen inmediatamente despu>s-! 9or ello, una norma b-sica es
que se debe desapilar siempre todo lo apilado para e#itar una p>rdida de control inmediata del ordenador!
E7emplo de operacin sobre la pila (todos los datos son arbitrarios)$
".0. - UN $RO1RAMA DE E@EM$LO.
,unque las instrucciones del procesador no ser-n #istas hasta el pr)imo captulo, con ob7eto de audar a la imaginacin
del lector elaboraremos un primer programa de e7emplo en lengua7e ensamblador! 2a utilidad de este programa es de7ar
patente que lo 0nico que entiende el .0./ son n0meros, aunque nosotros nos re3eriremos a ellos con unos smbolos que
3aciliten entenderlos! ;ambi>n es interesante este e7emplo para a3ianzar el concepto de registro de segmento!
En este programa slo #amos a emplear las instrucciones AFL, a conocida, alguna otra m-s como la instruccin :D"
(incrementar), 6E" (disminuir una unidad) [DR (saltar si el resultado no es cero)! 8uponemos que el programa est-
ubicado a partir de la direccin de memoria 146%$',10 (arbitrariamente elegida) que lo que pretendemos hacer con >l es
limpiar la pantalla! "omo el ordenador es un 9" con monitor en color, la pantalla de te)to comienza en 5.00$0000 (no es
m-s que una zona de memoria)! 9or cada car-cter que ha en dicha pantalla, comenzando arriba a la izquierda, a partir de
la direccin 5.00$0000 tenemos dos btes$ el primero, con el cdigo ,8":: del car-cter el segundo con el color! 2o que
#amos a hacer es rellenar los +000 caracteres (.0 columnas ) +& lneas) con espacios en blanco (cdigo ,8":: %+, +0h en
he)adecimal), sin modi3icar el color que hubiera antes! Esto es, se trata de poner el #alor %+ en la direccin 5.00$0000, la
5.00$000+, la 5.00$0004!!! as sucesi#amente!
El programa quedara en memoria de esta manera$ 2a primera columna indica la direccin de memoria donde est- el
programa que se e7ecuta ("8(146%h e :9(',10h al principio)! 2a segunda columna constitue el cdigo m-quina que
interpreta el .0./! ,lgunas instrucciones ocupan un bte de memoria, otras dos tres (las ha de m-s)! 2a tercera columna
contiene el nombre de las instrucciones, algo mucho m-s legible para los humanos que los n0meros$
146%$',10 59 60 0' AFL "M,'60E ; "M ( '60h (+000 decimal ( '60 he)adecimal)
146%$',1% 5. 00 5. AFL ,M,05.00h ; segmento de la memoria de pantalla
146%$',1/ .E 6. AFL 68,,M ; apuntar segmento de datos a la misma
146%$',1. 55 00 00 AFL 5M,0 ; apuntar al primer car-cter ,8":: de la pantalla
146%$',15 "/ 0' +0 AFL 5?;E 9;H W5MX,%+ ; se pone 5?;E 9;H para indicar que %+ es de . bits
146%$',1E 4% :D" 5M ; 5M(5M*1 -\ apuntar al bte de color
146%$',11 4% :D" 5M ; 5M(5M*1 -\ apuntar al siguiente car-cter ,8"::
146%$',+0 49 6E" "M ; "M("M-1 -\ queda un car-cter menos
146%$',+1 '& 1. [DR -. ; si "M no es 0, saltar . btes atr-s (a 146%$',15)
"omo se puede #er, la segunda instruccin (btes de cdigo m-quina 05.h, 0 05.h colocados en posiciones
consecuti#as) est- colocada a partir del desplazamiento ',1%h, a que la anterior que ocupaba % btes comenzaba en
',10h! En el e7emplo cargamos el #alor 05.00h en 68 apo-ndonos en ,M como intermediario! El moti#o es que los
registros de segmento no admiten el direccionamiento inmediato! , medida que se #an haciendo programas, el ensamblador
da mensa7es de error cuando se encuentra con estos 3allos permite ir aprendiendo con 3acilidad las normas, que tampoco
son demasiadas! 2a instruccin $%& B'T( )TR *BX+,-. equi#ale a decir$ /poner en la direcci!n de memoria apuntada por
BX (68$W5MX para ser m-s e)actos) el byte de valor -.0! El #alor 01.h del cdigo m-quina de la 0ltima instruccin es el
complemento a dos (n0mero negati#o) del #alor .!
Dormalmente, casi nunca habr- que ensamblar a mano consultando unas tablas, como hemos hecho en este e7emplo!
8in embargo, la me7or manera de aprender ensamblador es no ol#idando la estrecha relacin de cada lnea de programa con
la "9C la memoria!
Captulo I5: @UE1O DE INSTRUCCIONES 39,30
#.1. - DESCRI$CIN COM$LETA DE LAS INSTRUCCIONES.
Dota$ en el e3ecto de las instrucciones sobre el registro de estado se utilizar- la siguiente notacin$
- bit no modi3icado
] desconocido o inde3inido
) modi3icado seg0n el resultado de la operacin
1 puesto siempre a 1
0 puesto siempre a 0
4!1!1! - :D8;HC"":FDE8 6E ",HB, 6E HEB:8;HF8 ? 6:HE"":FDE8!

^ AFL (trans3erencia)
8inta)is$ AFL dest, origen!
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
;rans3iere datos de longitud bte o palabra del operando origen al operando destino! 9ueden ser operando origen
operando destino cualquier registro o posicin de memoria direccionada de las 3ormas a #istas, con la 0nica condicin de
que origen destino tengan la misma dimensin! E)isten ciertas limitaciones, como que los registros de segmento no
admiten el direccionamiento inmediato$ es incorrecto AFL 68,4000h; pero no lo es por e7emplo AFL 68,,M o AFL
68,L,H:,52E! Do es posible, as mismo, utilizar "8 como destino (es incorrecto hacer AFL "8,,M aunque pueda admitirlo
alg0n ensamblador)! ,l hacer AFL hacia un registro de segmento, las interrupciones quedan inhibidas hasta *)+puA+ de
e7ecutarse la siguiente instruccin (.0./I.. de 19.% procesadores posteriores)!
E7emplos$ mo# ds,a)
mo# b),es$WsiX
mo# si,o33set dato
En el 0ltimo e7emplo, no se coloca en 8: el #alor de la #ariable dato sino su direccin de memoria o desplazamiento
respecto al segmento de datos! En otras palabras, 8: es un puntero a dato pero no es dato! En el pr)imo captulo se #er-
cmo se declaran las #ariables!

^ M"EB (intercambiar)
8inta)is$ M"EB destino, origen
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
:ntercambia el contenido de los operandos origen destino! Do pueden utilizarse registros de segmentos como
operandos!
E7emplo$ )chg bl,ch
)chg memZpal,b)

^ M2,; (traduccin)
8inta)is$ M2,; tabla
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
8e utiliza para traducir un bte del registro ,2 a un bte tomado de la tabla de traduccin! 2os datos se toman
desde una direccin de la tabla correspondiente a 5M * ,2, donde b) es un puntero a el comienzo de la tabla ,2 es un
ndice! :ndicar tabla al lado de )lat es slo una redundancia opcional!
E7emplo$ mo# b),o33set tabla
mo# al,4
)lat

^ 2E, (carga direccin e3ecti#a)
8inta)is$ 2E, destino, origen
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
;rans3iere el desplazamiento del operando 3uente al operando destino! Ftras instrucciones pueden a continuacin
utilizar el registro como desplazamiento para acceder a los datos que constituen el ob7eti#o! El operando destino no puede
ser un registro de segmento! En general, esta instruccin es equi#alente a $%& destino,%11S(T "uente de hecho los
buenos ensambladores (;,8A) la codi3ican como AFL para economizar un bte de memoria! 8in embargo, 2E, es en
algunos casos m-s potente que AFL al permitir indicar registros de ndice desplazamiento para calcular el o33set$
lea d),datosWsiX
En el e7emplo de arriba, el #alor depositado en 6M es el o33set de la etiqueta datos m-s el registro 8:! Esa sola
instruccin es equi#alente a estas dos$
mo# d),o33set datos
add d),si

^ 268 (carga un puntero utilizando 68)
8inta)is$ 268 destino, origen
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
;raslada un puntero de %+ bits (direccin completa de memoria compuesta por
segmento desplazamiento), al destino indicado a 68! , partir de la direccin indicada por el operando origen, el
procesador toma 4 btes de la memoria$ con los dos primeros 3orma una palabra que deposita en destino , con los otros
dos, otra en 68!
E7emplo$ punt dd 1+%4&/'.h
lds si,punt
"omo resultado de esta instruccin, en 68$8: se hace re3erencia a la posicin de memoria 1+%4h$&/'.h; YddY sir#e
para de3inir una #ariable larga de 4 btes (denominada punt en el e7emplo) ser- e)plicado en el captulo siguiente!

^ 2E8 (carga un puntero utilizando E8)
8inta)is$ 2E8 destino, origen
Esta instruccin es an-loga a 268, pero utilizando E8 en lugar de 68!

^ 2,E1 (carga ,E con los indicadores)
8inta)is$ 2,E1
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
"arga los bits ', /, 4, + 0 del registro ,E con el contenido de los indicadores 81, R1, ,1, 91 ? "1
respecti#amente! El contenido de los dem-s bits queda sin de3inir!

^ 8,E1 (copia ,E en los indicadores)
8inta)is$ 8,E1
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - ) ) ) ) )
;rans3iere el contenido de los bits ', /, 4, + 0 a los indicadores 81, R1, ,1, 91 "1 respecti#amente!
4!1!+! - :D8;HC"":FDE8 6E A,D:9C2,":JD 6E2 HEB:8;HF 6E E8;,6F!

^ "2" (ba7a el indicador de acarreo)
8inta)is$ "2"
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - 0
5orra el indicador de acarreo ("1) sin a3ectar a ninguno otro!

^ "26 (ba7a el indicador de direccin)
8inta)is$ "26
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- 0 - - - - - - -
9one a 0 el indicador de direccin 61, por lo que los registros 8: Io 6: se autoincrementan en las operaciones de
cadenas, sin a3ectar al resto de los indicadores! Es DE"E8,H:F colocarlo antes de las instrucciones de mane7o de cadenas
si no se conoce con seguridad el #alor de 61! L>ase 8;6!

^ "2: (ba7a indicador de interrupcin)
8inta)is$ "2:
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - 0 - - - - - -
5orra el indicador de acti#acin de interrupciones :1, lo que desacti#a las interrupciones enmascarables! Es mu
con#eniente hacer esto antes de modi3icar la pare7a 88$89 en los .0./I.. anteriores a 19.% (#>ase comentario en la
instruccin AFL), o antes de cambiar un #ector de interrupcin sin el apoo del 6F8! Beneralmente las interrupciones slo
se inhiben por bre#es instantes en momentos crticos! L>ase tambi>n 8;:!

^ "A" (complementa el indicador de acarreo)
8inta)is$ "A"
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - )
"omplementa el indicador de acarreo "1 in#irtiendo su estado!

^ 8;" (pone a uno el indicador de acarreo)
8inta)is$ 8;"
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - 1
9one a 1 el indicador de acarreo "1 sin a3ectar a ning0n otro indicador!

^ 8;6 (pone a uno el indicador de direccin)
8inta)is$ 8;6
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- 1 - - - - - - -
9one a 1 el indicador de direccin 61, por lo que los registros 8: Io 6: se autodecrementan en las operaciones de
cadenas, sin a3ectar al resto de los indicadores! Es DE"E8,H:F colocarlo antes de las instrucciones de mane7o de cadenas
si no se conoce con seguridad el estado de 61! L>ase tambi>n "26!
^ 8;: (pone a uno el indicador de interrupcin)
8inta)is$ 8;:
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - 1 - - - - - -
9one a 1 la bandera de desacti#acin de interrupciones :1 acti#a las interrupciones enmascarables! Cna
interrupcin pendiente no es reconocida, sin embargo, hasta despu>s de e7ecutar la instruccin que sigue a 8;:! L>ase
tambi>n "2:!
4!1!%! - :D8;HC"":FDE8 6E A,DE[F 6E 2, 9:2,!
^ 9F9 (e)traer de la pila)
8inta)is$ 9F9 destino
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
;rans3iere el elemento palabra que se encuentra en lo alto de la pila (apuntado por 89) al operando destino que a
de ser tipo palabra, e incrementa en dos el registro 89! 2a instruccin 9F9 "8, poco 0til, no 3unciona correctamente en los
+./ superiores!
E7emplos$ pop a)
pop pepe

^ 9C8E (introduce en la pila)
8inta)is$ 9C8E origen
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
6ecrementa el puntero de pila (89) en + luego trans3iere la palabra especi3icada en el operando origen a la cima
de la pila! El registro "8 aqu s se puede especi3icar como origen, al contrario de lo que a3irman algunas publicaciones!
E7emplo$ push cs

^ 9F91 (e)trae los indicadores de la pila)
8inta)is$ 9F91
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
) ) ) ) ) ) ) ) )
;raslada al registro de los indicadores la palabra almacenada en la cima de la pila; a continuacin el puntero de pila
89 se incrementa en dos!
^ 9C8E1 (introduce los indicadores en la pila)
8inta)is$ 9C8E1
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
6ecrementa en dos el puntero de pila traslada a la cima de la pila el contenido de los indicadores!
4!1!4! - :D8;HC"":FDE8 6E ;H,D81EHED":, 6E "FD;HF2!
I'o*-'-oal

^ ",22 (llamada a subrutina)
8inta)is$ ",22 destino
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
;rans3iere el control del programa a un procedimiento, sal#ando pre#iamente en la pila la direccin de la instruccin
siguiente, para poder #ol#er a ella una #ez e7ecutado el procedimiento! El procedimiento puede estar en el mismo segmento
(tipo DE,H) o en otro segmento (tipo 1,H)! , su #ez la llamada puede ser directa a una etiqueta (especi3icando el tipo de
llamada DE,H -por de3ecto- o 1,H) o indirecta, indicando la direccin donde se encuentra el puntero! 8eg0n la llamada sea
cercana o le7ana, se almacena en la pila una direccin de retorno de 1/ bits o dos palabras de 1/ bits indicando en este
0ltimo caso tanto el o33set (:9) como el segmento ("8) a donde #ol#er!
E7emplos$ call proc1
dir dd 03000e9.'h
call dKord ptr dir
En el segundo e7emplo, la #ariable dir almacena la direccin a donde saltar! 6e esta 0ltima manera -conociendo su
direccin- puede llamarse tambi>n a un #ector de interrupcin, guardando pre#iamente los 3lags en la pila (9C8E1), porque
la rutina de interrupcin retornar- (con :HE; en #ez de con HE;1) sac-ndolos!
^ [A9 (salto)
8inta)is$ [A9 direccin o [A9 8EFH; direccin
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
;rans3iere el control incondicionalmente a la direccin indicada en el operando! 2a bi3urcacin puede ser tambi>n
directa o indirecta como anteriormente #imos, pero adem-s puede ser corta (tipo 8EFH;) con un desplazamiento
comprendido entre -1+. 1+'; o larga, con un desplazamiento de dos btes con signo! 8i se hace un [A9 8EFH; no llega
el salto (porque est- demasiado ale7ada esa etiqueta) el ensamblador dar- error! 2os buenos ensambladores (como ;,8A)
cuando dan dos pasadas colocan all donde es posible un salto corto, para economizar memoria, sin que el programador
tenga que ocuparse de poner short! 8i el salto de dos btes, que permite desplazamientos de /4 @b en la memoria sigue
siendo insu3iciente, se puede indicar con "ar que es largo (salto a otro segmento)!
E7emplos$ 7mp etiqueta
7mp 3ar ptr etiqueta

^ HE; I HE;1 (retorno de subrutina)
8inta)is$ HE; W#alorX o HE;1 W#alorX
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
Hetorna de un procedimiento e)traendo de la pila la direccin de la siguiente direccin! 8e e)traer- el registro de
segmento el desplazamiento en un procedimiento de tipo 1,H (dos palabras) solo el desplazamiento en un
procedimiento DE,H (una palabra)! si esta instruccin es colocada dentro de un bloque 9HF"-ED69 (como se #er- en el
siguiente captulo) el ensamblador sabe el tipo de retorno que debe hacer, seg0n el procedimiento sea DE,H o 1,H! En
cualquier caso, se puede 3orzar que el retorno sea de tipo 1,H con la instruccin HE;1! &alor, si es indicado permite sumar
una cantidad valor en btes a 89 antes de retornar, lo que es 3recuente en el cdigo generado por los compiladores para
retornar de una 3uncin con par-metros! ;ambi>n se puede retornar de una interrupcin con HE;1 +, para que de#uel#a el
registro de estado sin restaurarlo de la pila!
Co*-'-oal
2as siguientes instrucciones son de trans3erencia condicional de control a la instruccin que se encuentra en la
posicin :9*desplazamiento (desplazamiento comprendido entre -1+. *1+') si se cumple la condicin! ,lgunas
condiciones se pueden denotar de #arias maneras! ;odos los saltos son cortos si no alcanzaha que apaG-rselas como
sea! En )/8-ta se realzan las condiciones m-s empleadas! 6onde inter#iene 81 se consideran con signo los operandos
implicados en la 0ltima comparacin u operacin aritmetico-lgica, se indican en la tabla como Y_Y (-1+. a *1+' -%+'/. a
*%+'/'); en los dem-s casos, indicados como Y*Y, se consideran sin signo (0 a +&& 0 a /&&%&)$
@AB@NBE
Salto +- (a=o8 Ca<o;)D, +- o ()o8 o -/ual Cot <)lo7 o8 )EualD, +- C?F9 =
G?F9.
*
@AEB@NB Salto +- (a=o8 o -/ual Ca<o;) o8 )EualD, +- o ()o8 Cot <)lo7D, +- C?F9. *
@BB@NAEB
@C
Salto +- ()o8 C<)lo7D, +- o +up)8-o8 - -/ual Cot a<o;) o8 )EualD, +-
a'a88)o, +- C?F1.
*
@BEB@NA
Salto +- ()o8 o -/ual Cot <)lo7 o8 )EualD, +- o (a=o8 Cot a<o;)D, +-
C?F1 . G?F1.
*
@CXG Salto +- CXF9.
@EB@G Salto +- -/ual C)EualD, +- ')8o C>)8oD, +- G?F1.
[BI[D2E 8alto si maor (greater), si no menor ni igual (not less or equal), si R1(0 81(0! _
[BEI[D2 8alto si maor o igual (greater or equal), si no menor (not less), si 81(0! _
[2I[DBE 8alto si menor (less), si no maor ni igual (not greater or equal), si 81\`F1! _
[2EI[DB
8alto si menor o igual (less or equal), si no maor (not greater), si R1(0
81\`F1!
_
@NC Salto +- o a'a88)o, +- C?F9.
@NEB@NG Salto +- o -/ual, +- o ')8o, +- G?F9.
[DF 8alto si no desbordamiento, si F1(0!
[D9I[9F 8alto si no paridad, si paridad impar, si 91(0!
[D8 8alto si no signo, si positi#o, si 81(0!
[F 8alto si desbordamiento, si F1(1!
[9I[9E 8alto si paridad, si paridad par, si 91(1!
[8 8alto si signo, si 81(1!
1)+t-. *) <u'l)

^ 2FF9 (bucle)
8inta)is$ 2FF9 desplazamiento
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
6ecrementa el registro contador "M; si "M es cero, e7ecuta la siguiente instruccin, en caso contrario trans3iere el
control a la direccin resultante de sumar a :9 * desplazamiento! El desplazamiento debe estar comprendido entre -1+.
*1+'! E7emplo$
mo# c),10
bucle$ !!!!!!!
!!!!!!!
loop bucle
"on las mismas caractersticas que la instruccin anterior$

^ 2FF9EI2FF9R 5ucle si igual, si cero! R(1 "M\`0

^ 2FF9DEI2FF9DR 5ucle si no igual, si no cero! R(0 "M\`0
It)88up'-o)+

^ :D; (interrupcin)
8inta)is$ :D; n (0 \( n \( +&&)
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - 0 0 - - - - -
:nicializa un procedimiento de interrupcin de un tipo indicado en la instruccin! En la pila se introduce al llamar a
una interrupcin la direccin de retorno 3ormada por los registros "8 e :9 el estado de los indicadores! :D; % es un caso
especial de :D;, al ensamblarla el ensamblador genera un slo bte en #ez de los dos habituales; esta interrupcin se utiliza
para poner puntos de ruptura en los programas! L>ase tambi>n :HE; el apartado 1 del captulo L::!
E7emplo$ int +1h
^ :D;F (interrupcin por desbordamiento)
8inta)is$ :D;F
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - 0 0 - - - - -
Benera una interrupcin de tipo 4 (:D; 4) si e)iste desbordamiento (F1(1)! 6e lo contrario se contin0a con la
instruccin siguiente!
^ :HE; (retorno de interrupcin)
8inta)is$ :HE;
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
) ) ) ) ) ) ) ) )
6e#uel#e el control a la direccin de retorno sal#ada en la pila por una interrupcin pre#ia restaura los indicadores
que tambi>n se introdu7eron en la pila! En total, se sacan las % palabras que 3ueron colocadas en la pila cuando se produ7o la
interrupcin! L>ase tambi>n :D;!
4!1!&! - :D8;HC"":FDE8 6E ED;H,6, 8,2:6, (EI8)!
^ :D (entrada)
8inta)is$ :D acumulador, puerto!
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
;rans3iere datos desde el puerto indicado hasta el registro ,2 o ,M, dependiendo de la longitud bte o palabra
respecti#amente! El puerto puede especi3icarse mediante una constante (0 a +&&) o a tra#>s del #alor contenido en 6M (0 a
/&&%&)!
E7emplo$ in a),03h
in al,d)
^ FC; (salida)
8inta)is$ FC; puerto, acumulador
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
;rans3iere un bte o palabra del registro ,2 o ,M a un puerto de salida! El puerto puede especi3icarse con un #alor
3i7o entre 0 +&& a tra#>s del #alor contenido en el registro 6M (de 0 a /&&%&)!
E7emplo$ out 1+h,a)
out d),al
4!1!/! - :D8;HC"":FDE8 ,H:;Aa;:",8!
H H H S U M A H H H

^ ,,, (a7uste ,8":: para la suma)
8inta)is$ ,,,
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
] - - - ] ] ) ] )
"on#ierte el contenido del registro ,2 en un n0mero 5"6 no empaquetado! 8i los cuatro bits menos signi3icati#os
de ,2 son maores que 9 si el indicador ,1 est- a 1, se suma / a ,2, 1 a ,E, ,1 se pone a 1, "1 se iguala a ,1 ,2
pone sus cuatro bits m-s signi3icati#os a 0!
E7emplo$ add al,bl
aaa
En el e7emplo, tras la suma de dos n0meros 5"6 no empaquetados colocados en ,2 52, el resultado (por medio
de ,,,) sigue siendo un n0mero 5"6 no empaquetado!

^ ,6" (suma con acarreo)
8inta)is$ ,6" destino, origen
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
) - - - ) ) ) ) )
8uma los operandos origen, destino el #alor del indicador de acarreo (0 1) el resultado lo almacena en el
operando destino! 8e utiliza normalmente para sumar n0meros grandes, de m-s de 1/ bits, en #arios pasos, considerando lo
que nos llevamos (el acarreo) de la suma anterior!
E7emplo$ adc a),b)

^ ,66 (suma)
8inta)is$ ,66 destino, origen
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
) - - - ) ) ) ) )
8uma los operandos origen destino almacenando el resultado en el operando destino! 8e acti#a el acarreo si se
desborda el registro destino durante la suma!
E7emplos$ add a),b)
add cl,dh

^ 6,, (a7uste decimal para la suma)
8inta)is$ 6,,
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
] - - - ) ) ) ) )
"on#ierte el contenido del registro ,2 en un par de #alores 5"6$ si los cuatro bits menos signi3icati#os de ,2 son
un n0mero maor que 9, el indicador ,1 se pone a 1 se suma / a ,2! 6e igual 3orma, si los cuatro bits m-s signi3icati#os
de ,2 tras la operacin anterior son un n0mero maor que 9, el indicador "1 se pone a 1 se suma /0h a ,2!
E7emplo$ add al,cl
daa
En el e7emplo anterior, si ,2 "2 contenan dos n0meros 5"6 empaquetados, 6,, hace que el resultado de la
suma (en ,2) siga siendo tambi>n un 5"6 empaquetado!
^ :D" (incrementar)
8inta)is$ :D" destino
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
) - - - ) ) ) ) -
:ncrementa el operando destino! El operando destino puede ser bte o palabra!
Fbs>r#ese que esta instruccin no modi3ica el bit de acarreo ("1) no es posible detectar un desbordamiento por este
procedimiento (utilcese R1)!
E7emplos$ inc al
inc es$WdiX
inc ss$Wbp*4X
inc Kord ptr cs$Wb)*di*'X
H H H R E S T A H H H

^ ,,8 (a7uste ,8":: para la resta)
8inta)is$ ,,8
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
] - - - ] ] ) ] )
"on#ierte el resultado de la sustraccin de dos operandos 5"6 no empaquetados para que siga siendo un n0mero
5"6 no empaquetado! 8i el nibble in3erior de ,2 tiene un #alor maor que 9, de ,2 se resta /, se decrementa ,E, ,1 se
pone a 1 "1 se iguala a ,1! El resultado se guarda en ,2 con los bits de 4 a ' puestos a 0!
E7emplo$ sub al,bl
aas
En el e7emplo, tras la resta de dos n0meros 5"6 no empaquetados colocados en ,2 52, el resultado (por medio
de ,,8) sigue siendo un n0mero 5"6 no empaquetado!

^ "A9 (comparacin)
8inta)is$ "A9 destino, origen
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
) - - - ) ) ) ) )
Hesta origen de destino sin retornar ning0n resultado! 2os operandos quedan inalterados, paro los indicadores
pueden ser consultados mediante instrucciones de bi3urcacin condicional! 2os operandos pueden ser de tipo bte o palabra
pero ambos de la misma dimensin!
E7emplo$ cmp b), memZpal
cmp ch,cl

^ 6,8 (a7uste decimal para la resta)
8inta)is$ 6,8
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - ) ) ) ) )
"orrige el resultado en ,2 de la resta de dos n0meros 5"6 empaquetados, con#irti>ndolo tambi>n en un #alor
5"6 empaquetado! 8i el nibble in3erior tiene un #alor maor que 9 o ,1 es 1, a ,2 se le resta /, ,1 se pone a 1! 8i el nibble
mas signi3icati#o es maor que 9 "1 est- a 1, entonces se resta /0h a ,2 se acti#a despu>s "1!
E7emplo$ sub al,bl
das
En el e7emplo anterior, si ,2 52 contenan dos n0meros 5"6 empaquetados, 6,8 hace que el resultado de la
resta (en ,2) siga siendo tambi>n un 5"6 empaquetado!
^ 6E" (decrementar)
8inta)is$ 6E" destino
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
) - - - ) ) ) ) -
Hesta una unidad del operando destino! El operando puede ser bte o palabra! Fbs>r#ese que esta instruccin no
modi3ica el bit de acarreo ("1) no es posible detectar un desbordamiento por este procedimiento (utilcese R1)!
E7emplo$ dec a)
dec memZbte
^ DEB (negacin)
8inta)is$ DEB destino
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
) - - - ) ) ) ) )
"alcula el #alor negati#o en complemento a dos del operando de#uel#e el resultado en el mismo operando!
E7emplo$ neg al
^ 855 (resta con acarreo)
8inta)is$ 855 destino, origen
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
) - - - ) ) ) ) )
Hesta el operando origen del operando destino el resultado lo almacena en el operando destino! 8i est- a 1 el
indicador de acarreo adem-s resta una unidad m-s! 2os operandos pueden ser de tipo bte o palabra! 8e utiliza
normalmente para restar n0meros grandes, de m-s de 1/ bits, en #arios pasos, considerando lo que nos llevamos (el
acarreo) de la resta anterior!
E7emplo$ sbb a),a)
sbb ch,dh
^ 8C5 (resta)
8inta)is$ 8C5 destino, origen
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
) - - - ) ) ) ) )
Hesta el operando destino al operando origen, colocando el resultado en el operando destino! 2os operandos
pueden tener o no signo, siendo necesario que sean del mismo tipo, bte o palabra!
E7emplos$ sub al,bl
sub d),d)
H H H M U L T I $ L I C A C I O N H H H

^ ,,A (a7uste ,8":: para la multiplicacin)
8inta)is$ ,,A
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
] - - - ) ) ] ) ]
"orrige el resultado en ,M del producto de dos n0meros 5"6 no empaquetados, con#irti>ndolo en un #alor 5"6
tambi>n no empaquetado! En ,E sit0a el cociente de ,2I10 quedando en ,2 el resto de dicha operacin!
E7emplo$ mul bl
aam
En el e7emplo, tras el producto de dos n0meros 5"6 no empaquetados colocados en ,2 52, el resultado (por
medio de ,,,) sigue siendo, en ,M, un n0mero 5"6 no empaquetado!
^ :AC2 (multiplicacin entera con signo)
8inta)is$ :AC2 origen (orien no puede ser operando inmediato en .0./, s en +./)
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
) - - - ] ] ] ] )
Aultiplica un operando origen con signo de longitud bte o palabra por ,2 o ,M respecti#amente! 8i orien es un
bte el resultado se guarda en ,E (bte m-s signi3icati#o) en ,2 (menos signi3icati#o), si orien es una palabra el resultado
es de#uelto en 6M (parte alta) ,M (parte ba7a)! 8i las mitades m-s signi3icati#as son distintas de cero, independientemente
del signo, "1 F1 son acti#ados!
E7emplo$ imul b)
imul ch
^ AC2 (multiplicacin sin signo)
8inta)is$ AC2 origen (orien no puede ser operando inmediato)
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
) - - - ] ] ] ] )
Aultiplica el contenido sin signo del acumulador por el operando origen! 8i el
operando destino es un bte el acumulador es ,2 guardando el resultado en ,E ,2, si el contenido de ,E es distinto de 0
acti#a los indicadores "1 F1! "uando el operando origen es de longitud palabra el acumulador es ,M quedando el
resultado sobre 6M ,M, si el #alor de 6M es distinto de cero los indicadores "1 F1 se acti#an!
E7emplo$ mul bte ptr ds$WdiX
mul d)
mul cl
H H H D I 5 I S I O N H H H

^ ,,6 (a7uste ,8":: para la di#isin)
8inta)is$ ,,6
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
] - - - ) ) ] ) ]
"on#ierte dos n0meros 5"6 no empaquetados contenidos en ,E ,2 en un di#idendo de un bte que queda
almacenado en ,2! ;ras la operacin ,E queda a cero! Esta instruccin es necesaria ,D;E8 de la operacin de di#idir, al
contrario que ,,A!
E7emplo$ aad
di# bl
En el e7emplo, tras con#ertir los dos n0meros 5"6 no empaquetados (en ,M) en un di#idendo #-lido, la instruccin
de di#idir genera un resultado correcto!
^ 6:L (di#isin sin signo)
8inta)is$ 6:L origen (orien no puede ser operando inmediato)
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
] - - - ] ] ] ] ]
6i#ide, sin considerar el signo, un n0mero contenido en el acumulador su e)tensin (,E, ,2 si el operando es de
tipo bte o 6M, ,M si el operando es palabra) entre el operando 3uente! El cociente se guarda en ,2 o ,M el resto en ,E o
6M seg0n el operando sea bte o palabra respecti#amente! 6M o ,E deben ser cero antes de la operacin! "uando el
cociente es maor que el resultado m-)imo que puede almacenar, cociente resto quedan inde3inidos produci>ndose una
interrupcin 0! En caso de que las partes m-s signi3icati#as del cociente tengan un #alor distinto de cero se acti#an los
indicadores "1 F1!
E7emplo$ di# bl
di# memZpal
^ :6:L (di#isin entera)
8inta)is$ :6:L origen (orien no puede ser operando inmediato)
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
] - - - ] ] ] ] ]
6i#ide, considerando el signo, un n0mero contenido en el acumulador su e)tensin entre el operando 3uente! El
cociente se almacena en ,2 o ,M seg0n el operando sea bte o palabra de igual manera el resto en ,E o 6M! 6M o ,E
deben ser cero antes de la operacin! "uando el cociente es positi#o superior al #alor m-)imo que puede almacenarse
('3h '333h), o cuando el cociente es negati#o e in3erior al #alor mnimo que puede almacenarse (.1h u .001h) entonces
cociente resto quedan inde3inidos, gener-ndose una interrupcin 0, lo que tambi>n sucede si el di#isor es 0!
E7emplo$ idi# bl
idi# b)
H H H C O N 5 E R S I O N E S H H H

^ "5U (con#ersin de bte en palabra)
8inta)is$ "5U
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
"opia el bit ' del registro ,2 en todos los bits del registro ,E, es decir, e)pande el signo de ,2 a ,M como paso
pre#io a una operacin de 1/ bits!

^ "U6 (con#ersin de palabra a doble palabra)
8inta)is$ "U6
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
E)pande el signo del registro ,M sobre el registro 6M, copiando el bit m-s signi3icati#o de ,E en todo 6M!
4!1!'! - :D8;HC"":FDE8 6E A,D:9C2,":JD 6E ",6ED,8!

^ "A98I"A985I"A98U (compara cadenas)
8inta)is$ "A98 cadenaZdestino, cadenaZorigen
"A985 (btes)
"A98U (palabras)
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
) - - - ) ) ) ) )
"ompara dos cadenas restando al origen el destino! Dinguno de los operandos se alteran, pero los indicadores
resultan a3ectados! 2a cadena origen se direcciona con registro 8: sobre el segmento de datos 68 la cadena destino se
direcciona con el registro 6: sobre el segmento e)tra E8! 2os registros 6: 8: se autoincrementan o autodecrementan seg0n
el #alor del indicador 61 (#>anse "26 8;6) en una o dos unidades, dependiendo de si se traba7a con btes o con
palabras! Cadena orien cadena destino son dos operandos redundantes que slo indican el tipo del dato (bte o palabra)
a comparar, es m-s cmodo colocar "A985 o "A98U para indicar btesIpalabras! 8i se indica un registro de segmento,
>ste sustituir- en la cadena origen al 68 ordinario! E7emplo$
lea si,origen
lea di,destino
cmpsb
^ 2F68I2F685I2F68U (cargar cadena)
8inta)is$ 2F68 cadenaZorigen
2F685 (btes)
2F68U (palabras)
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
"opia en ,2 o ,M una cadena de longitud bte o palabra direccionada sobre el segmento de datos (68) con el
registro 8:! ;ras la trans3erencia, 8: se incrementa o decrementa seg0n el indicador 61 (#>anse "26 8;6) en una o dos
unidades, seg0n se est>n mane7ando btes o palabras! Cadena2orien es un operando redundante que slo indica el tipo
del dato (bte o palabra) a cargar, es m-s cmodo colocar 2F685 o 2F68U para indicar btesIpalabras!
E7emplo$ cld
lea si,origen
lodsb
^ AFL8IAFL85IAFL8U (mo#er cadena)
8inta)is$ AFL8 cadenaZdestino, cadenaZorigen
AFL85 (btes)
AFL8U (palabras)
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
;rans3iere un bte o una palabra de la cadena origen direccionada por 68$8: a la cadena destino direccionada por
E8$6:, incrementando o decrementando a continuacin los registros 8: 6: seg0n el #alor de 61 (#>anse "26 8;6) en
una o dos unidades, dependiendo de si se traba7a con btes o con palabras! Cadena orien cadena destino son dos
operandos redundantes que slo indican el tipo del dato (bte o palabra) a comparar, es m-s cmodo colocar AFL85 o
AFL8U para indicar btesIpalabras! 8i se indica un registro de segmento, >ste sustituir- en la cadena origen al 68
ordinario!
E7emplo$ lea si,origen
lea di,destino
mo#sK
^ 8",8I8",85I8",8U (e)plorar cadena)
8inta)is$ 8",8 cadenaZdestino
8",85 (btes)
8",8U (palabras)
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
) - - - ) ) ) ) )
Hesta de ,M o ,2 una cadena destino direccionada por el registro 6: sobre el segmento e)tra! Dinguno de los
#alores es alterado pero los indicadores se #en a3ectados! 6: se incrementa o decrementa seg0n el #alor de 61 (#>anse
"26 8;6) en una o dos unidades -seg0n se est> traba7ando con btes o palabras- para apuntar al siguiente elemento de
la cadena! Cadena2destino es un operando redundante que slo indica el tipo del dato (bte o palabra), es m-s cmodo
colocar 8",85 o 8",8U para indicar btesIpalabras!
E7emplo$ lea di,destino
mo# al,&0
scasb
^ 8;F8I8;F85I8;F8U (almacena cadena)
8inta)is$ 8;F8 cadenaZdestino
8;F85 (btes)
8;F8U (palabras)
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
;rans3iere el operando origen almacenado en ,M o ,2, al destino direccionado por el registro 6: sobre el segmento
e)tra! ;ras la operacin, 6: se incrementa o decrementa seg0n el indicador 61 (#>anse "26 8;6) para apuntar al
siguiente elemento de la cadena! Cadena2destino es un operando redundante que slo indica el tipo del dato (bte o
palabra) a cargar, es m-s cmodo colocar 8;F85 o 8;F8U para indicar btesIpalabras!
E7emplo$ lea di,destino
mo# a),1991
stosK
^ HE9IHE9EIHE9RIHE9DEIHE9DR (repetir)
HE9 repetir operacin de cadena
HE9EIHE9R repetir operacin de cadena si igualIsi cero
HE9DEIHE9DR repetir operacin de cadena si no igual (si no 0)
Estas instrucciones se pueden colocar como pre3i7o de otra instruccin de mane7o de cadenas, con ob7eto de que la
misma se repita un n0mero determinado de #eces incondicionalmente o hasta que se #eri3ique alguna condicin! El n0mero
de #eces se indica en "M! 9or sentido com0n slo deben utilizarse las siguientes combinaciones$
9re3i7o 1uncin :nstrucciones
----------- ------------------------------- ----------------
HE9 Hepetir "M #eces AFL8, 8;F8
HE9EIHE9R Hepetir "M #eces mientras R1(1 "A98, 8",8
HE9DEIHE9DR Hepetir "M #eces mientras R1(0 "A98, 8",8
E7emplos$
1) 5uscar el bte /9 entre las +00 primeras posiciones de tabla (se supone tabla en el segmento E8)$
2E, 6:,tabla
AFL "M,+00
AFL ,2,/9
"26
HE9DE 8",85
[E encontrado
+) Hellenar de ceros &000 btes de una tabla colocada en datos (se supone datos en el segmento E8)$
2E, 6:,datos
AFL ,M,0
AFL "M,+&00
"26
HE9 8;F8U
%) "opiar la memoria de pantalla de te)to (adaptador de color) de un 9" en un bu33er (se supone bu""er en el
segmento E8)$
AFL "M,05.00h ; segmento de pantalla
AFL 68,"M ; en 68
2E, 6:,bu33er ; destino en E8$6:
AFL 8:,0 ; copiar desde 68$0
AFL "M,+000 ; +000 palabras
"26 ; hacia adelante
HE9 AFL8U ; copiar "M palabras
4!1!.! - :D8;HC"":FDE8 6E F9EH,":FDE8 2JB:",8 , D:LE2 6E 5:;!
^ ,D6 ( lgico)
8inta)is$ ,D6 destino, origen
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
0 - - - ) ) ] ) 0
Healiza una operacin de ? lgico entre el operando origen destino quedando el resultado en el destino! 8on
#-lidos operandos bte o palabra, pero ambos del mismo tipo!
E7emplos$ and a),b)
and bl,bte ptr es$Wsi*10hX

^ DF; (no lgico)
8inta)is$ DF; destino
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
Healiza el complemento a uno del operando destino, in#irtiendo cada uno de sus bits! 2os indicadores no resultan
a3ectados!
E7emplo$ not a)

^ FH (F lgico)
8inta)is$ FH destino, origen
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
0 - - - ) ) ] ) 0
Healiza una operacin F lgico a ni#el de bits entre los dos operandos, almacen-ndose despu>s el resultado en el
operando destino!
E7emplo$ or a),b)

^ ;E8; (comparacin lgica)
8inta)is$ ;E8; destino, origen
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
0 - - - ) ) ] ) 0
Healiza una operacin ? lgica entre los dos operandos pero sin almacenar el resultado! 2os indicadores son
a3ectados con la operacin!
E7emplo$ test al,bh

^ MFH (F e)clusi#o)
8inta)is$ MFH destino, origen
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
0 - - - ) ) ] ) 0
Fperacin FH e)clusi#o a ni#el de bits entre los operandos origen destino almacen-ndose el resultado en este
0ltimo!
E7emplo$ )or di,a)
4!1!9! - :D8;HC"":FDE8 6E "FD;HF2 6E2 9HF"E8,6FH!

^ DF9 (operacin nula)
8inta)is$ DF9
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
Healiza una operacin nula, es decir, el microprocesador decodi3ica la instruccin pasa a la siguiente! Healmente
se trata de la instruccin M"EB ,M,,M!

^ E8" (salida a un coprocesador)
8inta)is$ E8" cdigoZoperacin, origen
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
8e utiliza en combinacin con procesadores e)ternos, tales como los coprocesadores de coma 3lotante o de EI8,
abre al dispositi#o e)terno el acceso a las direcciones operandos requeridos! ,l mnemnico E8" le siguen los cdigos de
operacin apropiados para el coprocesador as como la instruccin la direccin del operando necesario!
E7emplo$ esc +1,a)

^ E2; (parada hasta interrupcin o reset)
8inta)is$ E2;
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
El procesador se detiene hasta que se restaura el sistema o se recibe una interrupcin! "omo en los 9" se
producen normalmente 1.,+ interrupciones de tipo . por segundo (del temporizador) algunos programadores utilizan E2;
para hacer pausas bucles de retardo! 8in embargo, el m>todo no es preciso puede 3allar con ciertos controladores de
memoria!

^ 2F"@ (bloquea los buses)
8inta)is$ 2F"@
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
Es una instruccin que se utiliza en aplicaciones de recursos compartidos para asegurar que no accede
simult-neamente a la memoria m-s de un procesador! "uando una instruccin #a precedida por 2F"@, el procesador
bloquea inmediatamente el bus, introduciendo una seGal por la patilla 2F"@!

^ U,:; (espera)
8inta)is$ U,:;
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
- - - - - - - - -
9ro#oca la espera del procesador hasta que se detecta una seGal en la patilla ;E8;! Fcurre, por e7emplo, cuando
el copro ha terminado una operacin e indica su 3inalizacin! 8uele preceder a E8" para sincronizar las acciones del
procesador coprocesador!
4!1!10! - :D8;HC"":FDE8 6E HF;,":JD ? 6E892,R,A:ED;F!

^ H"2 (rotacin a la izquierda con acarreo)
8inta)is$ H"2 destino, contador
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
) - - - - - - - )
Hotar a la izquierda los bits del operando destino 7unto con el indicador de acarreo "1 el n0mero de bits
especi3icado en el segundo operando! 8i el n0mero de bits a desplazar es 1, se puede especi3icar directamente, en caso
contrario el #alor debe cargarse en "2 especi3icar "2 como segundo operando! Do es con#eniente que "2 sea maor de ',
en btes; 1&, en palabras!
E7emplos$ rcl a),1
rcl al,cl
rcl di,1

^ H"H (rotacin a la derecha con acarreo)
8inta)is$ H"H destino, contador
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
) - - - - - - - )
Hotar a la derecha los bits del operando destino 7unto con el indicador de acarreo "1 el n0mero de bits
especi3icado en el segundo operando! 8i el n0mero de bits es 1 se puede especi3icar directamente; en caso contrario su
#alor debe cargarse en "2 especi3icar "2 como segundo operando$
E7emplos$ rcr b),cl
rcr b),1

^ HF2 (rotacin a la izquierda)
8inta)is$ HF2 destino, contador
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
) - - - - - - - )
Hota a la izquierda los bits del operando destino el n0mero de bits especi3icado en el segundo operando, que
puede ser 1 "2 pre#iamente cargado con el #alor del n0mero de #eces!
E7emplos$ rol d),cl
rol ah,1

^ HFH (rotacin a la derecha)
8inta)is$ HFH destino, contador
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
) - - - - - - - )
Hota a la derecha los bits del operando destino el n0mero de bits especi3icado en el segundo operando! 8i el
n0mero de bits es 1 se puede poner directamente, en caso contrario debe ponerse a tra#>s de "2!
E7emplos$ ror cl,1
ror a),cl

^ 8,2I8E2 (desplazamiento aritm>tico a la izquierda)
8inta)is$ 8,2I8E2 destino, contador
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
) - - - ) ) ] ) )
6esplaza a la izquierda los bits del operando el n0mero de bits especi3icado en el segundo operando que debe ser
"2 si es maor que 1 los bits desplazados!

^ 8,H (desplazamiento aritm>tico a la derecha)
8inta)is$ 8,H destino, contador
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
) - - - ) ) ] ) )
6esplaza a la derecha los bits del operando destino el n0mero de bits especi3icado en el segundo operando! 2os
bits de la izquierda se rellenan con el bit de signo del primer operando! 8i el n0mero de bits a desplazar es 1 se puede
especi3icar directamente, si es maor se especi3ica a tra#>s de "2!
E7emplos$ sar a),cl
sar bp,1

^ 8EH (desplazamiento lgico a la derecha)
8inta)is$ 8EH destino, contador
:ndicadores$ F1 61 :1 ;1 81 R1 ,1 91 "1
) - - - ) ) ] ) )
6esplaza a la derecha los bits del operando destino el n0mero de los bits especi3icados en el segundo operando!
2os bits de la izquierda se llena con cero! 8i el n0mero de bits a desplazar es 1 se puede especi3icar directamente en el caso
en que no ocurra se pone el #alor en "2$
E7emplos$ shr a),cl
shr cl,1
#.!. - RESUMEN AL?AB%TICO DE LAS INSTRUCCIONES Y BANDERINES. INDICE.
Dota$ en el e3ecto de las instrucciones sobre el registro de estado se utilizar- la siguiente notacin$
- bit no modi3icado
] desconocido o inde3inido
) modi3icado seg0n el resultado de la operacin
1 puesto siempre a 1
0 puesto siempre a 0
:nstruccin 8inta)is E3ecto sobre los 3lags
---------------- --------------------- --------------------------
F1 61 :1 ;1 81 R1 ,1 91 "1
,,, ,,, ] - - - ] ] ) ] )
,,6 ,,6 ] - - - ) ) ] ) ]
,,A ,,A ] - - - ) ) ] ) ]
,,8 ,,8 ] - - - ] ] ) ] )
,6" dst,3nt ,6" dst,3nt ) - - - ) ) ) ) )
,66 dst,3nt ,66 dst,3nt ) - - - ) ) ) ) )
,D6 dst,3nt ,D6 dst,3nt 0 - - - ) ) ] ) 0
",22 dsp ",22 dsp - - - - - - - - -
"5U "5U - - - - - - - - -
"2" "2" - - - - - - - - 0
"26 "26 - 0 - - - - - - -
"2: "2: - - 0 - - - - - -
"A" "A" - - - - - - - - )
"A9 dst,3nt "A9 dst,3nt ) - - - ) ) ) ) )
"A98I"A985
"A98U cdst,c3nt "A98 cdst,c3nt ) - - - ) ) ) ) )
"U6 "U6 - - - - - - - - -
6,, 6,, ] - - - ) ) ) ) )
6,8 6,8 - - - - ) ) ) ) )
6E" dst 6E" dst ) - - - ) ) ) ) -
6:L 3nt 6:L dst ] - - - ] ] ] ] ]
E8" opcode,3nt E8" opcode,3nt - - - - - - - - -
E2; E2; - - - - - - - - -
:6:L 3nt :6:L 3nt ] - - - ] ] ] ] ]
:AC2 3nt :AC2 3nt ) - - - ] ] ] ] )
:D acum,port :D acum,port - - - - - - - - -
:D" dst :D" dst ) - - - ) ) ) ) -
:D; interrup :D; interrup - - 0 0 - - - - -
:D;F :D;F - - 0 0 - - - - -
:HE; :HE; ) ) ) ) ) ) ) ) )
[cc ([,, [5E!!!) [cc dsp - - - - - - - - -
[A9 [A9 dsp - - - - - - - - -
["MR dsp ["MR dsp - - - - - - - - -
2,E1 2,E1 - - - - - - - - -
268 dst,3nt 268 dst,3nt - - - - - - - - -
2E, dst,3nt 2E, dst,3nt - - - - - - - - -
2E8 dst,3nt 2E8 dst,3nt - - - - - - - - -
2F"@ 2F"@ - - - - - - - - -
2F68I2F685I
2F68U c3nt 2F68 mem - - - - - - - - -
2FF9 2FF9 dsp - - - - - - - - -
2FF9cc (2FF9E!!!) 2FF9cc dsp - - - - - - - - -
AFL dst,3nt AFL dst,3nt - - - - - - - - -
AFL8IAFL85I
AFL8U cdst,c3nt AFL8 cdst,c3nt - - - - - - - - -
AC2 3nt AC2 3nt ) - - - ] ] ] ] )
DEB dst DEB 3nt ) - - - ) ) ) ) )
DF9 DF9 - - - - - - - - -
DF; dst DF; dst - - - - - - - - -
FH dst,3nt FH dst,3nt 0 - - - ) ) ] ) 0
FC; port,acum FC; port,acum - - - - - - - - -
9F9 dst 9F9 dst - - - - - - - - -
9F91 9F91 ) ) ) ) ) ) ) ) )
9C8E dst 9C8E dst - - - - - - - - -
9C8E1 9C8E1 - - - - - - - - -
H"2 dst,cnt H"2 dst,cnt ) - - - - - - - )
H"H dst,cnt H"H dst,cnt ) - - - - - - - )
HE9IHE9EIHE9RI
HE9DEIHE9DR HE9 - - - - - - - - -
HE; W#alX HE; W#alX - - - - - - - - -
HE;1 W#alX HE;1 W#alX - - - - - - - - -
HF2 dst,cnt HF2 dst,cnt ) - - - - - - - )
HFH dst,cnt HFH dst,cnt ) - - - - - - - )
8,E1 8,E1 - - - - ) ) ) ) )
8,2I8E2 dst,cnt 8,2 dst,cnt ) - - - ) ) ] ) )
8,H dst,cnt 8,H dst,cnt ) - - - ) ) ] ) )
855 dst,3nt 855 dst,3nt ) - - - ) ) ) ) )
8",8I8",85I
8",8U cdst 8",8 cdst ) - - - ) ) ) ) )
8EH dst,cnt 8EH dst,cnt ) - - - ) ) ] ) )
8;" 8;" - - - - - - - - 1
8;6 8;6 - 1 - - - - - - -
8;: 8;: - - 1 - - - - - -
8;F8I8;F85I
8;F8U cdst 8;F8 cdst - - - - - - - - -
8C5 dst,3nt 8C5 dst,3nt ) - - - ) ) ) ) )
;E8; dst,3nt ;E8; dst,3nt 0 - - - ) ) ] ) 0
U,:; U,:; - - - - - - - - -
M"EB dst,3nt M"EB dst,3nt - - - - - - - - -
M2,; t3nt M2,; t3nt - - - - - - - - -
MFH dst,3nt MFH dst,3nt 0 - - - ) ) ] ) 0
#.". - INSTRUCCIONES ES$ECI?ICAS DEL !30, "30 = #30 EN MODO REAL.
4!%!1! - 6:1EHED":,8 ED E2 "FA9FH;,A:ED;F B2F5,2 HE89E";F ,2 .0./!
- E)cepciones de di#isin$
2as e)cepciones :D; 0, debidas a una di#isin por cero o a un cociente e)cesi#amente grande, pro#ocan que en la
pila se almacene el #alor de "8$:9 para la siguiente instruccin en el .0./! En el +./ superiores se almacena el "8$:9 de
la propia instruccin que causa la e)cepcin!
- "digos de operacin inde3inidos!
En el +./ superiores se produce una e)cepcin / (:D; /) o, si es una instruccin con sentido para estos
procesadores, se e7ecuta! El .0./ se estrella!
- Lalor de 9C8E 89!
El #alor que introduce en la pila en el +./ superiores es el de 89 antes del 9C8E; en el .0./ es el de 89 despu>s
del 9C8E (dos unidades menos)!
- 6esplazamientos rotaciones!
El #alor de desplazamiento en las operaciones de manipulacin de bits del .0./ es una constante de . bits (indicada
en "2); en el +./ superiores se toma mdulo %+ (slo se consideran los & bits menos signi3icati#os)!
- 9re3i7os redundantes!
2as instrucciones tienen una longitud ilimitada en el .0./; en el +./ superiores no pueden e)ceder de 1& btes! 9or
tanto, los pre3i7os redundantes pueden producir e)cepciones de cdigo de operacin no #-lido!
- ,ccesos al lmite del segmento!
Cn acceso de 1/ bits en el o33set 01111h en el .0./ pro#oca un acceso a los btes ubicados en las posiciones
01111h 0 (se da la #uelta alrededor del segmento)! En el +./ superiores, se
produce una e)cepcin de #iolacin de lmites! En el %./ superiores se produce tambi>n en accesos de %+ bits en las
posiciones 01116h a la 01111h! Esto se cumple tanto para accesos a datos en memoria como a instrucciones del programa
en esos puntos crticos!
- 2F"@!
Esta instruccin no est- limitada de ninguna manera en el .0./ en el +./! En el %./ superiores su uso est-
restringido a determinadas instrucciones!
- E7ecucin paso a paso!
2a prioridad de la e)cepcin paso a paso en el +./ superiores es m-s alta que la de una interrupcin e)terna; por
tanto, las interrupciones e)ternas no pueden ser traceadas!
- Hegistro de 12,B8!
6i3iere algo en los bits 1+ al 1& en todos los procesadores; el %./ dispone adem-s de un registro de 3lags de %+ bits!
- :nterrupcin DA:!
6esde el +./ superiores, una DA: no puede interrumpir una rutina de tratamiento DA:!
- Error del coprocesador!
En el +./ superiores se utiliza el #ector 1/; en el .0./ cualquier #ector!
- 9re3i7os de las instrucciones del coprocesador!
,l producirse una e)cepcin de error de coprocesador, en el .0./ se almacena un "8$:9 que no inclue pre3i7os -si los
haba-, al contrario que en el +./ superiores!
- 2mite del primer megabte!
En el .0./ la memoria es circular; al 3inal del primer megabte se #uel#e a comenzar por las posiciones m-s ba7as de
la memoria! En el +./ superiores, se accede a la memoria e)tendida (un arti3icio hardKare en los 9" lo impide al 3orzar
,+0 a estado ba7o, pero puede ser sol#entado)!
- :nstrucciones de cadena repetiti#as!
El "8$:9 grabado en el .0./ no inclue el pre3i7o, si e)iste; en el +./ superiores s!
4!%!+! - :D8;HC"":FDE8 E89E":1:",8 6E2 +./!
, continuacin se describen las instrucciones adicionales que incorporan los +./ en modo real, que tambi>n pueden ser
consideradas cuando traba7amos con los microprocesadores compatibles L+0 L%0, as como con los procesadores
superiores al +./! 2as instrucciones del modo protegido se dirigen especialmente a la multiprogramacin el tiempo
compartido, siendo espec3icas de la conmutacin de procesos tratamiento de la memoria #irtual no pueden emplearse
directamente ba7o 6F8!

^ 5FCD6 r1/, mem1/$ "omprueba si el registro de 1/ bits indicado como primer operando est- dentro de los lmites de una
matriz! 2os lmites de la matriz los de3inen dos palabras consecuti#as en la memoria apuntadas por mem1/! 8i est- 3uera de
los lmites, se produce una interrupcin & en la que el :9 apilado queda apuntando a la instruccin 5FCD6 (Nno se
incrementaO)!

^ ED;EH crea una estructura de pila para un procedimiento de alto ni#el!

^ 2as instrucciones 9C8E permiten meter #alores inmediatos a la pila$ es #-lido hacer 9C8E 40h!

^ :AC2 puede multiplicar cualquier registro de 1/ bits por una constante inmediata, de#ol#iendo un resultado palabra ("1(1
si no cabe en 1/ bits); por e7emplo, es #-lido :AC2 "M,+&! ;ambi>n se admiten tres operandos$ :AC2 r1, r+, imm! En este
caso, se multiplica r+ por el #alor inmediato
(.I1/ bits) el resultado se almacena en r1! ;anto r1 como r+ han de ser de 1/ bits!

^ 2E,LE abandona los procedimientos de alto ni#el (equi#ale a AFL 89,59 I 9F9 59)!

^ 9C8E,I9F9,$ :ntroduce en la pila en este orden los registros ,M, "M, 6M, 5M, 89, 59, 8: 6: -o los saca en orden
in#erso-! :deal en el mane7o de interrupciones mu usada en las 5:F8 de +./ %./!

^ FC;8 (salida de cadenas) e :D8 (entrada de cadenas) repetiti#as (equi#alente a AFL8 2F68)!

^ H"HIH"2, HFHIHF2, 8,2I8,H 8E2I8EH admiten una constante de rotacin distinta de 1!
4!%!%! - :D8;HC"":FDE8 9HF9:,8 6E2 %./ ? 4./!

^ ,dem-s de todas las posibilidades adicionales del +./, el %./ el 4./ permiten utilizar cualquier registro de %+ bits de
propsito general en todos los modos de 3uncionamiento, incluido el modo real, tales como E,M, E5M, E"M, E6M, E8:, E6:,
E59! 8in embargo no deben intentarse direccionamientos por encima de los /4@! En otras palabras, se pueden utilizar para
acelerar las operaciones pero no para acceder a m-s memoria! 9or e7emplo, si E5M ` 01111h, la instruccin AFL ,M,WE5MX
tendra un resultado impredecible! ,dem-s, estos procesadores cuentan con dos segmentos m-s$ adem-s de 68, E8, "8
88 se pueden emplear tambi>n 18 B8! ,#iso$ parece ser que en algunos %./ 3allan ocasionalmente las instrucciones de
multiplicar de %+ bits!
Dota$ Do es del todo cierto que el %./ el 4./ no permitan acceder a m-s de /4 @b en modo real$ en la seccin
4!%!/ ha un e7emplo de ello!

^ 2os modos de direccionamiento aumentan notablemente su 3le)ibilidad en el %./ superiores! "on los registros de 1/ bits
slo est-n disponibles los modos tradicionales! En cambio, con los de %+ se puede utilizar en el direccionamiento indirecto
cualquier registro$ es #-lida, por e7emplo, una instruccin del tipo AFL ,M,WE"MX o AFL E6M,WE,MX! 2os desplazamientos
en el direccionamiento inde)ado con registros de %+ bits pueden ser de . tambi>n de %+ bits! "uando dos registros deben
sumarse para calcular la direccin e3ecti#a, el segundo puede estar multiplicado por +, 4 u .; por e7emplo, es #-lida la
instruccin AFL ,2,WE6M*E,MS.X! 9or supuesto, ba7o 6F8 ha que asegurarse siempre que el resultado de todas las
operaciones que determinan la direccin e3ecti#a no e)cede de 01111h (0111Eh si se accede a palabras 0111"h en
accesos a dobles palabras en memoria)!

^ 5FCD6 r%+, mem%+$ 8e admiten ahora operandos de %+ bits!

^ 581I58H$ E)ploracin de bits hacia adelante atr-s, respecti#amente! 2a sinta)is es$
581 reg, reg 581 reg, WmemoriaX
58H reg, reg 58H reg, WmemoriaX
6onde re puede ser de 1/ %+ bits! 8e comienza a e)plorar por el bit 0 (581) o por el m-s signi3icati#o (58H) del
segundo operando$ si no aparece ning0n bit acti#o (a 1) el indicador R1 se acti#a; en caso contrario se almacena en el
primer operando la posicin relati#a de ese bit$
AFL ,M,.
581 5M,,M
[R a)ZesZ0 ; no se saltar-, adem-s 5M ( %

^ 5;I5;"I5;HI5;8$ Fperaciones sobre bits$ comprobacin, comprobacin complementacin, comprobacin puesta a 0,
comprobacin puesta a 1! 8inta)is (e7emplo sobre 5;)$
5; reg, reg 5; reg, imm.
6onde re puede ser de 1/ %+ bits, el operando inmediato es necesariamente de .! Estas instrucciones copian el
n0mero de bit del primer operando que indique el segundo operando (entre 0 %1) en el acarreo! , continuacin no le hacen
nada a ese bit (5;), lo complementan (5;"), lo borran (5;H) o lo acti#an (5;8)! E7emplo$
AFL ,M,1/
5;" ,M,4 ; resultado$ "1 ( 1 ,M ( 0

^ "6T$ 8imilar a "U6, e)tiende el signo de E,M a E6M$E,M!

^ "A986$ 8imilar a "A98U pero empleando E8:, E6:, E"M comparando datos de %+ bits! 8e puede emplear ba7o 6F8
siempre que E8: E6: (utilizando HE9 tambi>n E"M) no e)cedan de 01111h!

^ "U6E$ E)tiende el signo de ,M a E,M!

^ :AC2$ ,hora se admite un direccionamiento a memoria en el +b operando$ :AC2 "M,WdatoX

^ :D86$ 8imilar a :D8U pero empleando E8:, E6:, E"M leendo datos de %+ bits! 8e puede emplear ba7o 6F8 siempre
que E8: E6: (utilizando HE9 tambi>n E"M) no e)cedan de 01111h!

^ [cc$ 2os saltos condicionales ahora pueden ser de N%+ bitsO! Aucho cuidado con la directi#a !%./ en los programas en que
se desee mantener la compatibilidad con procesadores anteriores! [E"MR se utiliza en #ez de ["MR (mismo cdigo de
operacin)!

^ 2F686$ 8imilar a 2F68U pero empleando E8:, E6: E"M cargando datos de %+ bits en E,M! 8e puede emplear ba7o
6F8 siempre que E8: E6: (utilizando HE9 tambi>n E"M) no e)cedan de 01111h!

^ 288, 218, 2B8$ similar a 268 o 2E8 pero con esos registros de segmento!

^ AFL "H),reg I AFL 6H),reg los recprocos$ acceso a registros de control depuracin!

^ AFL86$ 8imilar a AFL8U pero empleando E8:, E6:, E"M mo#iendo datos de %+ bits! 8e puede emplear ba7o 6F8
para acelerar las trans3erencias siempre que E8: E6: (utilizando HE9 tambi>n E"M) no e)cedan de 01111h! Fperando
sobre la memoria de #deo slo se obtiene #enta7a si la tar7eta es realmente de %+ bits!

^ AFL8M I AFLRM$ carga con e)tensin de signo o cero! ;oma el segundo operando, le e)tiende adecuadamente el signo
(o le pone a cero la parte alta) hasta que sea tan grande como el primer operando luego lo carga en el primer operando! 8i
el primer operando es de 1/ bits, el segundo slo puede ser de .; si el primero es de %+ bits el segundo puede ser de . 1/!
El primer operando debe ser un registro, el segundo puede ser un registro u operando en memoria (nunca inmediato)$
AFL E,M,011111111h
AFL ,M,'111h ; resultado$ E,M ( 01111'111h
AFL8M E,M,,M ; resultado$ E,M ( 00000'111h

^ FC;86$ 8imilar a FC;8U pero empleando E8:, E6:, E"M en#iando datos de %+ bits! 8e puede emplear ba7o 6F8
siempre que E8: E6: (usando HE9 tambi>n E"M) no rebasen 01111h!

^ 9re3i7os 18$ B8$ en los accesos a memoria, re3erenciando a esos segmentos!

^ 9C8E,6 I 9F9,6$ 8imilares a 9C8E, 9F9, pero con los registro de %+ bits! 2a instruccin 9F9,6 3alla en la maora
de los %./, incluidos los de ,A6! 9ara sol#entar el 3allo (que consiste en que E,M no se restaura correctamente) basta
colocar un DF9 inmediatamente detr-s de 9F9,6!

^ 9C8E16I9F916 introducen sacan de la pila los 3lags de %+ bits!

^ 8",86$ 8imilar a 8",8U pero empleando E8:, E6:, E"M buscando datos de %+ bits! 8e puede emplear ba7o 6F8
siempre que E8: E6: (usando HE9 tambi>n E"M) no rebasen 01111h!

^ 8E;cc reg. mem.$ 8i se cumple la condicin cc, se pone a 1 el bte de memoria o registro de . bits indicado (si no, a 0)!
9or e7emplo, con el acarreo acti#o, 8E;" ,2 pone a 1 el registro ,2!

^ 8E26 I 8EH6$ 6esplazamiento de doble precisin a la izquierdaIderecha! 2a sinta)is es (e7emplo sobre 8E26)$
8E26 regmem1/, reg1/, imm. 8E26 regmem1/, reg1/, "
8E26 regmem%+, reg%+, imm. 8E26 regmem%+, reg%+, "2
6onde remem es un registro u operando en memoria, indistintamente, del tamaGo indicado! En el caso de 8E26, se
desplaza el primer operando a la izquierda tanto como indique el tercer operando (contador)! Cna #ez desplazado, los bits
menos signi3icati#os se rellenan con los m-s signi3icati#os del segundo operando, que no resulta alterado! 8EH6 es an-logo
pero al re#>s!
AFL ,M,1+%4h
AFL 5M,&/'.h
8E26 ,M,5M,4 ; resultado$ ,M(+%4&h, 5M(&/'.h

^ 8;F86$ 8imilar a 8;F8U pero empleando E8:, E6:, E"M almacenando E,M! 8e puede emplear ba7o 6F8 siempre que
E8: E6: (utilizando HE9 tambi>n E"M) no e)cedan de 01111h!
4!%!4! - 6E;E"":JD 6E CD 8:8;EA, ,; F 8C9EH:FH!
Ea casos en los que es necesario determinar si una m-quina es ,; o superior$ no a de cara a emplear instrucciones
propias del +./ en modo real (tambi>n disponibles en los L+0IL%0 .01..I.01./) sino debido a la necesidad de acceder a
ciertos chips (por e7emplo, el segundo controlador de interrupciones) que de antemano se sabe que slo equipan m-quinas
,; o superiores! Es importante por tanto determinar la presencia de un ,;, de cara a e#itar ciertas instrucciones que podran
bloquear un 9" o M;! Do se debe en estos casos comprobar los btes de la HFA que identi3ican el equipo$ a #eces no son
correctos , adem-s, la e#olucin 3utura que tengan es impredecible! 2o ideal es #eri3icar directamente si est- instalado un
+./ o superior!
9C8E1
9F9 ,M ; ,M ( 3lags
,D6 ,E,01h ; borrar nibble m-s signi3icati#o
9C8E ,M
9F91 ; intentar poner a 0 los 4 bits m-s signi3icati#os de los 3lags
9C8E1
9F9 ,M
,D6 ,E,010h ; seguir-n #aliendo 1 e)cepto en un .0+./ o superior
"A9 ,E,010h
[E noZesZ,;
[A9 siZesZ,; ; es +./ o superior
4!%!&! - EL,2C,":JD EM,";, 6E2 A:"HF9HF"E8,6FH :D8;,2,6F!
8obra decir que las instrucciones a#anzadas deben ser utilizadas con la pre#ia comprobacin del tipo de procesador,
aunque slo sea para decir al usuario que se compre una m-quina m-s potente antes de abortar la e7ecucin del programa!
9ara a#eriguar el procesador de un ordenador puede emplearse el siguiente programa de utilidad, basado en el
procedimiento p8o')+a*o8J que de#uel#e en ,M un cdigo num>rico entro 0 . distinguiendo entre los 9 procesadores m-s
di3ciles de identi3icar de los ordenadores compatibles! Dota$ el 4./ no tiene que tener coprocesador necesariamente (el
4./s) carece de >l)!
,lgunas #ersiones de procesador 4./ todos los procesadores posteriores soportan la instruccin "9C:6 que permite
identi3icar la "9C! 5asta comprobar un bit del registro de estado para saber si est- soportada , en ese caso, poder emplear
dicha instruccin! 6e este modo, resulta tri#ial detectar el 9entium o cualquier procesador posterior que aparezca! Esta
instruccin est- documentada, por e7emplo en alguno de los 3icheros que acompaGan al :nterrupt 2ist! 9ara los propsitos de
este libro no es preciso en general detectar m-s all- del %./!
Es normal que el lector reci>n iniciado en el ensamblador no entienda absolutamente nada de este programa, a que
hasta los siguientes captulos no ser- e)plicada la sinta)is del lengua7e! En ese caso, puede saltarse este e7emplo
continuar en el captulo siguiente, m-)ime si no tiene pre#isto traba7ar con otras instrucciones que no sean las del .0./! 9or
0ltimo, recordar que las instrucciones espec3icas del +./ en modo real tambi>n est-n disponibles en los L+0IL%0 de DE"
la serie .01..I.01./ de :ntel!
; SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
; S S
; S "9C #+!+ (c) 8eptiembre 199+ "iri8F1; S
; S (c) Brupo Cni#ersitario de :n3orm-tica - Lalladolid S
; S S
; S Este programa determina el tipo de microprocesador del equipo S
; S de#uel#e un cdigo EHHFH2ELE2 indic-ndolo$ S
; S S
; S 0-.0.., 1-.0./, +-DE" L+0, %-DE" L%0, S
; S 4-.01.., &-.01./, /-+./, '-%./, .-4./ S
; S S
; S ,#iso$ Ctilizar ;,8A +!0 o compatible e)clusi#amente! S
; S S
; SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
cpu 8EBAED;
,88CAE "8$cpu, 68$cpu
!%./
FHB 100h
inicio$
2E, 6M,te)toZini ; te)to de saludo
AFL ,E,9
:D; +1h ; imprimirlo
",22 procesador] ; tipo de procesador en ,M
9C8E ,M ; guardarlo para el 3inal
2E, 5M,cpusZindice-+ ; tabla de nombres-+
AFL "M,01111h ; n0mero de iteracin-1
otroZproc$ :D" "M
,66 5M,+
AFL 6M,W5MX ; nombre del primer procesador
",22 print
"A9 "M,,M ; cprocesador del equipo]
[DE noZesZeste
2E, 6M,apuntadorZt)t ; s lo es$ indicarlo
",22 print
noZesZeste$ 2E, 6M,separadorZt)t
",22 print
"A9 "M,' ; n0mero de "9Cs tratadas-1
[5E otroZproc
2E, 6M,te)toZ3in ; 0ltimos caracteres
",22 print
AFL ,E,4"h ; retornar cdigo errorle#el ,2
:D; +1h ; 3in de programa
procesador] 9HF" ; de#ol#er el tipo de microprocesador en ,M
9C8E1
9C8E 68
9C8E E8
9C8E "M
9C8E 6M
9C8E 6:
9C8E 8:
AFL ,M,"8
AFL 68,,M ; durante la rutina se guardar-
AFL E8,,M ; el tipo de procesador en 62$
AFL 62,/ ; supuesto un +./ (62(/) !!!
9C8E1
9F9 ,M ; ,M ( 3lags
,D6 ,M,0111h ; borrar nibble m-s signi3icati#o
9C8E ,M
9F91 ; intentar poner a 0 los 4 bits m-s
9C8E1 ; signi3icati#os de los 3lags
9F9 ,M
,D6 ,M,01000h ; seguir-n #aliendo 1 e)cepto en
"A9 ,M,01000h ; un .0+./ o superior
[E ni+./niZsuper
9C8E1 ; es +./ o superior
9F9 ,M
FH ,M,'000h ; intentar acti#ar bit 1+, 1% 14
9C8E ,M
9F91
9C8E1
9F9 ,M
,D6 ,M,'000h ; +./ pone bits 1+, 1% 14 a cero
[R cpuZhallada ; es un +./ (62(/)
:D" 62 ; es un %./ (62(') !!! de momento
9C8E 6M
"2: ; momento crtico
AFL E6M,E89 ; preser#ar E89 en E6M
,D6 E89,01111h ; borrar parte alta de E89
,D6 E89,0111"h ; 3orzar E89 a m0ltiplo de 4
9C8E16 ; guardar 3lags en pila (%+ bits)
9F9 E,M ; recuperar 3lags en E,M
AFL E"M,E,M
MFH E,M,40000h ; conmutar bit 1.
9C8E E,M
9F916 ; intentar cambiar este bit
9C8E16
9F9 E,M ; E"M conser#a el bit inicial
MFH E,M,E"M ; bit 1. de E,M a 1 si cambi
8EH E,M,1+h ; mo#er bit 1. a bit 0
,D6 E,M,1 ; de7ar slo ese bit
9C8E E"M
9F916 ; restaurar bit 1. de los 3lags
AFL E89,E6M ; restaurar E89
8;: ; permitir interrupciones de nue#o
9F9 6M ; recuperar tipo de "9C en 62
"A9 ,M,0
[E cpuZhallada ; es %./$ 62(' (bit 1. no cambi)
:D" 62 ; es 4./$ 62(. (bit 1. cambi)
[A9 cpuZhallada
ni+./niZsuper$ AFL 62,4 ; supuesto un .01.. !!!
AFL ,M,01111h
AFL "2,%%
8E2 ,M,"2 ; (.01..I.01./ toman "2 mod %+)
[DR tipoZbusZproc ; !!! lo es, calcular bus (1..I1./)
AFL 62,+ ; no lo es, supuesto un L+0 !!!
AFL "M,01111h
8;:
65 01%h,+/h,0,"h ; opcode de HE9R 2F685 E8$
["MR tipoZbusZproc ; !!! lo es, calcular bus (L+0IL%0)
MFH 62,62 ; a slo puede ser un .0..I.0./
tipoZbusZproc$ 8;6 ; trans3erencias hacia arriba
2E, 6:,tipoZbusZdest
AFL ,2,5?;E 9;H 68$tipoZbusZbte ; opcode de 8;:
AFL "M,%
"2:
HE9 8;F85 ; trans3erir tres btes
"26
DF9 ; el :D" "M (1 bte) ser- machacado
DF9 ; con 8;F85 pero a0n se e7ecutar-
DF9 ; en un .0./I.01./IL%0 ( no en un
:D" "M ; .0..I.01..IL+0) porque est- en la
tipoZbusZbte$ 8;: ; cola de lectura adelantada!
tipoZbusZdest$ 8;:
["MR cpuZhallada ; el bus a era supuesto de . bits
:D" 62 ; resulta que es de 1/
cpuZhallada$ AFL ,2,62
MFH ,E,,E
9F9 8:
9F9 6:
9F9 6M
9F9 "M
9F9 E8
9F9 68
9F91
HE; ; ,M ( "9C$ 0I1-.0..I./, +I%-DE" L+0IL%0
procesador] ED69 ; 4I&-.01..I1./, /-+./, '-%./, .-4./
print 9HF"
9C8E ,M
9C8E 5M
9C8E "M
AFL ,E,9
:D; +1h
9F9 "M
9F9 5M
9F9 ,M
HE;
print ED69
cpusZindice 6U i..,i./,#+0,#%0,i1..,i1./,i+./,i%./,i4./
i.. 65 V:ntel .0.. dV
i./ 65 V:ntel .0./ dV
#+0 65 V DE" L+0 dV
#%0 65 V DE" L%0 dV
i1.. 65 V:ntel .01..dV
i1./ 65 V:ntel .01./dV
i+./ 65 V:ntel .0+./dV
i%./ 65 V:ntel .0%./dV
i4./ 65 V:ntel .04./dV
apuntadorZt)t 65 V \---dV
te)toZini 2,5E2 5?;E
65 1%,10,V"9C ;est #+!+ V
65 V(c) 8eptiembre 199+ "iriaco Barca de "elis!V
65 1%,10,V El microprocesador de este V
65 Vequipo es compatible$V,10
separadorZt)t 65 1%,10,9,9,9,VdV
te)toZ3in 65 1%,10,VdV
cpu ED68
ED6 inicio
4!%!/! - AF6F 92,DF (134T) 6E2 %./ ? 8C9EH:FHE8!
"omo a se coment, no es estrictamente cierto que no se pueda rebasar el lmite de /4 @b en los segmentos en modo
real! El problema es que al encender el ordenador, el %./ tiene de3inidos por de3ecto dichos lmites de /4 @b! 8in embargo,
se puede pasar un momento a modo protegido, ampliar el lmite #ol#er a modo real! Entonces se consigue el llamado
modo "lat o plano! Do solo es 3actible de este modo saltar la restriccin de /4 @b, sino que adem-s se puede acceder
directamente, desde el modo real, a toda la memoria por encima del primer megabte!
El problema es que pasar a modo protegido no es sencillo cuando la m-quina a est- en modo protegido emulando al
modo real (el conocido como modo #irtual ./)! 9or tanto, el siguiente programa de e7emplo no 3unciona si est- cargado un
controlador de memoria e)pandida (EAA%./, TEAA) o dentro de UindoKs %!)! ,rrancando sin controlador de memoria
(e)cepto E:AEA) no habr- problema alguno! El programa de e7emplo se limita a llenar la pantalla de te)to (empleando ahora
la direccin absoluta 05.000h a tra#>s de E5M) de letras Y,Y!
Ftra restriccin de este programa de e7emplo es que no acti#a la lnea ,+0 de direcciones; dicho de otro modo, el bit +1b
(de los %+ bits de la direccin de memoria) suele estar 3orzado a 0 por de3ecto al arrancar! 9ara acceder a la memoria de
#deo esto no es problema, pero por encima del primer megabte podra haber problemas seg0n a qu> direccin se pretenda
acceder! 6e todos modos, sera relati#amente sencillo habilitar la lnea ,+0 directamente o a tra#>s de una 3uncin del
controlador MA8!
Daturalmente, se sale de los ob7eti#os de este libro describir el modo protegido o e)plicar los pasos que realiza esta rutina
de demostracin! "ons0ltese al e3ecto la bibliogra3a recomendada del ap>ndice!
; *------------------------------------------------------------------*
; e Hutina para acti#ar el modo 3lat del %./ superiores (acceso e
; e a 4 Bb en modo real)! e
; e e
; e ;,8A 3lat%./ Im& e
; e ;2:D@ 3lat%./ It I%+ e
; *------------------------------------------------------------------*
!%./p ; slo para %./ o superior
segmento 8EBAED; C8E1/
,88CAE "8$segmento, 68$segmento
FHB 100h
prueba$
",22 3lat%./ ; acti#ar modo 3lat
MFH ,M,,M
AFL 68,,M
AFL E5M,05.000h ; direccin de #deo absoluta
AFL "M,+000
llenaZpant$ AFL 5?;E 9;H WE5MX,Y,Y
:D" E5M
AFL 5?;E 9;H WE5MX,1&
:D" E5M
2FF9 llenaZpant
:D; +0h ; 3in de programa
; ------------ Esta rutina pasa moment-neamente a modo protegido de
; manera directa (necesita la "9C en modo real)! Do se
; acti#a la lnea ,+0 (necesario hacerlo directamente
; o a tra#>s de alg0n ser#icio MA8 antes de acceder a
; las -reas de memoria e)tendida a3ectadas)!
3lat%./ 9HF"
9C8E 68
9C8E E8
9C8E E,M
9C8E 5M
9C8E "M
AFL "M,88
MFH E,M,E,M
AFL ,M,"8
8E2 E,M,4 ; direccin lineal de segmento "8
,66 E,M,F118E; gdt ; desplazamiento de B6;
AFL "8$Wgd+X,E,M ; guardar direccin lineal de B6;
"2:
2B6; "8$WgdtrX ; cargar tabla global de descriptores
AFL E,M,"H0
FH ,2,1 ; bit de modo protegido
AFL "H0,E,M ; pasar a modo protegido
[A9 8EFH; d*+ ; borrar cola de preb0squeda
AFL 5M,gcodl ; ndice de descriptor en 5M
AFL 68,5M ; cargar registro de segmento 68
AFL E8,5M ; E8
AFL 88,5M ; 88
AFL 18,5M ; 18
AFL B8,5M ; B8
,D6 ,2,11111110b
AFL "H0,E,M ; #ol#er a modo real
[A9 8EFH; d*+ ; borrar cola de preb0squeda
AFL 88,"M
8;:
9F9 "M
9F9 5M
9F9 E,M
9F9 E8
9F9 68
HE;
gdtr 2,5E2 TUFH6 ; datos para cargar en B6;H
gd1 6U gdtl-1
gd+ 66 ]
gdt 65 0,0,0,0,0,0,0,0 ; B6;
gcod 65 033h,033h,0,0,0,93h,0c3h,0
gcodl ETC d-F118E; gdt
gdat 65 033h,033h,0,0,0,9%h,0c3h,0
gdtl ETC d-F118E; gdt
3lat%./ ED69
segmento ED68
ED6 prueba
Captulo 5: EL LEN1UA@E ENSAMBLADOR DEL 39,30
Easta ahora hemos #isto los mnem!nicos de las instrucciones que pasadas a su correspondiente cdigo binario a puede
entender el microprocesador! 8i bien se realiza un gran a#ance al introducir los mnemnicos respecto a programar
directamente en lengua7e maquina -es decir, con n0meros en binario o he)adecimal- a0n resultara tedioso tener que realizar
los c-lculos de los desplazamientos en los saltos a otras partes del programa en las trans3erencias de control, reser#ar
espacio de memoria dentro de un programa para almacenar datos, etc!!! 9ara 3acilitar estas operaciones se utilizan
las *-8)'t-;a+ que indican al ensamblador qu> debe hacer con las instrucciones los datos!
2os programas de e7emplo de este libro la sinta)is de ensamblador tratada son las del A,8A de Aicroso3t el
ensamblador de :5A! Do obstante, todos los programas han sido desarrollados con el ;urbo ,ssembler +!0 de 5orland
(;,8A), compatible con el cl-sico A,8A &!0 de Aicroso3t pero m-s potente al mismo tiempo mucho m-s r-pido 3le)ible!
;,8A genera adem-s un cdigo m-s reducido optimizado! 9or otra parte, A,8A &!0 no permite cambiar (aunque s la
/!0) dentro de un segmento el modo del procesador$ esto conlle#a el riesgo de e7ecutar indeseadamente instrucciones de %+
bits al no poder acotar e)actamente las lneas donde se desea emplearlas, algo #ital para mantener la compatibilidad con
procesadores anteriores! ;ambi>n es propenso a generar errores de "ase otros similares al tratar con listados un poco
grandes! Hespecto a A,8A /!0, el autor de este libro encontr que en ocasiones calcula incorrectamente el #alor de
algunos smbolos etiquetas, aunque es probable que la #ersin /!1 (aparecida sospechosa e inusualmente mu poco
tiempo despu>s) haa corregido dichos 3allos, intolerables en un ensamblador! 9or otro lado, las posibilidades adicionales de
;,8A no han sido empleadas por lo general! Auchos programas han sido ensamblados una #ez con A,8A, para asegurar
que >ste puede ensamblarlos!
"on#iene decir aqu que este captulo es especialmente arduo para aquellos que no conocen el lengua7e ensamblador de
ninguna m-quina! 2a razn es que la in3ormacin est- organizada a modo de re3erencia, por lo que con 3recuencia se utilizan
unos elementos -para e)plicar otros- que a0n no han sido de3inidos! Ello por otra parte resulta ine#itable tambi>n en algunos
libros m-s b-sicos, debido a la comple7idad de la sinta)is del lengua7e ensamblador ideada por el 3abricante (que no la del
microprocesador)! 9or ello, es un buen conse7o actuar a dos pasadas, al igual que el propio ensamblador en ocasiones$ leer
todo una #ez primero -aunque no se entienda del todo- #ol#erlo a leer despu>s m-s despacio!
&.1. - SINTAXIS DE UNA LINEA EN ENSAMBLADOR.
Cn programa 3uente en ensamblador contiene dos tipos de +)t)'-a+$ las instrucciones las directivas! 2as
instrucciones se aplican en tiempo de e7ecucin, pero las directi#as slo son utilizadas durante el ensambla7e! El 3ormato de
una sentencia de instruccin es el siguiente$
WetiquetaX nombreZinstruccin WoperandosX WcomentarioX
2os corchetes, como es normal al e)plicar instrucciones en in3orm-tica, indican que lo especi3icado entre ellos es
opcional, dependiendo de la situacin que se trate!
Ca(po *) )t-Eu)ta. Es el nombre simblico de la primera posicin de una instruccin, puntero o dato! "onsta de
hasta %1 caracteres que pueden ser las letras de la , a la R, los n0meros del 0 al 9 algunos caracteres especiales como
<f=, <Z=, <!= <d=! Heglas$
- 8i se utiliza el punto <!= >ste debe colocarse como primer car-cter de la etiqueta!
- El primer car-cter no puede ser un dgito!
- Do se pueden utilizar los nombres de instrucciones o registros como nombres de etiquetas!
las etiquetas son de tipo DE,H cuando el campo de etiqueta 3inaliza con dos puntos ($); esto es, se considera cercana$
quiere esto decir que cuando realizamos una llamada sobre dicha etiqueta el ensamblador considera que est- dentro del
mismo segmento de cdigo (llamadas intrasegmento) el procesador slo carga el puntero de instrucciones :9! ;>ngase en
cuenta que hablamos de instrucciones; las etiquetas empleadas antes de las directi#as, como las directi#as de de3inicin de
datos por e7emplo, no lle#an los dos puntos sin embargo son cercanas!
2as etiquetas son de tipo 1,H si el campo de etiqueta no termina con los dos puntos$ en estas etiquetas la instruccin
a la que apunta no se encuentra en el mismo segmento de cdigo sino en otro! "uando es re3erenciada en una trans3erencia
de control se carga el puntero de instrucciones :9 el segmento de cdigo "8 (llamadas intersegmento)!
Ca(po *) o(<8). "ontiene el mnemnico de las instrucciones #istas en el captulo anterior, o bien una directi#a de
las que #eremos m-s adelante!
Ca(po *) op)8a*o+. :ndica cuales son los datos implicados en la operacin! 9uede haber 0, 1 +; en el caso de
que sean dos al 1b se le llama destino al +b -separado por una coma- 3uente!
mo# a), es$WdiX --` a) destino
es$WdiX origen
Ca(po *) 'o()ta8-o+. "uando en una lnea ha un punto coma (;) todo lo que sigue en la lnea es un comentario
que realiza aclaraciones sobre lo que se est- haciendo en ese programa, resulta de gran utilidad de cara a realizar 3uturas
modi3icaciones al mismo!
&.!. - CONSTANTES Y O$ERADORES.
2as sentencias 3uente -tanto instrucciones como directi#as- pueden contener constantes operadores!
&!+!1! - "FD8;,D;E8!
9ueden ser binarias (e7! 10010b), decimales (e7! %4d), he)adecimales (e7! 0E0h) u octales (e7! +1o +1q); tambi>n las ha
de cadena (e7! YpepeY, V7uanV) e incluso con comillas dentro de comillas de distinto tipo (como Yhola,VamigoVY)! En las
he)adecimales, si el primer dgito no es num>rico ha que poner un 0! 8lo se puede poner el signo (-) en las decimales (en
las dem-s, calc0lese el complemento a dos)! 9or de3ecto, las num>ricas est-n en base 10 si no se indica lo contrario con
una directi#a (poco recomendable como se #er-)!
&!+!+! - F9EH,6FHE8 ,H:;Aa;:"F8!
9ueden emplearse libremente (*), (-), (S) (I) -en este 0ltimo caso la di#isin es siempre entera-! Es #-lida, por e7emplo,
la siguiente lnea en ensamblador (que se apoa en la directi#a 6U, que se #er- m-s adelante, para reser#ar memoria para
una palabra de 1/ bits)$
dato 6U 1+S(numero*/&)I'
;ambi>n se admiten los operadores AF6 (resto de la di#isin) 8E2I8EH (desplazar a la izquierdaIderecha cierto
n0mero de bits)! Fb#iamente, el ensamblador no codi3ica las instrucciones de desplazamiento (al aplicarse sobre datos
constantes el resultado se calcula en tiempo de ensambla7e)$
dato 6U (1+ 8EH +) * &
&!+!%! - F9EH,6FHE8 2JB:"F8!
9ueden ser el ,D6, FH, MFH DF;! Healizan las operaciones lgicas en las e)presiones! E7!$
AFL 52,(+&& ,D6 1+.) MFH 1+. ; 52 ( 0
&!+!4! - F9EH,6FHE8 HE2,":FD,2E8!
6e#uel#en condiciones de cierto (01111h 011h) o 3also (0) e#aluando una e)presin! 9ueden ser$ ET (igual), DE (no
igual), 2; (menor que), B; (maor que), 2E (menor o igual que), BE (maor o igual que)! E7emplo$
dato ETC 100 ; <dato= #ale 100
AFL ,2,dato BE 10 ; ,2 ( 011h (cierto)
AFL ,E,dato ET 99 ; ,E ( 0 (3also)
&!+!&! - F9EH,6FHE8 6E HE;FHDF 6E L,2FHE8!
S Fperador 8EB$ de#uel#e el #alor del segmento de la #ariable o etiqueta, slo se puede emplear en programas de tipo
EME$
AFL ,M,8EB tablaZdatos
S Fperador F118E;$ de#uel#e el desplazamiento de la #ariable o etiqueta en su segmento$
AFL ,M,F118E; #ariable
8i se desea obtener el o33set de una #ariable respecto al grupo (directi#a BHFC9) de segmentos en que est- de3inida
no respecto al segmento concreto en que est- de3inida$
AFL ,M,F118E; nombreZgrupo$#ariable

tambi>n es #-lido$
AFL ,M,F118E; 68$#ariable
S Fperador !;?9E$ de#uel#e el modo de la e)presin indicada en un bte! El bit 0 indica modo <relati#o al cdigo= el 1
modo <relati#o a datos=, si ambos bits est-n inacti#os signi3ica modo absoluto! El bit & indica si la e)presin es local (0 si
est- de3inida e)ternamente o inde3inida); el bit ' indica si la e)presin contiene una re3erencia e)terna! El ;,8A utiliza
tambi>n el bit % para indicar algo que desconozco! Este operador es 0til sobre todo en las macros para determinar el tipo de
los par-metros$
in3o !;?9E #ariable
S Fperador ;?9E$ de#uel#e el tamaGo (btes) de la #ariable indicada! Do #-lido en #ariables 6C9$
Pilos 6U '/
AFL ,M,;?9E Pilos ; ,M ( +
;rat-ndose de etiquetas -en lugar de #ariables- indica si es le7ana o 1,H (0111Eh) o cercana o DE,H (01111h)!
S Fperadores 8:RE 2EDB;E$ de#uel#en el tamaGo (en btes) o el nb de elementos, respecti#amente, de la #ariable
indicada (de3inida obligatoriamente con 6C9)$
matriz 6U 100 6C9 (1+%4&)
AFL ,M,8:RE matriz ; ,M ( +00
AFL 5M,2EDB;E matriz ; 5M ( 100
S Fperadores A,8@ U:6;E$ in3orman de los campos de un registro de bits (#>ase HE"FH6)!
&!+!/! - F9EH,6FHE8 6E ,;H:5C;F8!
S Fperador 9;H$ rede3ine el atributo de tipo (5?;E, UFH6, 6UFH6, TUFH6, ;5?;E) o el
de distancia (DE,H o 1,H) de un operando de memoria! 9or e7emplo, si se tiene una tabla de3inida de la siguiente manera$
tabla 6U 10 6C9 (0) ; 10 palabras a 0
9ara colocar en ,2 el primer bte de la misma, la instruccin AFL ,2,tabla es incorrecta, a que tabla (una cadena
10 pala<8a+) no cabe en el registro ,2! 2o que desea el programador debe indic-rselo en este caso e)plcitamente al
ensamblador de la siguiente manera$
AFL ,2,5?;E 9;H tabla
;raba7ando con #arios segmentos, 9;H puede rede3inir una etiqueta DE,H de uno de ellos para con#ertirla en 1,H
desde el otro, con ob7eto de poder llamarla!
S Fperadores "8$, 68$, E8$ 88$ el ensamblador genera un pre3i7o de un bte que indica al microprocesador el segmento
que debe emplear para acceder a los datos en memoria! 9or de3ecto, se supone 68 para los registros 5M, 6: o 8: (o sin
registros de base o ndice) 88 para 89 59! 8i al acceder a un dato >ste no se encuentra en el segmento por de3ecto, el
ensamblador aGadir- el bte adicional de manera autom-tica! 8in embargo, el programador puede 3orzar tambi>n esta
circunstancia$
AFL ,2,E8$#ariable
En el e7emplo, variable se supone ubicada en el segmento e)tra! "uando se re3erencia una direccin 3i7a ha que
indicar el segmento, a que el ensamblador no conoce en qu> segmento est- la #ariable, es uno de los pocos casos en que
debe indicarse! 9or e7emplo, la siguiente lnea dar- un error al ensamblar$
AFL ,2,W0X
9ara solucionarlo ha que indicar en qu> segmento est- el dato (incluso aunque >ste sea 68)$
AFL ,2,68$W0X
En este 0ltimo e7emplo el ensamblador no generar- el bte adicional a que las instrucciones AFL operan por de3ecto
sobre 68 (como casi todas), pero ha sido necesario indicar 68 para que el ensamblador nos entienda! 8in embargo, en el
siguiente e7emplo no es necesario, a que midato est- declarado en el segmento de datos el ensamblador lo sabe$
AFL ,2,midato
9or lo general no es mu 3recuente la necesidad de indicar e)plcitamente el segmento$ al acceder a una #ariable el
ensamblador mira en qu> segmento est- declarada (#>ase la directi#a 8EBAED;) seg0n como est>n asignados los
,88CAE, pondr- o no el pre3i7o adecuado seg0n sea con#eniente! Es responsabilidad e)clusi#a del programador inicializar
los registros de segmento al principio de los procedimientos para que el ,88CAE no se quede en tinta mo7ada!!! s se
emplean con bastante 3recuencia, sin embargo, los pre3i7os "8 en las rutinas que gestionan interrupciones (a que "8 es el
0nico registro de segmento que apunta en principio a las mismas, hasta que se cargue 68 u otro)!
S Fperador 8EFH;$ indica que la etiqueta re3erenciada, de tipo DE,H, puede alcanzarse con un salto corto (-1+. a *1+'
posiciones) desde la actual situacin del contador de programa! El ensamblador ;,8A, si se solicitan dos pasadas, coloca
autom-ticamente instrucciones 8EFH; all donde es posible, para economizar memoria (el A,8A no)!
S Fperador YdY$ indica la posicin del contador de posiciones (<2ocation "ounter=) utilizado por el ensamblador dentro del
segmento para lle#ar la cuenta de por dnde se llea ensamblando! Au 0til$
3rase 65 Vsimp-ticoV
longitud ETC d-F118E; 3rase
En el e7emplo, longitud tomar- el #alor 9!
S Fperadores E:BE 2FU$ de#uel#en la parte alta o ba7a, respecti#amente (. bits) de la e)presin$
dato ETC 10+&
AFL ,2,2FU dato ; ,2 ( 1
AFL ,E,E:BE dato ; ,E ( 4
&.". - $RINCI$ALES DIRECTI5AS.
2a sinta)is de una sentencia directi#a es mu similar a la de una sentencia de instruccin$
WnombreX nombreZdirecti#a WoperandosX WcomentarioX
8lo es obligatorio el campo <nombreZdirecti#a=; los campos han de estar separados por al menos un espacio en blanco!
2a sinta)is de <nombre= es an-loga a la de la <etiqueta= de las lneas de instrucciones, aunque nunca se pone el su3i7o <$=!
El campo de comentario cumple tambi>n las mismas normas! , continuacin se e)plican las directi#as empleadas en los
programas e7emplo de este libro alguna m-s, aunque 3alta alguna que otra las e)plicadas no lo est-n en todos los casos
con pro3undidad!
&!%!1! - 6:HE";:L,8 6E 6E1:D:":JD 6E 6,;F8!
S 65 (de3inir bte), 6U (de3inir palabra), 66 (de3inir doble palabra), 6T (de3inir cu-druple palabra), 6; (de3inir 10 btes)$
sir#en para declarar las #ariables, asign-ndolas un #alor inicial$
anno 6U 1991
mes 65 1+
numerazo 66 1+%4&/'.h
te)to 65 VEolaV,1%,10
8e pueden de3inir n0meros reales de simple precisin (4 btes) con 66, de doble precisin (. btes) con 6T <reales
temporales= (10 btes) con 6;; todos ellos con el 3ormato empleado por el coprocesador! 9ara que el ensamblador
interprete el n0mero como real ha de lle#ar el punto decimal$
temperatura 66 +9!'+
espanoles91 6T %.!9E/
"on el operando 6C9 pueden de3inirse estructuras repetiti#as! 9or e7emplo, para asignar 100 btes a cero +&
palabras de contenido inde3inido (no importa lo que el ensamblador asigne)$
ceros 65 100 6C9 (0)
basura 6U +& 6C9 (])
8e admiten tambi>n los anidamientos! El siguiente e7emplo crea una tabla de btes donde se repite &0 #eces la
secuencia 1,+,%,','$
tabla 65 &0 6C9 (1, +, %, + 6C9 ('))
&!%!+! - 6:HE";:L,8 6E 6E1:D:":JD 6E 8QA5F2F8!
S ETC (ETCi#alence)$ ,signa el #alor de una e)presin a un nombre simblico 3i7o$
olimpiadas ETC 199+
6onde olimpiadas a no podr- cambiar de #alor en todo el programa! 8e trata de un operador mu 3le)ible! Es #-lido
hacer$
edad ETC W5M*6:*.X
AFL ,M,edad
S ( (signo Y(Y)$ asigna el #alor de la e)presin a un nombre simblico #ariable$ ,n-logo al anterior pero con posibilidad de
cambiar en el 3uturo! Au usada en macros (sobre todo con HE9;)!
num ( 19
num ( pepe * 1
dato ( W5M*%X
dato ( E8$W59*1X
&!%!%! - 6:HE";:L,8 6E "FD;HF2 6E2 ED8,A52,6FH!
S FHB (FHiBin)$ pone el contador de posiciones del ensamblador, que indica el o33set donde se deposita la instruccin o
dato, donde se indique! En los programas "FA (que se cargan en memoria con un F118E; 100h) es necesario colocar al
principio un FHB 100h, un FHB 0 en los controladores de dispositi#o (aunque si se omite se asume de hecho un FHB 0)!
S ED6 We)presinX$ indica el 3inal del 3ichero 3uente! 8i se inclue, expresi!n indica el punto donde arranca el programa!
9uede omitirse en los programas EME si >stos constan de un slo mdulo! En los "FA es preciso indicarla , adem-s, la
e)presin -realmente una etiqueta- debe estar inmediatamente despu>s del FHB 100h!
S !+./, !%./ ? !.0.' obligan al ensamblador a reconocer instrucciones espec3icas del +./, el %./ del .0.'! ;ambi>n
debe ponerse el <!= inicial! "on !.0./ se 3uerza a que de nue#o slo se reconozcan instrucciones del .0./ (modo por
de3ecto)! 2a directi#a !%./ puede ser colocada dentro de un segmento (entre las directi#as 8EBAED;IED68) con el
ensamblador ;,8A, lo que permite emplear instrucciones de %./ con segmentos de 1/ bits; alternati#amente se puede
ubicar 3uera de los segmentos (obligatorio en A,8A) de3inir >stos e)plcitamente como de 1/ bits con C8E1/!
S ELED$ 3uerza el contador de posiciones a una posicin par, intercalando un bte con la instruccin DF9 si es preciso!
En buses de 1/ m-s bits (.0./ superiores, no en .0..) es dos #eces m-s r-pido el acceso a palabras en posicin par$
ELED
datoZrapido 6U 0
S !H,6:M n$ cambia la base de numeracin por de3ecto! 5astante desaconse7able dada la notacin elegida para indicar
las bases por parte de :5AIAicroso3t (si se cambia la base por de3ecto a 1/, Nlos n0meros no pueden acabar en YdY a que se
con3undiran con el su3i7o de decimalO$ lo ideal sera emplear un pre3i7o no un su3i7o, que a menudo obliga adem-s a iniciar
los n0meros por 0 para distinguirlos de las etiquetas)!
&!%!4! - 6:HE";:L,8 6E 6E1:D:":JD 6E 8EBAED;F8 ? 9HF"E6:A:ED;F8!
S 8EBAED;-ED68$ 8EBAED; indica el comienzo de un segmento (cdigo, datos, pila, etc!) ED68 su 3inal! El
programa m-s simple, de tipo "FA, necesita la declaracin de un segmento (com0n para datos, cdigo pila)! [unto a
8EBAED; puede aparecer, opcionalmente, el tipo de alineamiento, lacombinaci!n, el uso la clase$
nombre 8EBAED; WalineamientoX WcombinacinX WusoX WYclaseYX
! ! ! !
nombre ED68
8e pueden de3inir unos segmentos dentro de otros (el ensamblador los ubicar- unos tras otros)! El alineamiento
puede ser 5?;E (ninguno), UFH6 (el segmento comienza en posicin par), 6UFH6 (comienza en posicin m0ltiplo de 4),
9,H, (comienza en una direccin m0ltiplo de 1/, opcin por de3ecto) 9,BE (comienza en direccin m0ltiplo de +&/)! 2a
combinacin puede ser$
- (Do indicada)$ los segmentos se colocan unos tras otros 3sicamente, pero son lgicamente independientes$ cada
uno tiene su propia base sus propios o33sets relati#os!
- $UBLIC$ usado especialmente cuando se traba7a con segmentos de3inidos en #arios 3icheros que se ensamblan
por separado o se compilan con otros lengua7es, por ello debe declararse un nombre entre comillas simples -YclaseY- para
audar al linPador! ;odos los segmentos 9C52:" de igual nombre clase tienen una base com0n son colocados
adacentemente unos tras otros, siendo el o33set relati#o al primer segmento cargado!
- COMMON$ similar, aunque ahora los segmentos de igual nombre clase se solapan! 9or ello, las #ariables
declaradas han de serlo en el mismo orden tamaGo!
- AT$ asocia un segmento a una posicin de memoria 3i7a, no para ensamblar sino para declarar #ariables
(inicializadas siempre con Y]Y) de cara a acceder con comodidad a zonas de HFA, #ectores de interrupcin, etc! E7emplo$
#arsZbios 8EBAED; ,; 40h
pZserie0 6U ]
#arsZbios ED68
6e esta manera, la direccin del primer puerto serie puede obtenerse de esta manera (por e7emplo)$
AFL ,M,#ariablesZbios ; segmento
AFL E8,,M ; inicializar E8
AFL ,M,E8$pZserie0
- STACK$ segmento de pila, debe e)istir uno en los programas de tipo EME; adem-s el 2inPador de 5orland (;2:D@
4!0) e)ige obligatoriamente que la clase de >ste sea tambi>n Y8;,"@Y, con el 2:D@ de Aicroso3t no siempre es necesario
indicar la clase del segmento de pila! 8imilar, por lo dem-s, a 9C52:"!
- MEMORY$ segmento que el linPador ubicar- al 3inal de todos los dem-s, lo que permitira saber dnde acaba el
programa! 8i se de3inen #arios segmentos de este tipo el ensamblador acepta el primero trata a los dem-s como
"FAAFD! ;>ngase en cuenta que el linPador no soporta esta caracterstica, por lo que emplear AEAFH? es equi#alente a
todos los e3ectos a utilizar "FAAFD! Fl#date de AEAFH?!
El uso indica si el segmento es de 1/ bits o de %+; al emplear la directi#a !%./ se asumen por de3ecto segmentos de
%+ bits por lo que es necesario declarar C8E1/ para conseguir que los segmentos sean interpretados como de 1/ bits por el
linPador, lo que permite emplear algunas instrucciones del %./ en el modo real del microprocesador ba7o el sistema
operati#o 6F8!
9or 0ltimo, YclaseY es un nombre opcional que emplear- el linPador para encadenar los mdulos, siendo con#eniente
nombrar la clase del segmento de pila con Y8;,"@Y!
S ,88CAE (8uponer)$ :ndica al ensamblador el registro de segmento que se #a a utilizar para direccionar cada segmento
dentro del mdulo! Esta instruccin #a normalmente inmediatamente despu>s del 8EBAED;! El programa m-s sencillo
necesita que se <suponga= "8 como mnimo para el segmento de cdigo, de lo contrario el ensamblador empezar- a
protestar un montn al no saber que registro de segmento asociar al cdigo generado! ;ambi>n con#iene hacer un
assume del registro de segmento 68 hacia el segmento de datos, incluso en el caso de que >ste sea el mismo que el de
cdigo$ si no, el ensamblador colocar- un bte de pre3i7o adicional en todos los accesos a memoria para 3orzar que >stos
sean sobre "8! 8e puede indicar ,88CAE DF;E:DB para cancelar un ,88CAE anterior! ;ambi>n se puede indicar el
nombre de un grupo o emplear <8EB #ariable= o <8EB etiqueta= en #ez de nombreZsegmento$
,88CAE regZsegmento$nombreZsegmentoW,!!!X
S 9HF"-ED69 permite dar nombre a una subrutina, marcando con claridad su inicio su 3in!
,unque es redundante, es mu recomendable para estructurar los programas!
cls 9HF"
!!!
cls ED69
El atributo 1,H que aparece en ocasiones 7unto a 9HF" indica que es un procedimiento le7ano las instrucciones
HE; en su interior se ensamblan como HE;1 (los ",22 hacia >l ser-n, adem-s, de %+ bits)! Fbser#ar que la etiqueta nunca
termina con dos puntos!
&!%!&! - 6:HE";:L,8 6E HE1EHED":,8 EM;EHD,8!
S 9C52:"$ permite hacer #isibles al e)terior (otros 3icheros ob7eto resultantes de otros listados en ensamblador u otro
lengua7e) los smbolos -#ariables procedimientos- indicados! Decesario para programacin modular e inter3aces con
lengua7es de alto ni#el! 9or e7emplo$
9C52:" proc1, #arZ)
proc1 9HF" 1,H
!!!
proc1 ED69
#arZ) 6U 0
6eclara la #ariable #arZ) el procedimiento proc1 como accesibles desde el e)terior por medio de la directi#a EM;HD!
S EM;HD$ 9ermite acceder a smbolos de3inidos en otro 3ichero ob7eto (resultante de otro ensambla7e o de una
compilacin de un lengua7e de alto ni#el); es necesario tambi>n indicar el tipo del dato o procedimiento (5?;E, UFH6 o
6UFH6; DE,H o 1,H; se emplea adem-s ,58 para las constantes num>ricas)$
EM;HD proc1$1,H, #arZ)$UFH6
En el e7emplo se accede a los smbolos e)ternos proc1 #arZ) (#er e7emplos de 9C52:") a continuacin sera
posible hacer un ",22 proc1 o un AFL "M,#arZ)! 8i la directi#a EM;HD se coloca dentro de un segmento, se supone el
smbolo dentro del mismo! 8i el smbolo est- en otro segmento, debe colocarse EM;HD 3uera de todos los segmentos
indicando e)plcitamente el pre3i7o del registro de segmento (o bien hacer el ,88CAE apropiado) al re3erenciarlo!
E#identemente, al 3inal, al linPar habr- que enlazar este mdulo con el que de3ine los elementos e)ternos!
S :D"2C6E nombreZ3ichero$ ,Gade al 3ichero 3uente en proceso de ensambla7e el 3ichero indicado, en el punto en que
aparece el :D"2C6E! Es e)actamente lo mismo que mezclar ambos 3icheros con un editor de te)to! ,horra traba7o en
3ragmentos de cdigo que se repiten en #arios programas (como quiz- una librera de macros)! Do se recomiendan
:D"2C6EYs anidados!
&!%!/! - 6:HE";:L,8 6E 6E1:D:":JD 6E 52FTCE8!
S D,AE nombreZmoduloZob7eto$ indica el nombre del mdulo ob7eto! 8i no se inclue D,AE, se tomar- de la directi#a
;:;2E o, en su de3ecto, del nombre del propio 3ichero 3uente!
S BHFC9 segmento1, segmento+,!!! permite agrupar dos o m-s segmentos lgicos en uno slo de no m-s de /4 @b
totales (o7o$ el ensamblador no comprueba este e)tremo, aunque s el enlazador)! E7emplo$
superseg BHFC9 datos, codigo, pila
codigo 8EBAED;
!!!
codigo ED68
datos 8EBAED;
dato 6U 1+%4
datos ED68
pila 8EBAED; 8;,"@ Y8;,"@Y
65 1+. 6C9 (])
pila ED68
"uando se accede a un dato de3inido en alg0n segmento de un grupo se emplea el operador F118E; es preciso
indicar el nombre del grupo como pre3i7o, de lo contrario el ensamblador no generar- el desplazamiento correcto Nni emitir-
erroresO$
AFL ,M,dato ; NincorrectoO
AFL ,M,supersegmento$dato ; correcto
2a #enta7a de agrupar segmentos es poder crear programas "FA 8?8 que contengan #arios segmentos! En todo
caso, t>ngase en cuenta a0n en ese caso que no pueden emplearse todas las caractersticas de la programacin con
segmentos (por e7emplo, no se puede utilizar la directi#a 8EB ni debe e)istir segmento de pila)!
S 2,5E2$ 9ermite re3erenciar un smbolo con otro nombre, siendo 3actible rede3inir el tipo! 2a sinta)is es$ nombre 2,5E2
tipo (tipo ( 5?;E, UFH6, 6UFH6, DE,H o 1,H)! E7emplo$
palabra 2,5E2 UFH6
bteZba7o 65 0
bteZalto 65 0
En el e7emplo, con AFL ,M,palabra se acceder- a ambos btes a la #ez (el empleo de AFL ,M,bteZba7o dara error$
no se puede cargar un slo bte en un registro de 1/ bits el ensamblador no supone que realmente pretendamos tomar
dos btes consecuti#os de la memoria)!
S 8;HC" - ED68$ permite de3inir registros al estilo de los lengua7es de alto ni#el, para acceder de una manera m-s
elegante a los campos de una in3ormacin con cierta estructura! Estos campos pueden componerse de cualquiera de los
tipos de datos simples (65, 6U, 66, 6T, 6;) pueden ser modi3icables o no en 3uncin de si son simples o m0ltiples,
respecti#amente$
alumno 8;HC"
mote 65 Y01+%4&/'.9Y ; modi3icable
edadaltura 65 +0,1'& ; no modi3icable
peso 65 0 ; modi3icable
otros 65 10 6C9(0) ; no modi3icable
tele3ono 66 ] ; modi3icable
alumno ED68
2a anterior de3inicin de estructura no lle#a implcita la reser#a de memoria necesaria, la cual ha de hacerse
e)presamente utilizando los -ngulos Y\Y Y`Y$
3elipe alumno \YBordin3lasY,,101,,+&1+44`
En el e7emplo se de3inen los campos modi3icables (los 0nicos de3inibles) de7ando sin de3inir (comas consecuti#as) los
no modi3icables, cre-ndose la estructura Y3elipeY que ocupa +' btes! 2as cadenas de caracteres son rellenadas con espacios
en blanco al 3inal si no alcanzan el tamaGo m-)imo de la declaracin! El ;,8A es m-s 3le)ible permite de3inir tambi>n el
primer elemento de los campos m0ltiples sin dar error! ;ras crear la estructura, es posible acceder a sus elementos
utilizando un (!) para separar el nombre del campo$
AFL ,M,F118E; 3elipe!tele3ono
2E, 5M,3elipe
AFL "2,W5MX!peso ; equi#ale a W5M*1+X
S HE"FH6$ similar a 8;HC" pero operando con campos de bits! 9ermite de3inir una estructura determinada de bte o
palabra para operar con comodidad! 8inta)is$
nombre HE"FH6 nombreZdeZcampo$tamaGoW(#alorX,!!!
6onde nombre permitir- re3erenciar la estructura en el 3uturo, nombre2de2campo identi3ica los distintos campos, a los
que se asigna un tamaGo (en bits) opcionalmente un #alor por de3ecto!
registro HE"FH6 a$+(%, b$4(&, c$1
2a estructura reistro totaliza ' bits, por lo que ocupa un bte! Est- di#idida en tres campos que ocupan los '
bits ()o+ signi3icati#os del bte$ el campo , ocupa los bits / &, el 5 los bits del bte$ el campo , ocupa los bi1 al 4 el "
el bit 0$
/ &
4 % +
1
0
1 1
0 1 0
1
]
2a reser#a de memoria se realiza, por e7emplo, de la siguiente manera$
reg1 registro \+,,1`
Tuedando re5 con el #alor binario 1001011 (el campo 5 permanece inalterado el , " toman los #alores
indicados)! E7emplos de operaciones soportadas$
AFL ,2, , ; ,2 ( & (desplazamiento del bit
; menos signi3icati#o de ,)
AFL ,2, A,8@ , ; ,2 ( 01100000b (m-scara de ,)
AFL ,2, U:6;E , ; ,2 ( + (anchura de ,)
&!%!'! - 6:HE";:L,8 "FD6:":FD,2E8!
8e emplean para que el ensamblador e#al0e unas condiciones , seg0n ellas, ensamble o no ciertas zonas de cdigo!
Es 3recuente, por e7emplo, de cara a generar cdigo para #arios ordenadores$ pueden e)istir ciertos smbolos de3inidos que
indiquen en un momento dado si ha que ensamblar ciertas zonas del listado o no de manera condicional, seg0n la m-quina!
En los 3ragmentos en ensamblador del cdigo que generan los compiladores tambi>n aparecen con 3recuencia (para actuar
de manera di3erente, por e7emplo, seg0n el modelo de memoria)! Es interesante tambi>n la posibilidad de de3inir un smbolo
que indique que el programa est- en 3ase de pruebas ensamblar cdigo adicional en ese caso con ob7eto de depurarlo!
8inta)is$
:1))) WsmboloIe)p!Iarg!X ; ))) es la condicin
!!!
E28E ; el E28E es opcional
!!!
ED6:1
:1 e)presion (e)presin distinta de cero)
:1E e)presin (e)presin igual a cero)
:11 (pasada 1 del ensamblador)
:1+ (pasada + del ensamblador)
:16E1 smbolo (smbolo de3inido o declarado como e)terno)
:1D6E1 smbolo (smbolo ni de3inido ni declarado como e)terno)
:15 \argumento` (argumento en blanco en macros -incluir Y\Y Y`Y-)
:1D5 \argumento` (lo contrario, tambi>n es obligado poner Y\Y Y`Y)
:1:6D \arg1`, \arg+` (arg1 id>ntico a arg+, requiere Y\Y Y`Y)
:16:1 \arg1`, \arg+` (arg1 distinto de arg+, requiere Y\Y Y`Y)
&!%!.! - 6:HE";:L,8 6E 2:8;,6F!
S 9,BE numZlineas, numZcolumnas$ 1ormatea el listado de salida; por de3ecto son // lneas por p-gina (modi3icable
entre 10 +&&) .0 columnas (seleccionable de /0 a 1%+)! 9,BE salta de p-gina e incrementa su n0mero! <9,BE *=
indica captulo nue#o ( se incrementa el n0mero)!
S ;:;2E ttulo$ indica el ttulo que aparece en la 1g lnea de cada p-gina (m-)imo /0 caracteres)!
S 8C5;;2 subttulo$ Qdem con el subttulo (m-)! /0 caracteres)!
S !2,22$ 2istar las macros sus e)pansiones!
S !8,22$ Do listar las macros ni sus e)pansiones!
S !M,22$ 2istar slo las macros que generan cdigo ob7eto!
S !M"HE1$ 8uprimir listado de re3erencias cruzadas (listado al3ab>tico de smbolos 7unto al nb de lnea en que son
de3inidos re3erenciados, de cara a 3acilitar la depuracin)!
S !"HE1$ Hestaurar listado de re3erencias cruzadas!
S !M2:8;$ 8uprimir el listado ensamblador desde ese punto!
S !2:8;$ Hestaurar de nue#o la salida de listado ensamblador!
S "FAAED; delimitador comentario delimitador$ 6e3ine un comentario que puede incluso ocupar #arias lneas, el
delimitador (primer car-cter no blanco ni tabulador que sigue al "FAAED;) indica el inicio e indicar- m-s tarde el 3inal del
comentario! NDo ol#idar cerrar el comentarioO!
S hFC; mensa7e$ escribe en la consola el mensa7e indicado durante la 3ase de ensambla7e al llegar a ese punto del
listado, e)cepto cuando el listado es por pantalla no en 3ichero!
S !21"FD6$ 2istar los bloques de cdigo asociados a una condicin 3alsa (:1)!
S !81"FD6$ suprimir dicho listado!
S !;1"FD6$ :n#ertir el modo #igente de listado de los bloques asociados a una condicin 3alsa!
&.#. - MACROS.
"uando un con7unto de instrucciones en ensamblador aparecen 3recuentemente repetidas a lo largo de un listado, es
con#eniente agruparlas ba7o un nombre simblico que las sustituir- en aquellos puntos donde aparezcan! Esta es la misin
de las macros; por el hecho de soportarlas el ensamblador ele#a su categora a la de macroensamblador, al ser las macros
una herramienta mu cotizada por los programadores!
Do con#iene con3undir las macros con subrutinas$ es estas 0ltimas, el con7unto de instrucciones aparece una sola #ez en
todo el programa luego se in#oca con ",22! 8in embargo, cada #ez que se re3erencia a una macro, el cdigo que >sta
representa se expande en el programa de3initi#o, duplic-ndose tantas #eces como se use la macro! 9or ello, aquellas tareas
que puedan ser realizadas con subrutinas siempre ser- m-s con#eniente realizarlas con las mismas, con ob7eto de
economizar memoria! Es cierto que las macros son algo m-s r-pidas que las subrutinas (se ahorra un ",22 un HE;) pero
la di3erencia es tan mnima que en la pr-ctica es despreciable en el 99,99h de los casos! 9or ello, es absurdo e irracional
realizar ciertas tareas con macros que pueden ser desarrolladas mucho m-s e3icientemente con subrutinas$ es una pena que
en muchos manuales de ensamblador a0n se hable de macros para realizar operaciones sobre cadenas de caracteres, que
generaran programas gigantescos con menos de un 1h de #elocidad adicional!
&!4!1! - 6E1:D:":JD ? 5FHH,6F 6E 2,8 A,"HF8!
2a macro se de3ine por medio de la directi#a A,"HF! Es necesario de3inir la macro antes de utilizarla! Cna macro puede
llamar a otra! "on 3recuencia, las macros se colocan 7untas en un 3ichero independiente luego se mezclan en el programa
principal con la directi#a :D"2C6E$
:11
:D"2C6E 3ichero!e)t
ED6:1
2a sentencia :11 asegura que el ensamblador lea el 3ichero 3uente de las macros slo en la primera pasada, para acelerar
el ensambla7e e#itar que aparezcan en el listado (generado en la segunda 3ase)! "on#iene hacer hincapi> en que la
de3inicin de la macro no consume memoria, por lo que en la pr-ctica es indi3erente declarar cientos que ninguna macro$
nombreZsimblico A,"HF Wpar-metrosX
!!!
!!! ; instrucciones de la macro
ED6A
El nombre simblico es el que permitir- en adelante hacer re3erencia a la macro, se construe casi con las mismas
reglas que los nombres de las #ariables dem-s smbolos! 2a macro puede contener par-metros de manera opcional! ,
continuacin #ienen las instrucciones que engloba , 3inalmente, la directi#a ED6A seGala el 3inal de la macro! Do se debe
repetir el nombre simblico 7unto a la directi#a ED6A, ello pro#ocara un error un tanto curioso e)traGo por parte del
ensamblador (algo as como <1in del 3ichero 3uente inesperado, 3alta directi#a ED6=), al menos con A,8A &!0 ;,8A +!0!
En realidad, a di3erencia de lo que sucede con los dem-s smbolos, el nombre de una macro puede coincidir con el de
una instruccin m-quina o una directi#a del ensamblador$ a partir de ese momento, la instruccin o
directi#a machacada pierde su signi3icado original! El ensamblador dar- adem-s un a#iso de ad#ertencia si se emplea una
instruccin o directi#a como nombre de macro, aunque tolerar- la operacin! Dormalmente se las asignar- nombres
normales, como a las #ariables! 8in embargo, si alguna #ez se rede3iniera una instruccin m-quina o directi#a, para restaurar
el signi3icado original del smbolo, la macro puede ser borrada -o simplemente porque a no #a a ser usada a partir de cierto
punto del listado, as a no consumir- espacio en las tablas de macros que mantiene en memoria el ensamblador al
ensamblar-! Do es necesario borrar las macros antes de rede3inirlas! 9ara borrarlas, la sinta)is es la siguiente$
9CHBE nombreZsimblicoW,nombreZsimblico,!!!X
&!4!+! - E[EA92F 6E CD, A,"HF 8ED":22,!
6esde el +./ e)iste una instruccin mu cmoda que introduce en la pila . registros, otra que los saca (9C8E,
9F9,)! Tuien est> acostumbrado a emplearlas, puede crear unas macros que simulen estas instrucciones en los .0./$
8C9EH9C8E A,"HF
9C8E ,M
9C8E "M
9C8E 6M
9C8E 5M
9C8E 89
9C8E 59
9C8E 8:
9C8E 6:
ED6A
2a creacin de 8C9EH9F9 es an-loga, sacando los registros en orden in#erso! El orden elegido no es por capricho se
corresponde con el de la instruccin 9C8E, original, para compatibilizar! , partir de la de3inicin de esta macro, tenemos a
nuestra disposicin una nueva instrucci!n m#quina (8C9EH9C8E) que puede ser usada con libertad dentro de los
programas!

&!4!%! - 9,HiAE;HF8 1FHA,2E8 ? 9,HiAE;HF8 ,";C,2E8!
9ara quien no haa tenido relacin pre#ia con alg0n lengua7e estructurado de alto ni#el, har> un bre#e comentario acerca
de lo que son los par-metros 3ormales actuales en una macro, similar aqu a los procedimientos de los lengua7es de alto
ni#el!
"uando se llama a una macro se le pueden pasar opcionalmente un cierto n0mero de par-metros de cierto tipo! Estos
par-metros se denominan par#metros actuales! En la de3inicin de la macro, dichos par-metros aparecen asociados a
ciertos nombres arbitrarios, cua 0nica misin es permitir distinguir unos par-metros de otros e indicar en qu> orden son
entregados$ son los par#metros "ormales! "uando el ensamblador e)panda la macro al ensamblar, los par-metros 3ormales
ser-n sustituidos por sus correspondientes par-metros actuales! "onsiderar el siguiente e7emplo$
8CA,H A,"HF a,b,total
9C8E ,M
AFL ,M,a
,66 ,M,b
AFL total,,M
9F9 ,M
ED6A
!!!!
8CA,H positi#os, negati#os, total
En el e7emplo, <a=, <b= <total= son los par-metros 3ormales <positi#os=, <negati#os= <total= son los par-metros
actuales! ;anto <a= como <b= pueden ser #ariables, etiquetas, etc! en otro punto del programa; sin embargo, dentro de la
macro, se comportan de manera independiente! El par-metro 3ormal <total= ha coincidido en el e7emplo por casualidad con
su correspondiente actual! El cdigo que genera el ensamblador al e)pandir la macro ser- el siguiente$
9C8E ,M
AFL ,M,positi#os
,66 ,M,negati#os
AFL total,,M
9F9 ,M
2as instrucciones 9C8E 9F9 sir#en para no alterar el #alor de ,M conseguir que la macro se comporte como
una ca6a nera; no es necesario que esto sea as pero es una buena costumbre de programacin para e#itar que los
programas hagan cosas raras! En general, las macros de este tipo no deberan alterar los registros , si los cambian, ha
que tener mu claro cu-les!
8i se indican m-s par-metros de los que una macro necesita, se ignorar-n los restantes! En cambio, si 3altan, el A,8A
asumir- que son nulos (0) dar- un mensa7e de ad#ertencia, el ;,8A es algo m-s rgido podra dar un error! En general,
se trata de situaciones atpicas que deben ser e#itadas!
;ambi>n puede darse el caso de que no sea posible e)pandir la macro! En el e7emplo, no hubiera sido posible e7ecutar
8CA,H ,M,5M,62 porque 62 es de . bits la instruccin AFL 62,,M sera ilegal!
&!4!4! - E;:TCE;,8 6ED;HF 6E A,"HF8! L,H:,52E8 2F",2E8!
8on necesarias normalmente para los saltos condicionales que contengan las macros m-s comple7as! 8i se pone una
etiqueta a donde saltar, la macro slo podra ser empleada una #ez en todo el programa para e#itar que dicha etiqueta
aparezca duplicada! 2a solucin est- en emplear la directi#a 2F",2 que ha de ir colocada 7usto despu>s de la directi#a
A,"HF$
A:D:AF A,"HF dato1, dato+, resultado
2F",2 aZesta
AFL ,M,dato1
"A9 ,M,dato+ ; ces dato1 el menor]
[5 aZesta ; s
AFL ,M,dato+ ; no, es dato+
aZesta$ AFL resultado,,M
ED6A
En el e7emplo, al in#ocar la macro dos #eces el ensamblador no generar- la etiqueta <aZesta= sino las etiquetas ]]
0000, ]]0001, !!! as sucesi#amente! 2a directi#a 2F",2 no slo es 0til para los saltos condicionales en las macros,
tambi>n permite declarar #ariables internas a los mismos! 8e puede indicar un n0mero casi inde3inido de etiquetas con la
directi#a 2F",2, separ-ndolas por comas!
&!4!&! - F9EH,6FHE8 6E A,"HF8!
S Fperador ;;
:ndica que lo que #iene a continuacin es un comentario que no debe aparecer al e)pansionar la macro! "uando al
ensamblar se genera un listado del programa, las macros suelen aparecer e)pandidas en los puntos en que se in#ocan; sin
embargo slo aparecer-n los comentarios normales que comiencen por (;)! 2os comentarios relacionados con el
3uncionamiento interno de la macro deberan ir con (;;), los relati#os al uso sinta)is de la misma con (;)! Esto es adem-s
con#eniente porque durante el ensambla7e son mantenidos en memoria los comentarios de macros (no los del resto del
programa) que comienzan por (;), no con#iene desperdiciar memoria!!!
S Fperador j
Ctilizado para concatenar te)to o smbolos! Es necesario para lograr que el ensamblador sustitua un par-metro
dentro de una cadena de caracteres o como parte de un smbolo$
8,2C6F A,"HF c
AFL ,2,VjcV
etiquetajc$ ",22 imprimir
ED6A
,l e7ecutar 8,2C6F , se producir- la siguiente e)pansin$
AFL ,2,V,V
etiqueta,$ ",22 imprimir
8i no se hubiera colocado el j se hubiera e)pandido como AFL ,2,VcV
"uando se utilizan estructuras repetiti#as HE9;, :H9 o :H9" (que se #er-n m-s adelante) e)iste un problema
adicional al intentar crear etiquetas, a que el ensamblador se come un j al hacer la primera sustitucin, generando la
misma etiqueta a menos que se duplique el operador j$
AEAFH:, A,"HF )
:H9 i, \1, +`
)ji 65 i
ED6A
ED6A
8i se in#oca AEAFH:, E; se produce el error de Vetiqueta E;i repetidaV, que se puede sal#ar aGadiendo tantos YjY
como ni#eles de anidamiento halla en las estructuras repetiti#as empleadas, como se e7empli3ica a continuacin$
AEAFH:, A,"HF )
:H9 i, \1, +`
)jji 65 i
ED6A
ED6A
2o que con AEAFH:, E; generar- correctamente las lneas$
E;1 65 1
E;+ 65 +
S Fperador O o \`
Empleado para indicar que el car-cter que #iene a continuacin debe ser interpretado literalmente no como un
smbolo! 9or ello, O; es equi#alente a \;`!
S Fperador h
"on#ierte la e)presin que le sigue -generalmente un smbolo- a un n0mero; la e)presin debe ser una constante (no
relocalizable)! 8lo se emplea en los argumentos de macros! 6ada la macro siguiente$
98CA A,"HF mensa7e, suma
hFC; S mensa7e, suma S
ED6A
(E#identemente, el h que precede a FC; 3orma parte de la directi#a no se trata del h operador que estamos
tratando)
8upuesta la e)istencia de estos smbolos$
8:A1 ETC 1+0
8:A+ ETC &00
:n#ocando la macro con las siguientes condiciones$
98CA \ 8:A1 * 8:A+ ( `, (8:A1*8:A+)
8e produce la siguiente e)pansin$
hFC; S 8:A1 * 8:A+ ( (8:A1*8:A+) S
8in embargo, in#ocando la macro de la siguiente manera (con h)$
98CA \ 8:A1 * 8:A+ ( `, h(8:A1*8:A+)
8e produce la e)pansin deseada$
hFC; S 8:A1 * 8:A+ ( /+0 S
&!4!/! - 6:HE";:L,8 k;:2E8 9,H, A,"HF8!
Estas directi#as pueden ser empleadas tambi>n sin las macros, aumentando la comodidad de la programacin, aunque
abundan especialmente dentro de las macros!
S HE9; #eces !!! ED6A (Hepeat)
9ermite repetir cierto n0mero de #eces una secuencia de instrucciones! El bloque de instrucciones se delimita con
ED6A (no con3undirlo con el 3inal de una macro)! 9or e7emplo$
HE9; +
FC; 6M,,2
ED6A
Esta secuencia se trans3ormar-, al ensamblar, en lo siguiente$
FC; 6M,,2
FC; 6M,,2
Empleando smbolos de3inidos con (() apo-ndose adem-s en las macros se puede llegar a crear pseudo-
instrucciones mu potentes$
8C"E8:FD A,"HF n
num ( 0
HE9; n
65 num
num ( num * 1
ED6A ; 3in de HE9;
ED6A ; 3in de macro
2a sentencia 8C"E8:FD % pro#ocar- la siguiente e)pansin$
65 0
65 1
65 +
S :H9 simboloZcontrol, \arg1, arg+, !!!, argZn` !!! ED6A (:nde3inite repeat)
Es relati#amente similar a la instruccin 1FH de los lengua7es de alto ni#el! 2os -ngulos (\) (`) son obligatorios! El
smbolo de control #a tomando sucesi#amente los #alores (no necesariamente num>ricos) arg1, arg+, !!! recorre en cada
pasada todo el bloque de instrucciones hasta alcanzar el ED6A (no con3undirlo con 3in de macro) sustituendo
simboloZcontrol por esos #alores en todos los lugares en que aparece$
:H9 i, \1,+,%`
65 0, i, iSi
ED6A
,l e)pansionarse, este con7unto de instrucciones se con#ierte en lo siguiente$
65 0, 1, 1
65 0, +, 4
65 0, %, 9
Dota$ ;odo lo encerrado entre los -ngulos se considera un 0nico par-metro! Cn (;) dentro de los -ngulos no se
interpreta como el inicio de un comentario sino como un elemento m-s! 9or otra parte, al emplear macros anidadas, deben
indicarse tantos smbolos angulares Y\Y Y`Y consecuti#os como ni#eles de anidamiento e)istan!
2gicamente, dentro de una macro tambi>n resulta bastante 0til la estructura :H9$
;E;H,FC; A,"HF p1, p+, p%, p4, #alor
9C8E ,M
9C8E 6M
AFL ,2,#alor
:H9 cn, \p1, p+, p%, p4`
AFL 6M, cn
FC; 6M, ,2
ED6A ; 3in de :H9
9F9 6M
9F9 ,M
ED6A ; 3in de macro
,l e7ecutar ;E;H,FC; %1.h, 1"9h, +61h, 1,4h, 1' se obtendr-$
9C8E ,M
9C8E 6M
AFL ,2, 1'
AFL 6M, %1.h
FC; 6M, ,2
AFL 6M, 1"9h
FC; 6M, ,2
AFL 6M, +61h
FC; 6M, ,2
AFL 6M, 1,4h
FC; 6M,,2
9F9 6M
9F9 ,M
"uando se pasan listas como par-metros ha que encerrarlas entre Y\Y Y`Y al llamar, para no con3undirlas con
elementos independientes! 9or e7emplo, supuesta la macro :D"6$
:D"6 A,"HF lista, p
:H9 i, \lista`
:D" i
ED6A ; 3in de :H9
6E" p
ED6A ; 3in de macro
8e comprende la necesidad de utilizar los -ngulos$
:D"6 ,M, 5M, "M, 6M se e)pandir-$
:D" ,M
6E" 5M ; "M 6M se ignoran (4 par-metros)
:D"6 \,M, 5M, "M`, 6M se e)pandir-$
:D" ,M
:D" 5M
:D" "M
6E" 6M ; (+ par-metros)
S :H9" simboloZcontrol, \c1c+ !!! cn` !!! ED6A (:nde3inite repeat character)
Esta directi#a es similar a la anterior, con una sal#edad$ los elementos situados entre los -ngulos (\) (`) -ahora
opcionales, por cierto- son caracteres ,8":: no #an separados por comas$
:H9" i, \.1%`
65 i
ED6A
El bloque anterior generar- al e)pandirse$
65 .
65 1
65 %
E7emplo de utilizacin dentro de una macro (en combinacin con el operador j)$
:D:":,2:R, A,"HF a, b, c, d
:H9" iter, \jajbjcjd`
65 iter
ED6A ; 3in de :H9"
ED6A ; 3in de macro
,l e7ecutar :D:":,2:R, ', 1, 4, 0 se produce la siguiente e)pansin$
65 '
65 1
65 4
65 0
S EM:;A
8ir#e para abortar la e7ecucin de un bloque A,"HF, HE9;, :H9 :H9"! Dormalmente se utiliza apo-ndose en una
directi#a condicional (:1!!!E28E!!!ED6:1)! ,l salir del bloque, se pasa al ni#el inmediatamente superior (que puede ser otro
bloque de estos)! "omo e7emplo, la siguiente macro reser#a n btes de memoria a cero hasta un m-)imo de 100, colocando
un bte +&& al 3inal del bloque reser#ado$
A,22F" A,"HF n
ma)imo(100
HE9; n
:1 ma)imo ET 0 ; ca #an 100]
EM:;A ; abandonar HE9;
ED6:1
ma)imo ( ma)imo - 1
65 0 ; reser#ar bte
ED6A
65 +&& ; bte de 3in de bloque
ED6A
&!4!'! - A,"HF8 ,L,DR,6,8 "FD DCAEHF L,H:,52E 6E 9,HiAE;HF8!
"omo se #io al estudiar la directi#a :1, e)iste la posibilidad de chequear condicionalmente la presencia de un par-metro
por medio de :1D5, o su ausencia con :15! Cniendo esto a la potencia de :H9 es posible crear macros e)traordinariamente
#ers-tiles! "omo e7emplo, #alga la siguiente macro, destinada a introducir en la pila un n0mero #ariable de par-metros
(hasta 10)$ es especialmente 0til en los programas que gestionan interrupciones$
M9C8E A,"HF H1,H+,H%,H4,H&,H/,H',H.,H9,H10
:H9 reg, \H1,H+,H%,H4,H&,H/,H',H.,H9,H10`
:1D5 \reg`
9C8E reg
ED6:1
ED6A ; 3in de :H9
ED6A ; 3in de M9C8E
9or e7emplo, la instruccin$
M9C8E ,M,5M,68,E8,L,H1
8e e)pandir- en$
9C8E ,M
9C8E ,M
9C8E 68
9C8E E8
9C8E L,H1
El e7emplo anterior es ilustrati#o del mecanismo de comprobacin de presencia de par-metros! 8in embargo, este
e7emplo puede ser optimizado notablemente empleando una lista como 0nico par-metro$
M9C8E A,"HF lista
:H9 i, \lista`
9C8E i
ED6A
ED6A
M9F9 A,"HF lista
:H9 i, \lista`
9F9 i
ED6A
ED6A
2a #enta7a es el n0mero inde3inido de par-metros soportados (no slo 10)! Cn e7emplo de uso puede ser el siguiente$
M9C8E \,M, 5M, "M`
M9F9 \"M, 5M, ,M`
Tue al e)pandirse queda$
9C8E ,M
9C8E 5M
9C8E "M
9F9 "M
9F9 5M
9F9 ,M
&.&. - $RO1RAMACIN MODULAR Y $ASO DE $ARLMETROS.
,unque lo que #iene a continuacin no es indispensable para programar en ensamblador, s es con#eniente leerlo en +
% minutos para obser#ar ciertas reglas mu sencillas que audar-n a hacer programas seguros e3icientes! 8in embargo,
personalmente considero que cada uno es mu libre de hacer lo que desee; por otra parte, en muchos casos no se pueden
cumplir los principios de la proramaci!n eleante -especialmente en ensamblador- por lo que detesto aquellos
pro3esionales de la in3orm-tica que se entrometen con la manera de programar de sus colegas o alumnos, oblig-ndolos a
hacer las cosas a su gusto!
2a programacin modular consiste en di#idir los problemas m-s comple7os en mdulos separados con unas ciertas
interdependencias, lo que reduce el tiempo de programacin aumenta la 3iabilidad del cdigo! 8e pueden implementar en
ensamblador con las directi#as 9HF" ED69 que, aunque no generan cdigo son bastante 0tiles para de7ar bien claro
dnde empieza acaba un mdulo! Heglas para la buena programacin$
- 6i#idir los problemas en mdulos pequeGos relacionados slo por un con7unto de par-metros de entrada salida!
- Cna sola entrada salida en cada mdulo$ un mdulo slo debe llamar al inicio de otro (con ",22) >ste debe
retornar al 3inal con un 0nico HE;, no debiendo e)istir m-s puntos de salida no siendo recomendable alterar la direccin de
retorno!
- E)cepto en los puntos en que la #elocidad o la memoria son crticas (la e)periencia demuestra que son menos del
1h) debe codi3icarse el programa con claridad, si es preciso perdiendo e3iciencia! Ese 1h documentarlo pro3usamente como
se hara para que lo lea otra persona!
- 2os mdulos han de ser <ca7as negras= no deben modi3icar el entorno e)terior! Esto signi3ica que no deben actuar
sobre #ariables globales ni modi3icar los registros (e)cepto aquellos registros #ariables en que de#uel#en los resultados, lo
que debe documentarse claramente al principio del mdulo)! ;ampoco deben depender de e7ecuciones anteriores, sal#o
e)cepciones en que la propia claridad del programa obligue a lo contrario (por e7emplo, los generadores de n0meros
aleatorios pueden depender de la llamada anterior)!
9ara el paso de par-metros entre mdulos e)isten #arios m>todos que se e)ponen a continuacin! 2os par-metros
pueden pasarse adem-s de dos maneras$ directamente por valor, o bien indirectamente por re"erencia o direcci!n! En el
primer caso se en#a el #alor del par-metro en el segundo la direccin inicial de memoria a partir de la que est-
almacenado! El tipo de los par-metros habr- de estar debidamente documentado al principio de los mdulos!
- 9aso de par-metros en los registros$ 2os mdulos utilizan ciertos registros mu concretos para comunicarse! ;odos los
dem-s registros han de permanecer inalterados, por lo cual, si son empleados internamente, han de ser preser#ados al
principio del mdulo restaurados al 3inal! Este es el m>todo empleado por el 6F8 la 5:F8 en la maora de las ocasiones
para comunicarse con quien los llama! 2os registros ser-n preser#ados pre3eriblemente en la pila (con 9C8E) recuperados
de la misma (con 9F9 en orden in#erso); de esta manera, los mdulos son 8))t8at)+ pueden ser llamados de manera
m0ltiple soportando, entre otras caractersticas, la recursi#idad (sin embargo, se requerir- tambi>n que las #ariables locales
se generen sobre la pila)!
- 9aso de par-metros a tra#>s de un -rea com0n$ se utiliza una zona de memoria para la comunicacin! Este tipo de
mdulos no son reentrantes hasta que no acaben de procesar una llamada no se les debe llamar de nue#o en medio de
la "aena!
- 9aso de par-metros por la pila! En este m>todo, los par-metros son apilados antes de llamar al mdulo que los #a a
recoger! Este debe conocer el n0mero tamaGo de los mismos, para equilibrar el puntero de pila al 3inal antes de retornar
(m>todo de los compiladores de lengua7e 9ascal) o en caso contrario el programa que llama deber- encargarse de esta
operacin (lengua7e ")! 2a #enta7a del paso de par-metros por la pila es el pr-cticamente ilimitado n0mero de par-metros
admitido, de cmodo acceso, que los mdulos siguen siendo reentrantes! Cn e7emplo puede ser el siguiente$
dato2 6U ]
datoE 6U ]
!!!
9C8E dato2 ; apilar par-metros
9C8E datoE
",22 modulo, ; llamada
,66 89,4 ; equilibrar pila
!!!

modulo, 9HF" DE,H
9C8E 59
AFL 59,89
AFL 6M,W59*4X ; parte alta del dato
AFL ,M,W59*/X ; parte ba7a del dato
!!!
9F9 59
HE;
modulo, ED69
En el e7emplo, tenemos la #ariable dato de %+ bits di#idida en dos partes de 1/! 6icha #ariable es colocada en la pila
empezando por la parte menos signi3icati#a! , continuacin se llama a AF6C2F,, el cual comienza por preser#ar 59 (lo
usar- posteriormente) para respetar la norma de ca7a negra! 8e carga 59 con 89 debido a que el .0./ no permite el
direccionamiento inde)ado sobre 89! "omo la instruccin ",22 se dirige a una direccin cercana (DE,H), en la pila se
almacena slo el registro :9! 9or tanto, en W59*0X est- el 59 del programa que llama, en W59*+X el registro :9 del programa
que llama en W59*4X W59*/X la #ariable en#iada, que es el caso m-s comple7o (#ariables de %+ bits)! 6icha #ariable es
cargada en 6M$,M antes de proceder a usarla (tambi>n deberan apilarse ,M 6M para conser#ar la estructura de ca7a
negra)! ,l 3inal, se retorna con HE; el programa principal equilibra la pila aumentando 89 en 4 unidades para compensar
el apilamiento pre#io de dos palabras antes de llamar! 8i AF6C2F, 3uera un procedimiento le7ano (1,H) la #ariable estara
en W59*/X W59*.X, debido a que al llamar al mdulo se habra guardado tambi>n en la pila el "8 del programa que llama! El
lengua7e 9ascal hubiera retornado con HE; 4, haciendo innecesario que el programa que llama equilibre la pila! 8in
embargo, el m>todo del lengua7e " e)puesto es m-s e3iciente porque no requiere que el mdulo llamado conozca el n0mero
de par-metros que se le en#an$ >ste puede ser #ariable (de hecho, el " apila los par-metros antes de llamar en orden
in#erso, empezando por el 0ltimo$ de esta manera se accede correctamente a los primeros D par-metros que se necesiten)!
Captulo 5I: EL ENSAMBLADOR EN ENTORNO DOS
0.1. - TI$OS DE $RO1RAMAS E@ECUTABLES BA@O DOS.
,ntes de que el "FAA,D6!"FA pase el control al programa que se pretende e7ecutar, se crea un bloque de +&/ btes
llamado $S$ ()roram Sement )re"ix), cua descripcin detallada se #er- en el pr)imo captulo! En >l aparecen datos
tales como la direccin de retorno al dos cuando 3inalice el programa, la direccin de retorno en caso de "trl-5reaP en caso
de errores crticos! ,dem-s de la cantidad de memoria disponible los posibles par-metros suministrados del programa!
"uando el programa toma el control, 68 E8 apuntan al 989! ;ipos de programas$
En los de tipo "FA$
- "8 apunta al 989 e :9(100h (el programa empieza tras el 989)!
- 88 apunta al 989 89 toma la direccin m-s alta dentro del segmento del 989!
En los de tipo EME$
- "8 e :9 toman los #alores del punto de arranque del programa (directi#a (7D etiqueta)!
- 88 apunta al segmento de pila 89 ( tamaGo de la pila de3inida!
8i el programa es "FA podemos terminarlo con la interrupcin +0h (:D; +0h), o simplemente con un HE; si la pila no
est- desequilibrada (apunta a un :D; +0h que ha en la posicin 0 del 989); otra manera de acabar es por medio de la
3uncin 4"h del sistema (disponible desde el 6F8 +!0) que acaba cualquier programa sin problemas sin ning0n tipo de
requerimientos adicionales, tanto "FA como EME!
2os programas de tipo "FA se cargan en memoria tal como est-n en disco, entreg-ndoseles el control! 2os de tipo
EME, que pueden llegar a mane7ar m0ltiples segmentos de cdigo de hasta /4 @b, se almacenan en disco
<semiensamblados=! En realidad, al ser cargados en memoria, el 6F8 tiene que realizar la 0ltima 3ase de (otaM),
calculando las direcciones de memoria absolutas! 9or ello, estos programas tienen un 3ormato especial en disco, generado
por los ensambladores compiladores, su imagen en memoria no se corresponde realmente con lo que est- grabado en el
disco, aunque esto al usuario no le importe! 9or ello, no se e)traGe el lector de haber #isto alguna #ez 3icheros EME de m-s
de /40 @b$ e#identemente, no se cargan enteros en memoria aunque lo parezca! 2os programas "FA no hacen re3erencias
a datos o direcciones separados m-s de /4 @b, por lo que todos los saltos desplazamientos son relati#os a los registros de
segmento (no se cambia "8 ni 68) con lo que no es necesaria la 3ase de <monta7e=! Do obstante, un programa "FA puede
hacer lo que le de la gana con los registros de segmento acceder a m-s de /4 @b de memoria, por cuenta riesgo del
programador! En general, la programacin en ensamblador est- ho en da relegada a pequeGos programas residentes,
controladores de dispositi#os o rutinas de apoo a programas hechos en otros lengua7es, por lo que no es estrictamente
necesario traba7ar con programas EME realizados en ensamblador! 8al#o e)cepciones, la maora de los programas
desarrollados en este libro ser-n de tipo "FA a que los EME ocuparan algo m-s, aunque el ensamblador da algo m-s de
comodidad al programador en los mismos!
0.!. - E@EM$LO DE $RO1RAMA DE TI$O COM.
El siguiente e7emplo escribe una cadena en pantalla llamando a uno de los ser#icios est-ndar de impresin del 6F8
(3uncin 9 de :D; +1h)$
cr ETC 1% ; constante de retorno de carro
l3 ETC 10 ; constante de salto de lnea
programa 8EBAED; ; segmento com0n a "8, 68, E8, 88!
,88CAE "8$programa, 68$programa
FHB 100h ; programa de tipo "FA
inicio$ 2E, 6M,te)to ; direccin de te)to a imprimir
AFL ,E,9 ; 3uncin de impresin
:D; +1h ; llamar al 6F8
:D; +0h ; #ol#er al sistema operati#o
te)to 65 cr,l3,VBrupo Cni#ersitario de :n3orm-tica!V,cr,l3,VdV
programa ED68 ; 3in del segmento
ED6 inicio ; 3in del programa punto de inicio
Fl#id-ndonos de los comentarios que comienzan por <;=, en las primeras lineas las directi#as ETC de3inen dos
constantes para el preprocesador del compilador$ cr(1% l3(10! El programa, de tipo "FA, consta de un 0nico segmento! 2a
directi#a ,88CAE indica que, por de3ecto, las instrucciones m-quina se ensamblar-n para el registro "8 en este segmento
(lo m-s lgico, por otra parte); tambi>n con#iene asumir el registro 68, de lo contrario, si hubiera que acceder a una #ariable,
el ensamblador aGadira el pre3i7o del segmento "8 a la instruccin al no estar seguro de que 68 apunta a los datos,
consumiendo m-s memoria! 8e pueden aGadir los dem-s registros de segmento en el ,88CAE, aunque es redundante! El
FHB 100h es obligatorio en programas "FA, a que estos programas ser-n cargados en memoria en la posicin "8$100h!
,l 3inal, la direccin del te)to a imprimir se coloca en 68$6M ("8(68(E8(88 en un programa "FA reci>n e7ecutado) se
llama al 6F8! El car-cter YdY delimita la cadena a imprimir, lo cual es una herencia del "9IA (sera m-s interesante que 3uera
el 0 el delimitador) por razones histricas! 8e acaba el programa con :D; +0h! El punto de arranque es indicado con la
directi#a ED6, aunque en realidad en los programas "FA el punto indicado (en el e7emplo, <inicio=) debe estar
3orzosamente al principio del programa! Fbs>r#ese que no se genera cdigo hasta llegar a la lnea <inicio$=, todo lo anterior
son directi#as!
0.". - E@EM$LO DE $RO1RAMA DE TI$O EXE.
2os programas EME (listado al 3inal de esta seccin) requieren algo m-s de elaboracin! En primer lugar, es necesario
de3inir una pila reser#ar espacio para la misma! ,l contrario que los programas "FA (cua pila se sit0a al 3inal del
segmento compartido tambi>n con el cdigo los datos) esta caracterstica obliga a de3inir un tamaGo prudente en 3uncin
de las necesidades del programa! ;>ngase en cuenta que en la pila se almacenan las direcciones de retorno de las
subrutinas al llamar a una 3uncin de la 5:F8 la pila es usada con intensidad! En general, con medio Pilobte basta para
programas tan sencillos como el del e7emplo, e incluso para otros mucho m-s comple7os! El lmite m-)imo est- en /4 @b! El
segmento de pila se nombra siempre 8;,"@ con el ;2:D@ de 5orland es necesario indicar tambi>n la clase Y8;,"@Y!
"omo se #e, son de3inidos por separado el segmento de cdigo, pila datos, lo que tambi>n auda a estructurar m-s el
programa! El segmento de cdigo se de3ine como procedimiento 1,H, entre otras razones para que el ensamblador
ensamble el HE; del 3inal (con el que se #uel#e al 6F8) como un HE;1! 2a directi#a ,88CAE asocia cada registro de
segmento con su correspondiente segmento! "omo puede obser#arse al principio del programa, es necesario preparar <a
mano= la direccin de retorno al sistema! El 9C8E 68 del principio coloca el segmento del 989 en la pila; el MFH ,M,,M
coloca un cero en ,M (esta instruccin gasta un bte menos que AFL ,M,0) el 9C8E ,M mete ese 0 en la pila! "on ello, al
#ol#er al 6F8 con HE; (HE;1 en realidad) el control pasar- a 68$0, esto es, a la primera instruccin del 989 (:D; +0h)!
,unque pueda parecer un tanto lioso, es un 7uego de niGos estas tres instrucciones consecuti#as (9C8E 68 I MFH
,M,,M I 9C8E ,M) son la manera de empezar de cientos de programas EME, que despu>s acaban con HE;! En general, a
partir del 6F8 +!0 es m-s aconse7able terminar el programa con la 3uncin 4"h del 6F8, que no requiere que "8 apunte al
989 ni precisa de preparacin alguna en la pila adem-s permite retornar un cdigo de EHHFH2ELE2 en ,2$ en los
programas 3uturos esto se har- con bastante 3recuencia!
;ambi>n debe obser#arse cmo se inicializa 68, a que en los programas EME por de3ecto no apunta a los datos! ,hora
puede preguntarse el lector, por curiosidad, cqu> #aldr- <datos=]$ datos tiene un #alor relati#o asignado por el ensamblador;
cuando el programa sea cargado en memoria, en el proceso de monta7e en 3uncin de cu-l sea la primera posicin de
memoria libre, se le asignar- un #alor determinado por el montador del sistema operati#o!
cr ETC 1%
l3 ETC 10
; 8egmento de datos
datos 8EBAED;
te)to 65 cr,l3,V;e)to a imprimirV,cr,l3,VdV
datos ED68
; 8egmento de pila
pila 8EBAED; 8;,"@ Y8;,"@Y ; poner 8;,"@ es obligatorio
65 1+. dup (YpilaY) ; reser#ados &1+ btes
pila ED68
; 8egmento de cdigo
codigo 8EBAED;
e7emplo 9HF" 1,H
,88CAE "8$codigo, 68$datos, 88$pila
; poner direccin de retorno al 6F8 en la pila$
9C8E 68 ; segmento del 989
MFH ,M,,M ; ,M ( 0
9C8E ,M ; desplazamiento 0 al 989
; direccionar segmento de datos con 68
AFL ,M,datos ; ,M ( direccin del segmento de datos
AFL 68,,M ; inicializar 68
; escribir te)to
2E, 6M,te)to ; 68$6M ( direccin del te)to
AFL ,E,9
:D; +1h
; #ol#er al 6F8
HE; ; en realidad, HE;1 (9HF" 1,H)
e7emplo ED69
codigo ED68 ; 3in del cdigo
ED6 e7emplo ; punto de arranque del programa
0.#. - $ROCESO DE ENSAMBLA@E.
/!4!1! - TASMBMASM!
Es el programa que con#ierte nuestro listado 3uente en cdigo ob7eto, es decir, lengua7e m-quina en el que slo 3altan las
re3erencias a rutinas e)ternas! 9ermite la obtencin de listados de cdigo de re3erencias cruzadas (smbolos, etiquetas,
#ariables)! En general, bastar- con hacer ;,8A nombreZprograma (se supone la e)tensin !,8A por de3ecto)! El 3ichero
3inal tiene e)tensin F5[! En general, la sinta)is del ;,8A A,8A es m-s o menos equi#alente$ en el primero se obtiene
auda con IE en el segundo con IEE29! "on ;,8A, cuando se #a a obtener la #ersin de3initi#a del programa, o si >ste es
corto -o el ordenador r-pido- merece la pena utilizar el par-metro Im%, con ob7eto de que de dosItres pasadas optimize
m-s el cdigo! 9or su lado, A,8A presenta estadsticas adicionales si se indica I# se puede cambiar con I5tamaGo el nb
de @b de memoria que destina al 3ichero 3uente, entre 1 /%! 2a sinta)is es (tanto para ;,8A como A,8A)$
;,8A 3icheroZ3uente, 3icheroZlistado, 3icheroZre3erenciasZcruzadas
8e puede omitir el 3ichero de listado el de re3erencias cruzadas! "uando se emplea A,8A /!M, para ensamblar los
listados de este libro ha que indicar la opcin IRm para mantener la compatibilidad con las #ersiones anteriores del
ensamblador, siendo adem-s obligatorio indicar la e)tensin; como se genera directamente el 3ichero EME ha que indicar Ic
si se desea e#itar esto (si no se quiere que linPe)! 2a sinta)is quedara$
A2 IRm 3iheroZ3uente!asm
, continuacin se listan los par-metros comunes a ;,8A +!0 ( posterior) A,8A 4!0I&!0 (NO la /!M)$
Ia Is 8eleccionan un orden al3ab>tico o secuencial de los segmentos!
Ic
Benera un listado de re3erencias cruzadas en un 3ichero de e)tensin "H1 listo para ser procesado por "HE1 (A,8A)
aGadiendo adem-s n0meros de lnea al listado, o bien inclue el listado de re3erencias cruzadas directamente dentro
del listado del programa (caso de ;,8A)! 2as re3erencias cruzadas son un listado de todos los smbolos del programa,
indicando los n0meros de lnea del mismo en que son de3inidos re3erenciados!
I6
6e la manera I6smboloW(#alorX permite crear el smbolo indicado, cua presencia puede comprobarse en el programa
con una directi#a :1 (es 0til para de3inir e)ternamente un smbolo que indique que el programa est- en 3ase de
depuracin, de cara a ensamblar cierto cdigo adicional)! ,unque Id (en min0sculas) es un obsoleto par-metro de
A,8A para obtener un listado de la primera pasada del ensamblador, A,8A 4!0 es capaz de darse cuenta de que se
pretende de3inir un smbolo con Id a menos que se indique solo Id!
Ie Emula las instrucciones de punto 3lotante del .0).', apo-ndose en una librera al e3ecto!
I:ruta
9ermite indicar el directorio donde el ensamblador debe de buscar los 3icheros indicados en el programa 3uente con
:D"2C6E!
IlWaX "on Il se genera un listado de ensambla7e con Ila un listado e)pandido!
Im
"on Im se indica el ni#el de preser#acin del sentido de ma0sculas min0sculas en los smbolos$ Iml hace que se
consideres di3erentes ma0sculas de min0sculas en todos los smbolos, Im) slo con los smbolos globales Imu hace
que se mausculicen todos los smbolos globales! ,l ensamblar mdulos para usar desde l)/uaM) C ha que indicar
por lo menos Im)! En A,8A /!M se emplea I") en lugar de Im), I"p en lugar de Iml I"u en #ez de Imu!
In 8uprime las tablas de smbolos en el listado!
Ip
Leri3ica que el cdigo generado para el modo protegido es correcto (al emplear la directi#a para generar instrucciones
de modo protegido)!
It 8uprime los mensa7es si el ensambla7e es correcto!
IK :ndica el ni#el de ad#ertencias$ IK0 ninguna, IK1 slo las serias IK+ slo conse7os!
IM 2ista las condiciones 3alsas (ensambla7e condicional)!
Iz Lisualiza la lnea del error no slo el n0mero de la misma!
IRi Benera in3ormacin simblica para los depuradores de cdigo!
IRd :nclue slo la in3ormacin del n0mero de lnea!
/!4!+! - TLINKBLINK!
El montador o linPador permite combinar #arios mdulos ob7eto, realizando las cone)iones entre ellos , 3inalmente, los
con#ierte en mdulo e7ecutable de tipo EME (empleando el A2 de A,8A /!M se obtiene directamente el 3ichero EME a que
in#oca autom-ticamente al linPador)! El linPador permite el uso de libreras de 3unciones rutinas! ;2:D@, a di3erencia de
2:D@, permite generar un 3ichero de tipo "FA directamente de un F5[ si se indica el par-metro It, lo que agiliza a0n m-s el
proceso! 9uede obtenerse auda e7ecut-ndolo sin par-metros! 2os par-metros de ;2:D@ son sensibles a ma0sculas
min0sculas, por lo que I; no es lo mismo que It! "on 2:D@ se obtiene auda indicando IEE29! ,unque los par-metros de
uno otro son bastante distintos, la sinta)is gen>rica de ambos es$
;2:D@ 3ichZob7(s), 3ichZe)e, 3ichZmap, 3ichZlibreria, 3ichZde3
2os 3icheros no necesarios se pueden omitir (o indicar DC2)$ para lin8ar el 3ichero prog1!ob7 el prog+!ob7 con la librera
math!lib generando 9HFB1!EME basta con e7ecutar ;2:D@ prog1*prog+,,,math! ,lternati#amente se puede indicar ;2:D@
f3ichero para que tome los par-metros del 3ichero de te)to 1:"EEHF, en el caso de que estos sean demasiados sea
incmodo teclearlos cada #ez que se linPa! 2os 3icheros de te)to de e)tensin A,9 contienen in3ormacin 0til para el
programador sobre la distribucin de memoria de los segmentos!
/!4!%! - EXE!BIN!
2os 3icheros EME generados por ;2:D@ o 2:D@ no son copia e)acta de lo que aparece en la memoria, sino que el 6F8
-tras cargarlos- debe realizar una 0ltima operacin de <monta7e=! Cn programa "FA en memoria es una copia del 3ichero
del disco, es algo m-s corto m-s sencillo de desensamblar! ,l contrario de lo que algunos opinaron en su da, el tiempo ha
demostrado que nunca llegaran a ser directamente compatibles con los actuales entornos multitarea!
EME+5:D permite trans3ormar un 3ichero EME en "FA siempre que el mdulo ocupe menos de /4@ que est>
ensamblado con FHB 100h! 8i no se indic el par-metro It en ;2:D@, ser- necesario este programa (al igual que cuando se
utiliza 2:D@)! "uando se crean programas 8?8 (que se di3erencian de los "FA b-sicamente en que no tienen FHB 100h)
no se puede e7ecutar ;2:D@ It, por lo que es necesaria la auda de EME+5:D para con#ertir el programa EME en 8?8!
8inta)is$
EME+5:D 3ich!e)e (a #eces ha que indicar EME+5:D 3ich!e)e 3ich!com)
8i el programa no contiene FHB 100h, EME+5:D genera un 3ichero binario puro de e)tensin 5:D! 8i adem-s e)isten
re3erencias absolutas a segmentos, EME+5:D preguntar- el segmento en que #a a correr (algunas #ersiones permiten
indicarlo de la manera I8segmento)$ esto permite generar cdigo para ser e7ecutado en un segmento determinado de la
memoria (como pueda ser una memoria E9HFA o HFA)!
/!4!4! - TLIBBLIB!
El gestor de libreras permite reunir mdulos ob7eto en un 0nico 3ichero para poder tomar de >l las rutinas que se
necesiten en cada caso! En este libro no se desarrollan programas tan comple7os que 7usti3iquen su utilizacin! En cualquier
caso, la sinta)is es la siguiente$
;2:5 3icheroZlibreria comandos, 3icheroZlistado
8i no se indican comandos se obtiene simplemente in3ormacin del contenido de la librera en el 3ichero de listado (que
puede ser "FD para listado por pantalla)! 2os comandos son de la 3orma \simbolo`nombreZdeZmdulo pueden ser los
siguientes$
* aGade el mdulo ob7eto indicado a la librera
- borra el mdulo indicado de la librera
S saca el mdulo de la librera sin borrarlo (e)trae 3ichero F5[)
-* alternati#amente *-, reemplaza el mdulo e)istente en la librera
-S alternati#amente S-, e)trae el mdulo de la librera lo borra de ella
9or e7emplo, para aGadir el mdulo TC:"@!F5[, borrar el 82FU!F5[ reemplazar el 8FH;!F5[ por una nue#a #ersin
en 2:5HEH:,!2:5 se e7ecutara$
;2:5 libreria *quicP-sloK-*sort
8i la lista es mu larga se puede incluir en un 3ichero e7ecutar ;2:5 f3ichero para que la lea del mismo (si no cabe en
una lnea del 3ichero, puede escribirse j al 3inal antes de pasar a la siguiente)!
/!4!&! TCRE?BCRE?!
Esta utilidad genera listados en orden al3ab>tico de los smbolos, como auda a la depuracin! "on el A,8A la opcin Ic
crea un 3ichero de re3erencias cruzadas de e)tensin "H1 (respondiendo a3irmati#amente cuando pregunta por el mismo o
indic-ndolo e)plcitamente en la lnea de comandos); la opcin Ic de ;,8A lo inclue en el listado, aunque si se indica el
nombre del 3ichero de re3erencias cruzadas genera un 3ichero de e)tensin MH1! "HE1 ;"HE1 interpretan
respecti#amente los 3icheros "H1 MH1 generando un 3ichero de te)to con e)tensin HE1 que contiene el listado de
re3erencias cruzadas! E7!$
;,8A 3ichero,,,3ichero
;"HE1 3ichero
2as re3erencias cruzadas son un listado de todos los smbolos del programa, indicando los n0meros de lnea del mismo
en que son re3erenciados (la lnea en que son de3inidos se marca con l); estos n0meros de lnea son relati#os al listado de
ensambla7e del programa ( no al 3ichero 3uente)! Es 0til para depurar programas grandes comple7os!
/!4!/! - MAKE!
Esta utilidad se apoa en unos 3icheros especiales, al estilo de los 5,; del 6F8, de cara a automatizar el proceso de
ensambla7e! 8lo es recomendable para programas grandes, di#ididos en mdulos, en los que A,@E chequea la 3echa
hora para ensamblar slo las partes que haan sido modi3icadas!

0.&. - LA UTILIDAD DEBU1BSYMDEB.
2a utilidad 6E5CB includa en los sistemas A8-6F8, es una herramienta para depuracin de programas mu interesante
que permite desensamblar los mdulos , adem-s, e7ecutar programas paso a paso, #iendo las modi3icaciones que su3ren
los registros banderas! 8e trata de un programa menos comple7o, cmodo potente que depuradores de cdigo como
;urbo 6ebugger (de 5orland) o "ode#ieK (Aicroso3t), pero en algunos casos es m-s 0til! Leremos ahora los principales
comandos del 6E5CB, los cuales tambi>n son admitidos en su maora por "ode#ieK, por lo que el tiempo in#ertido en
aprenderlos ser- 0til no slo para conocer el cl-sico mtico 6E5CB!
,ntes de empezar con ellos, con#iene hacer re3erencia al programa 8?A6E5 que acompaGa al A,8A de Aicroso3t$ se
trata de un 6E5CB me7orado, con auda, m-s r-pido e inteligente (indica el tipo de 3uncin del sistema cuando al tracear un
programa >ste llama al 6F8) , en la pr-ctica, es 99h compatible! ;ambi>n admite las instrucciones adicionales del +./
los DE" L+0IL%0! 8u di3erencia principal es que al abandonarlo para #ol#er al 6F8 restaura los #ectores de interrupcin, lo
que puede no ser deseable en algunos casos mu concretos! ,dem-s, desde la #ersin 4!0 se admite el par-metro I8 (con
8?A6E5 I8 nom3ich!e)t) lo que permite conmutar entre la pantalla de depuracin la de e7ecucin pulsando la tecla YmY!
8inta)is general$ 6E5CB Wprograma!e)t Wpar-metrosX X
2os programas pueden ser de tipo EME o "FA; en el caso de los primeros se les cargar- a montados con los registros
inicializados, listos para su e7ecucin! E#identemente, los programas "FA tambi>n se cargan con los registros inicializados
el correspondiente 989 preparado, as como con :9(100h! 2os par-metros opcionales no son los de el 6E5CB o
8?A6E5 sino los que normalmente se suministraran al programa a depurar! ;ambi>n se pueden cargar otros 3icheros de
cualquier e)tensin o simplemente entrar en el programa sin cargar ning0n 3ichero! ,l entrar, aparecer- el prompt particular
del 6E5CB$ un guin (-)! Entonces se pueden teclear rdenes que constar-n generalmente de una sola letra! 2a maora de
las mismas admiten par-metros, que normalmente ir-n separados por comas! Estos par-metos pueden ser n0meros
he)adecimales de hasta dos o cuatro dgitos, registros , adem-s$
- "adenas de caracteres$ Encerradas entre comillas simples o dobles! El te)to puede a su #ez encerrar 3ragmentos
entrecomillados, empleando comillas distintas a las m-s e)teriores! E7emplo$
V"adena de caracteresV, VFtra YcadenaY m-sV, Y"urso de V.0./VY
"on 8?A6E5 debe tenerse cuidado de no colocar el nombre de un registro de segmento en ma0sculas seguido de
dos puntos, a que no se interpretar- correctamente$
VE8;F E8$ E8;, ",6ED, 8EH, A,2 ;H,6C":6,!V
2a cadena YE8$Y no ser- bien traducida a sus correspondientes #alores ,8"::! "on 6E5CB este problema no e)iste!
- 6irecciones$ 9ueden e)presarse con sus correspondientes #alores num>ricos o bien apo-ndose en alg0n registro de
segmento, aunque el o33set siempre ser- num>rico$ 1E9%$,6+1, "8$100, E8$19,"
El depurador 8?A6E5 es mucho m-s 3le)ible permite tambi>n emplear registros de propsito general en el o33set!
8era #-lida la direccin 68$5M*,M*104!
- Hangos$ 8on dos direcciones separadas por una coma; o bien una direccin, la letra Y2Y un #alor num>rico que indica el
n0mero de btes a partir de la direccin!
- 2istas$ 8on secuencias de btes Io cadenas separadas por comas$
,", V;e)to de e7emploV, 06, 0,, YdY
El 6E5CB del A8-6F8 &!0 el 8?A6E5 poseen una auda in#ocable con el comando ], en la que se resumen las
principales rdenes! , continuacin se listan las m-s interesantes$
S T (Tuit)$ permite abandonar el programa #ol#er al 6F8!
S 6 W\direccin` WnumbtesXX (dump)$ #isualiza el contenido de la memoria! 8?A6E5 permite adem-s #isualizarla en
palabras (6U), dobles palabras (66), coma 3lotante !!!
S , W\direccin`X (assemble)$ permite ensamblar a partir de "8$:9 si no se indica una direccin concreta! 8e admiten las
directi#as 65 6U del ensamblador! 2as instrucciones que requieran indicar un registro de segmento, con 6E5CB ha que
ponerlas en una sola lnea! 9or e7emplo$
M2,; "8$ ; mal ensamblado con 6E5CB (no as con 8?A6E5)
AFL UFH6 9;H E8$W100X,1+%4 ; error en 6E5CB (s #ale con 8?A6E5)
"8$ ; bien emsamblado con ambos
M2,;
E8$ ; esto tambi>n
AFL UFH6 9;H W100X,1+%4
2os saltos inter-segmento deben especi3icarse como 1,H (e7!, ",22 1,H W100X) a no ser que sea e#idente que lo son
(e7! ",22 1+%4$&/'.)!
S E \direccin` W\lista`X (enter)$ permite consultar modi3icar la memoria, bte a bte! 9or e7emplo, con E +%0 1,+,% se
introduciran los btes 1, + % a partir de 68$+%0! 8i no se indica \lista`, se #isualizar- la memoria bte a bte, pudi>ndose
modi3icar los btes deseados, a#anzar al siguiente (barra espaciadora) o retroceder al anterior (signo -)! 9ara acabar se
pulsa HE;CHD!
S C W\direccion` W\rango`XX (unassemble)$ desensambla la memoria! "omo e7emplos #-lidos$ C E8$100, C E000$1940 !!!
si se indica rango, 6E5CB desensamblar- ese n0mero de btes 8?A6E5 ese n0mero de lneas! 9or de3ecto se emplea
"8$ como registro de segmento!
S H W\registro`X (register)$ permite #isualizar modi3icar el #alor de los registros! 9or e7emplo, si se e7ecuta la orden YripY,
se solicitar- un nue#o #alor para :9; con H1 se muestran los 3lags se permite modi3icar alguno$
1lag ,cti#o 5orrado
6esbordamient
o
FL DL
6ireccin 6D (#) C9 (n)
:nterrupcin E: 6:
8igno
DB
(\0)
92 (`0)
"ero
RH
((0)
DR (O(0)
,carreo au)iliar ," D,
9aridad
9E
(par)
9F
(impar)
,carreo "? D"
S B W(\direccin` W,\direccin`,!!!XX (go)$ e7ecuta cdigo desde "8$:9 (a menos que se indique una direccin concreta)! 8i
se traba7a sobre memoria HFA no debe indicarse la segunda direccin! 9ara que el 3lu7o del programa se detenga en la +g
direccin o posteriores debe pasar necesariamente por ella(s)! 8e puede indicar hasta 10 direcciones donde debe detenerse!
S ; W\#eces`X (trace)$ e7ecuta una instruccin del programa (a partir de "8$:9) mostrando a continuacin el estado de los
registros la siguiente instruccin! E7ecutar ;10 equi#aldra a e7ecutar 1/ #eces el comando ;! 8i la instruccin es ",22 o
:D;, se e7ecutar- como tal introduci>ndose en la subrutina o ser#idor de interrupciones correspondiente (8?A6E5 no entra
en los :D; +1h)!
S 9 W\#eces`X (proceed)$ similar al comando ;, pero al encontrarse un ",22 o :D; lo e7ecuta de olpe sin entrar en su
interior (o7o, Nesto 0ltimo 3alla al tracear sobre memoria HFAO)!
S D \especi3icacionZ3ichero` (name)$ se asigna un nombre al programa que est- siendo creado o modi3icado! 8e puede
indicar la traectoria de directorios!
S 2 W\direccin`X (load)$ carga el 3ichero de nombre indicado con el comando D! 8i es e7ecutable lo prepara
adecuadamente para su inmediata e7ecucin! En 5M$"M queda depositado el tamaGo del 3ichero (5M(0 para 3icheros de
menos de /4 @b)! 9or de3ecto, la direccin es "8$100h!
S 2 \direccin` \unidad` \primerZsector` \numZsectores` (load)$ carga sectores de la unidad 0, 1, !!! (,, 5, !!!) a
memoria! 8e trata de sectores lgicos del 6F8 no los sectores 3sicos de la 5:F8! 2as #ersiones antiguas de 8?A6E5 dan
errores en particiones de m-s de %+ Ab!
S U W\direccin`X (Krite)$ graba el contenido de una zona de memoria a disco! 8i no se indica la direccin, se graba desde
"8$100h hasta "8$100h*n0meroZbtes; el n0mero de btes se indica en 5M$"M (no es una direccin segmentada sino un
#alor de %+ bits)! 8i se trata de un EME no se permitir- grabarlo (para modi3icarlos, ha que renombrarles para cambiarles la
e)tensin, aunque de esta manera no ser-n montados al cargarlos)!
S U \direccin` \unidad` \primerZsector` \numZsectores` (Krite)$ graba sectores de la memoria a disco en la unidad
0, 1, !!! (,, 5, !!!)! 8e trata de sectores lgicos del 6F8 no los sectores 3sicos de la 5:F8! 2as #ersiones antiguas de
8?A6E5 dan errores en particiones de disco duro de m-s de %+ Ab!
S 8 \rango` \lista` (search)$ busca una cadena de btes por la memoria! 9ara buscar la cadena V9E9EV terminada por
cero en un -rea de &1+ btes desde 68$100 se hara$ 8 100 2 +00 V9E9EV,0 (por de3ecto se busca en 68$)! Do se
encontrara sin embargo VpepeV (en min0sculas)!
S 1 \rango` \lista` (3ill)$ llena la zona de memoria especi3icada con repeticiones de la lista de btes indicada! 9or
e7emplo, para rellenar cdigos 0,,h 100h btes a partir de 9.00h$0 se e7ecutara 1 9.00$0 2 100 ,,; en #ez de ,, se podra
haber indicado una lista de btes o cadenas de caracteres!
S " \rango` \direccin` (compare)$ compara dos zonas de memoria mostrando las di3erencias! 9or e7emplo, para
comparar & btes de 68$100 68$+00 se hace$ " 100 2 & +00!
S A \rango` \direccin` (mo#e)$ A-s que mo#er, copia una zona de memoria en otra de manera inteligente (controlando
los posibles solapamientos de los bloques)!
S : \puerto` (input)$ #isualiza la lectura del puerto de EI8 indicado!
S F \puerto` \#alor` (output)$ en#ia un #alor a un puerto de EI8!
S E \#alor1` \#alor+` (he)aritmetic)$ muestra la suma resta de #alor1 #alor+, ambos operandos de un m-)imo de 1/
bits (si ha desbordamiento se trunca el resultado, que tampoco e)cede los 1/ bits)!
;ambi>n e)isten comandos en 6E5CB para acceder a la memoria e)pandida$ M8 (obtener el estado de la memoria
e)pandida), M, npag (localizar npag p-ginas), M6 handle (desalo7ar el handle indicado) MA paginaZlogica paginaZ3isica
handle (mapear p-ginas)!
"on 8?A6E5 pueden adem-s colocarse, con suma 3acilidad, puntos de ruptura (breaPpoints); con 6E5CB se pueden
implementar con la orden B (indicando m-s de una direccin hasta un m-)imo de 10, donde debe detenerse el programa si
pasa por ellas) aunque es m-s incmodo! En 8?A6E5 se pueden de3inir con 59 direccin, borrarse con 5"
numZbreaPpoint, habilitarse con 59 numZbreaPpoint (necesario antes de emplearlos), deshabilitarse con 56 numZbreaPpoint
listar los de3inidos con 52! ,dem-s, 8?A6E5 puede #isualizar datos en coma 3lotante de %+, /4 .0 bits con el comando
6 (68, 62 6;)!
8?A6E5 es realmente un depurador simblico (8?Abolic 6E5ugger) que permite mostrar in3ormacin adicional
depurar con maor comodidad los programas que han sido ensamblados con in3ormacin de depuracin!
Cna posibilidad interesante de 6E5CB 8?A6E5 es que admiten el redireccionamiento del sistema operati#o! Ello
permite, por e7emplo, crear 3icheros ,8":: con rdenes despu>s suministr-rselas al programa, como en el siguiente
e7emplo$ 6E5CB \ FH6EDE8!;M;! 2a 0ltima orden de este 3ichero deber- ser T (quit), de lo contrario no se de#ol#era el
control al 6F8 ni se podra parar el programa (la entrada por de3ecto -el teclado- no act0a)! ;ambi>n es #ers-til la posibilidad
de redireccionar la salida! 9or e7emplo, tras 6E5CB ` 8,2:6,!;M;, se puede teclear un comando para desensamblar (C)
otro para salir (T)$ en el disco aparecer- el 3ichero con los datos del desensambla7e (se teclea a ciegas, lgicamente, porque
la salida por pantalla ha sido redireccionada al 3ichero)! 9or supuesto, tambi>n es posible redireccionar entrada salida a un
tiempo$ 6E5CB \ FH6EDE8!;M; ` 8,2:6,!
0.0 - LAS ?UNCIONES DEL DOS Y DE LA BIOS.
El cdigo de la 5:F8, almacenado en las memorias HFA del ordenador, constitue la primera capa de so3tKare de los
ordenadores compatibles! 2a 5:F8 accede directamente al hardKare, liberando a los programas de usario de las tareas m-s
comple7as! 9arte del cdigo de la 5:F8 es actualizado durante el arranque del ordenador, con los 3icheros que inclue el
sistema operati#o! El sistema operati#o o 6F8 propiamente dicho se instala despu>s$ el 6F8 no realiza ning0n acceso
directo al hardKare, en su lugar se apoa en la 5:F8, constituendo una segunda capa de so3tKare! El 6F8 pone a
disposicin de los programas de usuario unas 3unciones mu e#olucionadas para acceder a los discos a los recursos del
ordenador! 9or encima del 6F8 se suele colocar habitualmente al "FAA,D6!"FA, aunque realmente el "FAA,D6 no
constitue capa alguna de so3tKare$ es un simple programa de utilidad, como cualquier otro, e7ecutado sobre el 6F8 que
adem-s no pone ninguna 3uncin a disposicin del sistema (al menos, documentada), su 0nica misin es cargar otros
programas!
?UNCIONES DE LA BIOS
2as 3unciones de la 5:F8 se in#ocan, desde los programas de usuario, e7ecutando una interrupcin so3tKare con un cierto
#alor inicial en los registros! 2a 5:F8 emplea un cierto rango de interrupciones, cada una encargada de una tarea espec3ica$
:D; 10h$ 8er#icios de Ldeo (te)to gr-3icos)!
:D; 11h$ :n3orme sobre la con3iguracin del equipo!
:D; 1+h$ :n3orme sobre el tamaGo de la memoria con#encional!
:D; 1%h$ 8er#icios de disco (mu elementales$ pistas, sectores, etc!)!
:D; 14h$ "omunicaciones en serie!
:D; 1&h$ 1unciones casette (9") ser#icios especiales del sistema (,;)!
:D; 1/h$ 8er#icios de teclado!
:D; 1'h$ 8er#icios de impresora!
:D; 1.h$ 2lamar a la HFA del 5,8:" (slo m-quinas :5A)!
:D; 19h$ Heinicializacin del sistema!
:D; 1,h$ 8er#icios horarios!
:D; 11h$ ,punta a la tabla de los caracteres ,8":: 1+.-+&& (.). puntos)!
2a maora de las interrupciones se in#ocan solicitando una 3uncin determinada (que se indica en el registro ,E al
llamar) se limitan a de#ol#er un resultado en ciertos registros, realizando la tarea solicitada! En general, slo resultan
modi3icados los registros que de#uel#en algo, aunque 59 es corrompido en los ser#icios de #deo de las m-quinas m-s
obsoletas!
?UNCIONES DEL DOS
El 6F8 emplea #arias interrupciones, al igual que la 5:F8; sin embargo, cuando se habla de 3unciones del 6F8, todo el
mundo sobreentiende que se trata de llamar a la :D; +1h, la interrupcin m-s importante con di3erencia!
:D; +0h$ ;erminar programa (tal #ez en desuso)!
INT !1N: S)8;-'-o+ *)l DOS.
:D; ++h$ "ontrol de 3inalizacin de programas!
:D; +%h$ ;ratamiento de "trl-"!
:D; +4h$ ;ratamiento de errores crticos!
:D; +&h$ 2ectura absoluta de disco (sectores lgicos)!
:D; +/h$ Escritura absoluta en disco (sectores lgicos)!
:D; +'h$ ;erminar de7ando residente el programa (en desuso)!
:D; +.h$ Idle (e7ecutada cuando el ordenador est- inacti#o)!
:D; +9h$ :mpresin r-pida en pantalla (no tanto)!
:D; +,h$ Hed local A8 DE;!
:D; +5h-+6h$ Cso interno del 6F8!
:D; +Eh$ 9rocesos 5atch!
:D; +1h$ :nterrupcin Aultiple)!
:D; %0h-%1h$ "ompatibilidad "9IA-.0!
:D; %+h$ Heser#ada!
2as 3unciones del 6F8 se in#ocan llamando a la :D; +1h e indicando en el registro ,E el n0mero de 3uncin a e7ecutar!
8lo modi3ican los registros en que de#uel#en los resultados, de#ol#iendo normalmente el acarreo acti#o cuando se produce
un error (con un cdigo de error en el acumulador)! Auchas 3unciones de los lengua7es de programacin 3recuentemente se
limitan a llamar al 6F8!
;odos los #alores mostrados a continuacin son N),a*)'-(al)+; el de la izquierda es el n0mero de 3uncin (lo que ha
que cargar en ,E antes de llamar); algunas 3unciones del 6F8 se di#iden a su #ez en sub3unciones, seleccionables
mediante ,2 (segundo #alor num>rico, en los casos en que aparece)! 2as 3unciones marcadas con UO 3ueron histricamente
indocumentadas, aunque Aicroso3t desclasi"ic! casi todas ellas a partir del A8-6F8 &!0 (en muchas secciones de este libro,
escritas con anterioridad, se las re3erencia a0n como indocumentadas)! 8e indica tambi>n la #ersin del 6F8 a partir de la
que est-n disponibles!
En general, se debe intentar emplear siempre las 3unciones que requieran la menor #ersin posible del 6F8; sin
embargo, no es necesario buscar la compatibilidad con el 6F8 1!0$ esta #ersin no soporta subdirectorios, el sistema de
3icheros se basa en el horroroso m>todo 1"5! 2os 1"5 a no est-n soportados siquiera en la #entana de compatibilidad
6F8 de F8I+, siendo recomendable ignorar su e)istencia traba7ar con los handles, al estilo del CD:M, que consisten en
unos n0meros que identi3ican a los 3icheros cuando son abiertos! E)isten & handles prede3inidos permanentemente abiertos$
0 (entrada est-ndar -teclado-), 1 (salida est-ndar -pantalla-), + (salida de error est-ndar -tambi>n pantalla-), % (entradaIsalida
por puerto serie) 4 (salida por impresora)$ la pantalla, el teclado, etc! pueden ser mane7ados como simples 3icheros!
2as 3unciones precedidas de un asterisco son empleadas o mencionadas en este libro, pueden consultarse en
el ap>ndice al e3ecto al 3inal del mismo!
ED;H,6,I8,2:6, 6E ",H,";EHE8
,E ,2 Lersin Dombre original ;raduccin
-- -- ------- ------------------------------------------------------------------------------------------------------------
01 -- 6F8 1* - HE,6 "E,H,";EH 1HFA 8;,D6,H6 :D9C;, U:;E E"EF !!!!!!!!!! 2EEH ",H,";EH 6E 2, ED;H,6,
E8;,D6,H, "FD :A9HE8:FD
S0+ -- 6F8 1* - UH:;E "E,H,";EH ;F 8;,D6,H6 FC;9C; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! E8"H:5:H ",H,";EH ED 2,
8,2:6, E8;,D6,H
0% -- 6F8 1* - HE,6 "E,H,";EH 1HFA 8;6,CM !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2EEH ",H,";EH 6E2 9CEH;F
8EH:E
04 -- 6F8 1* - UH:;E "E,H,";EH ;F 8;6,CM !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! E8"H:5:H ",H,";EH ED E2 9CEH;F
8EH:E
0& -- 6F8 1* - UH:;E "E,H,";EH ;F 9H:D;EH !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! E8"H:5:H ",H,";EH ED 2,
:A9HE8FH,
0/ -- 6F8 1* - 6:HE"; "FD8F2E FC;9C; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 8,2:6, 6:HE";, , "FD8F2,
0/ -- 6F8 1* - 6:HE"; "FD8F2E :D9C; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ED;H,6, 6:HE";, 9FH "FD8F2,
0' -- 6F8 1* - 6:HE"; "E,H,";EH :D9C;, U:;EFC; E"EF !!!!!!!!!!!!!!!!!!!!!!!!!!!! 2E";CH, 6:HE";, 6E ",H,";EH,
8:D :A9HE8:FD
0. -- 6F8 1* - "E,H,";EH :D9C; U:;EFC; E"EF !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2E";CH, 6E ",H,";EHE8, 8:D
:A9HE8:FD
S09 -- 6F8 1* - UH:;E 8;H:DB ;F 8;,D6,H6 FC;9C; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! E8"H:5:H ",6ED, ED 2, 8,2:6,
E8;,D6,H
S0, -- 6F8 1* - 5C11EHE6 :D9C; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ED;H,6, 6E86E ;E"2,6F 9FH 5C11EH
05 -- 6F8 1* - BE; 8;6:D 8;,;C8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! F5;EDEH E8;,6F 6E 2, ED;H,6, E8;,D6,H
0" -- 6F8 1* - 12C8E 5C11EH ,D6 HE,6 8;,D6,H6 :D9C; !!!!!!!!!!!!!!!!!!!!!!!!!! 2:A9:,H 5C11EH ? 2EEH 6E 2,
ED;H,6, E8;,D6,H
BE8;:FD 6E 1:"EEHF8
01 -- 6F8 1* - F9ED 1:2E C8:DB 1"5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ,9EH;CH, 6E 1:"EEHF EA92E,D6F 1"5
10 -- 6F8 1* - "2F8E 1:2E C8:DB 1"5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "EHH,H 1:"EEHF EA92E,D6F 1"5
11 -- 6F8 1* - 1:D6 1:H8; A,;"E:DB 1:2E C8:DB 1"5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 5C8",H 9H:AEH 1:"EEHF
EA92E,D6F 1"5
1+ -- 6F8 1* - 1:D6 DEM; A,;"E:DB 1:2E C8:DB 1"5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 5C8",H 9HFM:AF 1:"EEHF
EA92E,D6F 1"5
1% -- 6F8 1* - 6E2E;E 1:2E C8:DB 1"5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 5FHH,H 1:"EEHF EA92E,D6F 1"5
1/ -- 6F8 1* - "HE,;E FH ;HCD",;E 1:2E C8:DB 1"5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "HE,HI;HCD",H 1:"EEHF
EA92E,D6F 1"5
1' -- 6F8 1* - HED,AE 1:2E C8:DB 1"5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! HEDFA5H,H 1:"EEHF EA92E,D6F 1"5
+% -- 6F8 1* - BE; 1:2E 8:RE 1FH 1"5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! F5;EDEH ;,A,oF 6E 1:"EEHF EA92E,D6F
1"5
+9 -- 6F8 1* - 9,H8E 1:2ED,AE :D;F 1"5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! EM9,D6:H E2 DFA5HE 6E2 1:"EEHF
EA92E,D6F 1"5
S%" -- 6F8 +* - V"HE,;V - "HE,;E FH ;HCD",;E 1:2E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "HE,HI;HCD",H 1:"EEHF
EA92E,D6F E,D62E
S%6 -- 6F8 +* - VF9EDV - F9ED EM:8;:DB 1:2E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ,5H:H 1:"EEHF EM:8;ED;E EA92E,D6F
E,D62E
S%E -- 6F8 +* - V"2F8EV - "2F8E 1:2E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "EHH,H 1:"EEHF EM:8;ED;E EA92E,D6F
E,D62E
41 -- 6F8 +* - VCD2:D@V - 6E2E;E 1:2E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 5FHH,H 1:"EEHF EA92E,D6F E,D62E
4% 00 6F8 +* - BE; 1:2E ,;;H:5C;E8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! F5;EDEH ,;H:5C;F8 6E2 1:"EEHF EA92E,D6F
E,D62E
4% 01 6F8 +* - V"EAF6V - 8E; 1:2E ,;;H:5C;E8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!! AF6:1:",H ,;H:5C;F8 6E2 1:"EEHF
EA92E,D6F E,D62E
4& -- 6F8 +* - V6C9V - 6C92:",;E 1:2E E,D62E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 6C92:",H E2 E,D62E
4/ -- 6F8 +* - V6C9+V, V1FH"E6C9V - 1FH"E 6C92:",;E 1:2E E,D62E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! HE6:HE"":FD,H E2
E,D62E
4E -- 6F8 +* - V1:D61:H8;V - 1:D6 1:H8; A,;"E:DB 1:2E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 5C8",H 9H:AEH 1:"EEHF
EA92E,D6F E,D62E
41 -- 6F8 +* - V1:D6DEM;V - 1:D6 DEM; A,;"E:DB 1:2E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 5C8",H 9HFM:AF 1:"EEHF
EA92E,D6F E,D62E
&/ -- 6F8 +* - VHED,AEV - HED,AE 1:2E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! HEDFA5H,H 1:"EEHF EA92E,D6F
E,D62E
&' 00 6F8 +* - BE; 1:2EY8 6,;E ,D6 ;:AE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! F5;EDEH 1E"E, ? EFH, 6E2 1:"EEHF
EA92E,D6F E,D62E
&' 01 6F8 +* - 8E; 1:2EY8 6,;E ,D6 ;:AE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! E8;,52E"EH 1E"E, ? EFH, 6E2 1:"EEHF
EA92E,D6F E,D62E
&, -- 6F8 %* - "HE,;E ;EA9FH,H? 1:2E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "HE,H 1:"EEHF ;EA9FH,2 EA92E,D6F
E,D62E
&5 -- 6F8 %* - "HE,;E DEU 1:2E !!!!!!!!!!!!!!!!!!!!!!!!!!!!! "HE,H DCELF 1:"EEHF 8:D A,"E,",H2F 8: EM:8;:,
EA92E,D6F E,D62E
/' -- 6F8 %!%* - 8E; E,D62E "FCD; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! E8;,52E"EH A,M:AF DCAEHF 6E E,D62E8 9,H, 2,
;,HE, ED "CH8F
/. -- 6F8 %!%* - V112C8EV - "FAA:; 1:2E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! LF2",H 5C11EH8 :D;EHDF8 , 6:8"F

F9EH,":FDE8 8F5HE 1:"EEHF8
14 -- 6F8 1* - 8ETCED;:,2 HE,6 1HFA 1"5 1:2E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2E";CH, 8E"CED":,2 6E 1:"EEHF
EA92E,D6F 1"5
1& -- 6F8 1* - 8ETCED;:,2 UH:;E ;F 1"5 1:2E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! E8"H:;CH, 8E"CED":,2 ED 1:"EEHF
EA92E,D6F 1"5
S1, -- 6F8 1* - 8E; 6:8@ ;H,D81EH ,HE, ,66HE88 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! E8;,52E"EH E2 ,HE, 6E
;H,D81EHED":, , 6:8"F
+1 -- 6F8 1* - HE,6 H,D6FA HE"FH6 1HFA 1"5 1:2E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2E";CH, ,2E,;FH:, 6E HEB:8;HF
EA92E,D6F 1"5
++ -- 6F8 1* - UH:;E H,D6FA HE"FH6 ;F 1"5 1:2E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! E8"H:;CH, ,2E,;FH:, 6E HEB:8;HF
EA92E,D6F 1"5
+4 -- 6F8 1* - 8E; H,D6FA HE"FH6 DCA5EH 1FH 1"5 !!!!!!!!!!!!!!!!!!!!!!!!! 9,8,H 6E EI8 8E"CED":,2 ,
,2E,;FH:, EA92E,D6F 1"5
+' -- 6F8 1* - H,D6FA 52F"@ HE,6 1HFA 1"5 1:2E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2E";CH, ,2E,;FH:, 6E 52FTCE
EA92E,D6F 1"5
+. -- 6F8 1* - H,D6FA 52F"@ UH:;E ;F 1"5 1:2E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! E8"H:;CH, ,2E,;FH:, 6E 52FTCE
EA92E,D6F 1"5
S+1 -- 6F8 +* - BE; 6:8@ ;H,D81EH ,HE, ,66HE88 !!!!!!!!!!!!!!!!!!!!!! F5;EDEH 2, 6:HE"":FD 6E2 ,HE, 6E
;H,D81EHED":, , 6:8"F
S%1 -- 6F8 +* - VHE,6V - HE,6 1HFA 1:2E FH 6EL:"E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2EEH 6E CD 1:"EEHF EA92E,D6F
E,D62E
S40 -- 6F8 +* - VUH:;EV - UH:;E ;F 1:2E FH 6EL:"E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! E8"H:5:H ED CD 1:"EEHF EA92E,D6F
E,D62E
4+ -- 6F8 +* - V28EE@V - 8E; "CHHED; 1:2E 9F8:;:FD !!!!!!!!!!!!!!! AFLEH E2 9CD;EHF HE2,;:LF ED E2 1:"EEHF
EA92E,D6F E,D62E
&" -- 6F8 %* - V12F"@V - HE"FH6 2F"@:DB !!!!!!!!!!!!!!!!!!!!!!!!! 52FTCE,HI6E852FTCEH CD, RFD, 6E2 1:"EEHF
EA92E,D6F E,D62E
F9EH,":FDE8 "FD 6:HE";FH:F8
%9 -- 6F8 +* - VA@6:HV - "HE,;E 8C56:HE";FH? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "HE,H 8C56:HE";FH:F
%, -- 6F8 +* - VHA6:HV - HEAFLE 8C56:HE";FH? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 5FHH,H 8C56:HE";FH:F
%5 -- 6F8 +* - V"E6:HV - 8E; "CHHED; 6:HE";FH? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",A5:,H E2 6:HE";FH:F ,";:LF
4' -- 6F8 +* - V"U6V - BE; "CHHED; 6:HE";FH? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! F5;EDEH E2 6:HE";FH:F
,";C,2

A,DE[F 6E 6:8"F
06 -- 6F8 1* - 6:8@ HE8E; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! HE:D:":,2:R,H E2 6:8"F
0E -- 6F8 1* - 8E2E"; 6E1,C2; 6H:LE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! E8;,52E"EH CD:6,6 9FH 6E1E";F
19 -- 6F8 1* - BE; "CHHED; 6E1,C2; 6H:LE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! F5;EDEH 2, CD:6,6 ,";C,2 9FH
6E1E";F
15 -- 6F8 1* - BE; ,22F",;:FD :D1FHA,;:FD 1FH 6E1,C2; 6H:LE !!!!!!!! F5;EDEH :D1FHA,":FD 6E E89,":F
ED E2 6:8"F 9FH 6E1E";F
1" -- 6F8 1* - BE; ,22F",;:FD :D1FHA,;:FD 1FH 89E":1:" 6H:LE !!!!!!!!!! F5;EDEH :D1FHA,":FD 6E
E89,":F ED E2 6:8"F :D6:",6F
+E -- 6F8 1* - 8E; LEH:1? 12,B !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! E8;,52E"EH E2 5,D6EH:D 6E LEH:1:",":FD
S%/ -- 6F8 +* - BE; 1HEE 6:8@ 89,"E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! F5;EDEH E2 E89,":F 2:5HE ED 6:8"F
&4 -- 6F8 +* - BE; LEH:1? 12,B !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! F5;EDEH E2 5,D6EH:D 6E LEH:1:",":FD

"FD;HF2 6E 9HF"E8F8
00 -- 6F8 1* - ;EHA:D,;E 9HFBH,A !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;EHA:D,H 9HFBH,A,
+/ -- 6F8 1* - "HE,;E DEU 9HFBH,A 8EBAED; 9HE1:M !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "HE,H 989
S%1 -- 6F8 +* - ;EHA:D,;E ,D6 8;,? HE8:6ED; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;EHA:D,H ? 9EHA,DE"EH
HE8:6ED;E
S45 -- 6F8 +* - VEME"V - 2F,6 ,D6IFH EME"C;E 9HFBH,A !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ",HB,H ?IF E[E"C;,H
9HFBH,A,
S4" -- 6F8 +* - VEM:;V - ;EHA:D,;E U:;E HE;CHD "F6E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;EHA:D,H 9HFBH,A, "FD "F6:BF
6E HE;FHDF
46 -- 6F8 +* - BE; HE;CHD "F6E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! F5;EDEH "F6:BF 6E HE;FHDF
S&0 -- 6F8 +* internal - 8E; "CHHED; 9HF"E88 :6 (8E; 989 ,66HE88) !!!!!!!!!!!!!!!!!!!!!! E8;,52E"EH 6:HE"":FD
6E2 989 ,";C,2
S&1 -- 6F8 +* internal - BE; "CHHED; 9HF"E88 :6 (BE; 989 ,66HE88) !!!!!!!!!!!!!!!!!!!!!!!!! F5;EDEH 6:HE"":FD 6E2
989 ,";C,2
S/+ -- 6F8 %* - BE; "CHHED; 989 ,66HE88 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! F5;EDEH 6:HE"":FD 6E2 989
,";C,2

BE8;:FD 6E AEAFH:,
S4. -- 6F8 +* - ,22F",;E AEAFH? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ,8:BD,H AEAFH:,
S49 -- 6F8 +* - 1HEE AEAFH? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2:5EH,H AEAFH:,
S4, -- 6F8 +* - HE8:RE AEAFH? 52F"@ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! AF6:1:",H E2 ;,A,oF 6E CD 52FTCE 6E
AEAFH:, ,8:BD,6,
S&. -- 6F8 %* - BE; FH 8E; AEAFH? ,22F",;:FD 8;H,;EB? !!!!!!!!!!!! F5;EDEHIE8;,52E"EH 2, E8;H,;EB:,
6E ,8:BD,":FD 6E AEAFH:,
S&. -- 6F8 &!0 - BE; FH 8E; CA5 2:D@ 8;,;E !!!!!!!!!!!!!!!!! F5;EDEHIE8;,52E"EH E2 E8;,6F 6E "FDEM:FD 6E 2,
AEAFH:, 8C9EH:FH

"FD;HF2 6E 1E"E, ? EFH,
S+, -- 6F8 1* - BE; 8?8;EA 6,;E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! F5;EDEH 2, 1E"E, 6E2 8:8;EA,
+5 -- 6F8 1* - 8E; 8?8;EA 6,;E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! E8;,52E"EH 2, 1E"E, 6E2 8:8;EA,
S+" -- 6F8 1* - BE; 8?8;EA ;:AE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! F5;EDEH 2, EFH, 6E2 8:8;EA,
+6 -- 6F8 1* - 8E; 8?8;EA ;:AE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! E8;,52E"EH 2, EFH, 6E2 8:8;EA,

1CD":FDE8 A:8"E2,DE,8
1. -- 6F8 1* - DC22 1CD";:FD 1FH "9IA "FA9,;:5:2:;? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 1CD":FD DC2, 9,H,
"FA9,;:5:2:6,6 "9IA
16 -- 6F8 1* - DC22 1CD";:FD 1FH "9IA "FA9,;:5:2:;? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 1CD":FD DC2, 9,H,
"FA9,;:5:2:6,6 "9IA
1E -- 6F8 1* - DC22 1CD";:FD 1FH "9IA "FA9,;:5:2:;? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 1CD":FD DC2, 9,H,
"FA9,;:5:2:6,6 "9IA
11 -- 6F8 1* - BE; 6H:LE 9,H,AE;EH 52F"@ 1FH 6E1,C2; 6H:LE !!!!!!!!!!!!!!!!!!!!!!!! F5;EDEH E2 695 6E 2,
CD:6,6 9FH 6E1E";F
+0 -- 6F8 1* - DC22 1CD";:FD 1FH "9IA "FA9,;:5:2:;? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 1CD":FD DC2, 9,H,
"FA9,;:5:2:6,6 "9IA
S+& -- 6F8 1* - 8E; :D;EHHC9; LE";FH !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! E8;,52E"EH LE";FH 6E :D;EHHC9":FD
S%0 -- 6F8 +* - BE; 6F8 LEH8:FD !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! F5;EDEH LEH8:FD 6E2 6F8
%+ -- 6F8 +* - BE; 6F8 6H:LE 9,H,AE;EH 52F"@ 1FH 89E":1:" 6H:LE !!!!!!!!!!!!!!!!!!!!!! F5;EDEH E2 695 6E 2,
CD:6,6 :D6:",6,
%% -- 6F8 +* - EM;ED6E6 5HE,@ "EE"@:DB !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "FD;HF2,H E2 D:LE2 6E 6E;E"":FD 6E
";H2-5HE,@
%% 0+ 6F8 %!)* internal - BE; ,D6 8E; EM;ED6E6 "FD;HF2-5HE,@ "EE"@:DB 8;,;E !!!! :D6:",HIF5;EDEH
D:LE2 6E;E"":FD ";H2-5HE,@
%% 0& 6F8 4* - BE; 5FF; 6H:LE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 6E;EHA:D,H CD:6,6 6E ,HH,DTCE
%% 0/ 6F8 &!0 - BE; ;HCE LEH8:FD DCA5EH !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! F5;EDEH LEH8:FD HE,2 6E2 6F8
S%4 -- 6F8 +* - BE; ,66HE88 F1 :D6F8 12,B !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! F5;EDEH 2, 6:HE"":FD 6E :D6F8
S%& -- 6F8 +* - BE; :D;EHHC9; LE";FH !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! F5;EDEH 2, 6:HE"":FD 6E CD LE";FH 6E
:D;EHHC9":FD
%' 00 6F8 +* - V8U:;"E,HV - BE; 8U:;"E "E,H,";EH !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! F5;EDEH E2 ",H,";EH :D6:",6FH
6E 9,H,AE;HF8
%' 01 6F8 +* - V8U:;"E,HV - 8E; 8U:;"E "E,H,";EH !!!!!!!!!!!!!!!!!!!!!!!!!!! E8;,52E"EH E2 ",H,";EH :D6:",6FH
6E 9,H,AE;HF8
%' -- 6F8 +!) and %!%* onl - V,L,:26ELV - 89E":1? m6ELm 9HE1:M C8E !!!!!!!!!!!!!!!!!!!! "FD;HF2,H E2 C8F 6E2
9HE1:[F m6ELm
S%. -- 6F8 +* - BE; "FCD;H?-89E":1:" :D1FHA,;:FD !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! F5;EDEH :D1FHA,":FD HE2,;:L,
,2 9,:8
%. -- 6F8 %* - 8E; "FCD;H? "F6E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! E8;,52E"EH E2 "F6:BF 6E2 9,:8
44 00 6F8 +* - :F";2 - BE; 6EL:"E :D1FHA,;:FD !!!!!!!!!!!!!!!!!!!!!!!!!!!! "FD;HF2 EI8$ F5;EDEH :D1FHA,":FD 6E2
6:89F8:;:LF
44 01 6F8 +* - :F";2 - 8E; 6EL:"E :D1FHA,;:FD !!!!!!!!!!!!!!!!!!!!!!!!! "FD;HF2 EI8$ E8;,52E"EH :D1FHA,":FD
6E2 6:89F8:;:LF
44 0+ 6F8 +* - :F";2 - HE,6 1HFA "E,H,";EH 6EL:"E "FD;HF2 "E,DDE2 !!!!!!!!! "FD;HF2 EI8$ 2EEH 6E
",D,2 "FD;HF2 6:89! ",H,"!
44 0% 6F8 +* - :F";2 - UH:;E ;F "E,H,";EH 6EL:"E "FD;HF2 "E,DDE2 !!!!!! "FD;HF2 EI8$ E8"H:5:H ED
",D,2 "FD;HF2 6:89! ",H,"!
44 04 6F8 +* - :F";2 - HE,6 1HFA 52F"@ 6EL:"E "FD;HF2 "E,DDE2 !!!!!!!!!!!!! "FD;HF2 EI8$ 2EEH 6E ",D,2
"FD;HF2 6:89! 52FTCE
44 0& 6F8 +* - :F";2 - UH:;E ;F 52F"@ 6EL:"E "FD;HF2 "E,DDE2 !!!!!!!!!! "FD;HF2 EI8$ E8"H:5:H ED ",D,2
"FD;HF2 6:89! 52FTCE
44 0/ 6F8 +* - :F";2 - BE; :D9C; 8;,;C8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "FD;HF2 EI8$ F5;EDEH E8;,6F 6E 2,
ED;H,6,
44 0' 6F8 +* - :F";2 - BE; FC;9C; 8;,;C8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "FD;HF2 EI8$ F5;EDEH E8;,6F 6E 2,
8,2:6,
44 0. 6F8 %!0* - :F";2 - "EE"@ :1 52F"@ 6EL:"E HEAFL,52E !!!!!!!! "FD;HF2 EI8$ "FA9HF5,H 8: E2 6:89! 6E
52FTCE E8 HEAFL:52E
44 09 6F8 %!1* - :F";2 - "EE"@ :1 52F"@ 6EL:"E HEAF;E !!!!!!!!!!!!!! "FD;HF2 EI8$ "FA9HF5,H 8: E2 6:89! 6E
52FTCE E8 HEAF;F
44 0, 6F8 %!1* - :F";2 - "EE"@ :1 E,D62E :8 HEAF;E !!!!!!!!!!!!!!!!!!!!!!!!!! "FD;HF2 EI8$ "FA9HF5,H 8: CD
E,D62E E8 HEAF;F
44 05 6F8 %!1* - :F";2 - 8E; 8E,H:DB HE;H? "FCD; !!!!!!!! "FD;HF2 EI8$ 6E1:D:H DCAEHF 6E HE:D;ED;F8 ED
AF6F 6E "FA9,H;:":FD
44 0" 6F8 %!+* - :F";2 - BEDEH:" "E,H,";EH 6EL:"E HETCE8; !!!!!!!!!!!!! "FD;HF2 EI8 BEDEH,2 9,H,
6:89F8:;:LF8 6E ",H,";EHE8
44 06 6F8 %!+* - :F";2 - BEDEH:" 52F"@ 6EL:"E HETCE8; !!!!!!!!!!!!!!!!!!!!! "FD;HF2 EI8 BEDEH,2 9,H,
6:89F8:;:LF8 6E 52FTCE
44 0E 6F8 %!+* - :F";2 - BE; 2FB:",2 6H:LE A,9 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! F5;EDEH ,8:BD,":FD 6E CD:6,6E8
2FB:",8
44 01 6F8 %!+* - :F";2 - 8E; 2FB:",2 6H:LE A,9 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 6E1:D:H ,8:BD,":FD 6E CD:6,6E8
2FB:",8
S&+ -- C` 6F8 +* internal - V8?8L,H8V - BE; 2:8; F1 2:8;8 !!!!!!!!!!!!!!!!!!!!! F5;EDEH E2 2:8;,6F 6E 2,8 2:8;,8 6E2
8:8;EA,
&% -- 6F8 +* internal - ;H,D82,;E 5:F8 9,H,AE;EH 52F"@ ;F 6H:LE 9,H,A 52F"@ !!!!!!!!!!!!!!!!!!!!!!!!!!!! ;H,6C":H
595 , 695
&& -- 6F8 +* internal - "HE,;E "E:26 989 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "HE,H 989 E:[F
S&9 -- 6F8 %* - BE; EM;ED6E6 EHHFH :D1FHA,;:FD !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! F5;EDEH :D1FHA,":FD EM;ED6:6,
6E EHHFHE8
S&6 0/ C` 6F8 %!0* internal - BE; ,66HE88 F1 6F8 8U,99,52E 6,;, ,HE, !!!!! F5;EDEH 6:HE"":FD 6E2 ,HE,
:D;EH",A5:,52E 6E2 6F8
S&6 0, 6F8 %!1* - 8E; EM;ED6E6 EHHFH :D1FHA,;:FD !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! E8;,52E"EH :D1FHA,":FD
EM;ED6:6, 6E EHHFHE8
S&6 05 C` 6F8 4!) onl internal - BE; 6F8 8U,99,52E 6,;, ,HE,8 !!!!!!!!!!!!!!!!!!!!!!! F5;EDEH ,HE,8
:D;EH",A5:,52E8 6E2 6F8
/0 -- 6F8 %!0* - ",DFD:",2:RE 1:2ED,AE FH 9,;E !!!!!!!! EM9,D6:H DFA5HE 6E 1:"EEHF , E89E":1:",":FD
"FA92E;, 6E 6:HE";FH:F8
/1 -- 6F8 %* - CDC8E6 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!DF C8,6, ,CD
/4 -- 6F8 %!+* internal - 8E; 6EL:"E 6H:LEH 2FF@,EE,6 12,B !!!!!!! E8;,52E"EH 5,D6EH:D 6E 2E";CH,
,6E2,D;,6, 6E 6:89F8:;:LF
/& -- 6F8 %!%* - BE; EM;ED6E6 "FCD;H? :D1FHA,;:FD !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! F5;EDEH :D1FHA,":FD
EM;ED6:6, 6E2 9,:8
/& +% C` 6F8 4* internal - 6E;EHA:DE :1 "E,H,";EH HE9HE8ED;8 ?E8IDF HE89FD8E !!!!!!! 6E;EHA:D,H 8:
CD, 2E;H, :D6:", 8: F DF
/& -- C` 6F8 4* internal - "FCD;H?-6E9ED6ED; 1:2ED,AE ",9:;,2:R,;:FD !!!!!!! A,?C8"C2:R,":FD 6E
DFA5HE 6E9ED6:ED;E 6E2 9,:8
// 01 6F8 %!%* - BE; B2F5,2 "F6E 9,BE ;,52E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! F5;EDEH 2, 9,B:D, 6E "F6:BF8
B2F5,2
// 0+ 6F8 %!%* - 8E; B2F5,2 "F6E 9,BE ;,52E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! E8;,52E"EH 2, 9,B:D, 6E "F6:BF8
B2F5,2
/9 -- C` 6F8 4* internal - BE;I8E; 6:8@ 8EH:,2 DCA5EH !!!!!!!!!!!!!!!!!!! F5;EDEHIE8;,52E"EH E2 DCAEHF 6E
8EH:E 6E CD 6:8"F
/5 -- C` 6F8 &!0 - DC22 1CD";:FD !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 1CD":FD DC2,
/" 00 6F8 4* - EM;ED6E6 F9EDI"HE,;E !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ,9EH;CH,I"HE,":FD 6E 1:"EEHF8 EM;ED6:6,
EA92E,D6F E,D62E
Captulo 5II: AR4UITECTURA DEL $C, AT Y $SB! BA@O DOS
2.1. - LAS INTERRU$CIONES
8on seGales en#iadas a la "9C para que termine la e7ecucin de la instruccin en curso atienda una peticin
determinada, continuando m-s tarde con lo que estaba haciendo!
"ada interrupcin lle#a asociado un n0mero que identi3ica el tipo de ser#icio a realizar! , partir de dicho n0mero se
calcula la direccin de la rutina que lo atiende cuando se retorna se contin0a con la instruccin siguiente a la que se estaba
e7ecutando cuando se produ7o la interrupcin! 2a 3orma de calcular la direccin de la rutina es multiplicar por cuatro el #alor
de la interrupcin para obtener un desplazamiento , sobre el segmento 0, con dicho desplazamiento, se leen dos palabras$
la primera es el desplazamiento la segunda el segmento de la rutina deseada! 9or tanto, en el primer Pilobte de memoria
3sica del sistema, e)iste espacio su3iciente para los +&/ #ectores de interrupcin disponibles!
Ea tres tipos b-sicos de interrupciones$
It)88up'-o)+ -t)8a+ o ),')p'-o)+: 2as genera la propia "9C cuando se produce una situacin anormal o
cuando llega el caso! 9or desgracia, :5A se salt olmpicamente la especi3icacin de :ntel que reser#a las interrupciones 0-
%1 para el procesador!
o :D; 0$ error de di#isin, generada autom-ticamente cuando el cociente no cabe en el registro o el di#isor es
cero! 8lo puede ser generada mediante 6:L o :6:L! Ea una sutil di3erencia de comportamiento ante esta interrupcin
seg0n el tipo de procesador$ el .0..I.0./ los DE" L+0 L%0 almacenan en la pila, como cabra esperar, la direccin de la
instruccin que sigue a la que caus la e)cepcin! 8in embargo, el +./ superiores almacenan la direccin del 6:L o :6:L
que causa la e)cepcin!
o :D; 1$ paso a paso, se produce tras cada instruccin cuando el procesador est- en modo traza (utilizada en
depuracin de programas)!
o :D; +$ interrupcin no enmascarable, tiene prioridad absoluta se produce incluso aunque est>n inhibidas
las interrupciones (con "2:) para indicar un hecho mu urgente (3allo en la alimentacin o error de paridad en la memoria)!
o :D; %$ utilizada para poner puntos de ruptura en la depuracin de programas, debido a que es una
instruccin de un solo bte mu cmoda de utilizar!
o :D; 4$ desbordamiento, se dispara cuando se e7ecuta un :D;F haba desbordamiento!
o :D; &$ rango e)cedido en la instruccin 5FCD6 (slo +./ superiores)! Ea sido incorrectamente empleada
por :5A para #olcar la pantalla por impresora!
o :D; /$ cdigo de operacin in#-lido (slo a partir del +./)! 8e produce al e7ecutar una instruccin inde3inida,
en la pila se almacena el "8$:9 de la instruccin ilegal!
o :D; '$ dispositi#o no disponible (slo a partir del +./)!
It)88up'-o)+ Na8*7a8): 8on las generadas por la circuitera del ordenador en respuesta a alg0n e#ento! 2as m-s
importantes son$
o :D; .$ 8e produce con una 3recuencia peridica determinada por el canal 0 del chip temporizador .+&%I.+&4
(en la pr-ctica, unas 1.,+ #eces por segundo)! "omo desde esta interrupcin se in#oca a su #ez a :D; 1"h -porque as lo
dispuso :5A-, es posible ligar un proceso a :D; 1"h para que se e7ecute peridicamente!
o :D; 9$ generada al pulsar o soltar una tecla!
o :D; 0,h, 05h, 0"h, 06h, 0Eh, 01h$ 9uertos serie, impresora controladores de disquete!
o :D; '0h, '1h, '+h, '%h, '4h, '&h, '/h, ''h$ Beneradas en los ,; m-quinas superiores por el segundo
chip controlador de interrupciones!
It)88up'-o)+ +o:t7a8): 9roducidas por el propio programa (instruccin :D;) para in#ocar ciertas subrutinas! 2a
5:F8 el 6F8 utilizan algunas interrupciones a las que se puede llamar con determinados #alores en los registros para que
realicen ciertos ser#icios! ;ambi>n e)iste alguna que otra interrupcin que se limita simplemente a apuntar a modo de
puntero a una tabla de datos!
2os #ectores de interrupcin pueden ser des#iados hacia un programa propio que, adem-s, podra quedar residente en
memoria! 8i se reprograma por completo una interrupcin >sta es de tipo hardKare, ha que realizar una serie de tareas
adicionales, como en#iar una seGal 3in de interrupcin hardKare al chip controlador de interrupciones! 8i se trata adem-s de
la interrupcin del teclado del 9" o M;, ha que en#iar una seGal de reconocimiento al mismo !!! en resumen$ con#iene
documentarse debidamente antes de intentar hacer nada! ;odos estos problemas se e#itan si la nue#a rutina que controla la
interrupcin llama al principio (o al 3inal) al anterior gestor de la misma, que es lo m-s normal, como se #er- m-s adelante!
9ara cambiar un #ector de interrupcin e)isten cuatro m>todos$
1! <El elegante=$ es adem-s el m-s cmodo compatible! 6e hecho, algunos programas de 6F8 3uncionan tambi>n
ba7o F8I+ si han sido diseGados con esta t>cnica! 5asta con llamar al ser#icio +&h del 6F8 (:D; +1h) decirle qu>
interrupcin ha que des#iar a dnde$
+! AFL ,E,+&h ; ser#icio para cambiar #ector
%! AFL ,2,#ector ; entre 0 +&&
4! 2E, 6M,rutina ; 68$6M nue#a rutina de gestin
&! :D; +1h ; llamar al 6F8
/! El <ps>=$ es menos seguro compatible (ning0n programa que emplea esta t>cnica corre en F8I+) consiste en
hacer casi lo que hace el 6F8 pero sin llamarle! Es adem-s mucho m-s incmodo largo, pero mu usado por
programadores despistados$
'! AFL 52,#ectorS4 ; #ector a cambiar en 52
.! AFL 5E,0 ; ahora en 5M
9! AFL ,M,0
10! 9C8E 68 ; preser#ar 68
11! AFL 68,,M ; apuntar al segmento 0000
1+! 2E, 6M,rutina ; "8$6M nue#a rutina de gestin
1%! "2: ; e#itar posible interrupcin
14! AFL W5MX,6M ; cambiar #ector (o33set)
1&! AFL W5M*+X,"8 ; cambiar #ector (segmento)
1/! 8;: ; permitir interrupciones
1'! 9F9 68 ; restaurar 68
1.! El <m>todo correcto= es similar al <ps>=, consiste en cambiar el #ector <de un tirn= (cambiar a la #ez segmento
o33set con un HE9 AFL8) con ob7eto de e#itar una posible interrupcin no enmascarable que se pueda producir en ese
momento crtico en que a se ha cambiado el o33set pero toda#a no el segmento ("2: no inhibe la interrupcin no
enmascarable)! Este sistema es toda#a algo m-s engorroso, pero es el me7or es el que utiliza el 6F8 en el m>todo (1)!
19! El <m>todo incorrecto= es mu usado por los malos programadores! Es similar al <ps>= slo que sin inhibir las
interrupciones mientras se cambia el #ector, con el riesgo de que se produzca una interrupcin cuando se ha cambiado
slo medio vector! 2os peores programadores lo emplean sobre todo para cambiar :D; . :D; 1"h, que se producen con
una cadencia de 1.,+ #eces por segundo!
2.!. - LA MEMORIA. LOS $UERTOS DE ENTRADA Y SALIDA.
6entro del megabte que puede direccionar un .0./, los primeros 10+4 btes est-n ocupados por la tabla de #ectores de
interrupcin! , continuacin e)isten +&/ btes de datos de la 5:F8 otros tantos para el 5,8:" el 6F8! 6e /00h a
91111h est- la memoria del usuario (casi /40 @b)! En ,0000h comienza el -rea de e)pansin de memoria de pantalla (EB,
LB,)! En 50000h comienzan otros /4 @b de los adaptadores de te)to A6, gr-3icos ("B,)! 6e "0000h a E1111h
aparecen las e)tensiones de la HFA (aGadidas por las tar7etas gr-3icas, discos duros, etc!) en 10000h suele estar
colocada la 5:F8 del sistema (a #eces tan slo . @b a partir de 1E000h)! 2os modernos sistemas operati#os (6H-6F8
A8-6F8 &!0 posteriores) permiten colocar H,A en huecos <#acos= por encima de los /40 @b en las m-quinas %./ (
alg0n +./ con cierto 7uego especial de chips)! Esta zona de memoria sir#e para cargar programas residentes! 6e hecho, el
propio sistema operati#o se sit0a (en +./ superiores) en los primeros /4 @b de la memoria e)tendida (EA,) que pueden
ser direccionados desde el 6F8, de7ando m-s memoria libre al usuario dentro de los primeros /40 @b! 9ara m-s
in3ormacin, puede consultarse el ap>ndice : el captulo .!
2os puertos de entrada salida (EI8) permiten a la "9C comunicarse con los peri3>ricos! 2os .0)./ utilizan los buses de
direcciones datos ordinarios para acceder a los peri3>ricos, pero habilitando una lnea que distinga el acceso a los mismos
de un acceso con#encional a la memoria (si no e)istieran los puertos de entrada salida, los peri3>ricos deberan interceptar
el acceso a la memoria estar colocados en alg0n -rea de la misma)! 9ara acceder a los puertos EI8 se emplean las
instrucciones :D FC;! L>ase el ap>ndice :L !
2.".- LA $ANTALLA EN MODO TEXTO.
"uando la pantalla est- en modo de te)to, si est- acti#o un adaptador de #deo monocromo, ocupa 4 @b a partir del
segmento 05000h! "on un adaptador de color, son 1/ @b a partir del segmento 05.00h! Cn m>todo para a#eriguar el tipo de
adaptador de #deo es consultar a la 5:F8 el modo de #deo acti#o$ ser- ' para un adaptador monocromo (tanto A6, como
la EB, LB, si el usuario las con3igura as) un #alor entre 0 4 para un adaptador de color! 2os modos 0 1 son de 40
columnas el + % de .0! 2os modos 0 + son de <color suprimido=, aunque en muchos monitores salen tambi>n en color
( no en tonos de gris)! "ada car-cter en la pantalla (empezando por arriba a la izquierda) ocupa dos btes consecuti#os$ en
el primero se almacena el cdigo ,8":: del car-cter a #isualizar en el segundo los atributos de color! Fb#iamente, en un
modo de .0)+& se utilizan 4000 btes (los 9/ restantes hasta los 409/ de los 4 @b se desprecian)! En los adaptadores de
color, como ha 1/ @b de memoria para te)to, se pueden de3inir entre 4 p#inas de te)to (.0 columnas) . (40 columnas)!
2a p-gina acti#a puede consultarse tambi>n llamando a la 5:F8, con ob7eto de conocer el segmento real donde empieza la
pantalla (5.00 m-s un cierto o33set)! En el 9',&h de los casos slo se emplea la p-gina 0, lo que no quiere decir que los
buenos programas deban asumirla como la 0nica posible! 2a 5:F8 utiliza la interrupcin 10h para comunicarse con el
sistema operati#o los programas de usuario!
El bte de atributos permite de3inir el color de 3ondo de los caracteres (0-') con los bits 4-/, el de la tinta (0-1&) con los
bits 0-% el parpadeo con el bit '! 2a 3uncin de este 0ltimo bit puede ser rede3inida para indicar el brillo de los caracteres de
3ondo (e)istiendo entonces tambi>n 1/ colores de 3ondo), aunque en "B, es preciso para ello un acceso directo al
hardKare! En el adaptador monocromo, para la tinta, el color 0 es el negro; el 1 es <subraado normal=, del 1 al ' son
colores <normales=; el . es negro, el 9 es <subraado brillante= del 10 al 1& son <brillantes=! 9ara el papel todos los
colores son negros menos el ' (blanco), no obstante para escribir en #deo in#erso es necesario no slo papel ' sino
adem-s tinta 0 (al menos, en los aut>nticos adaptadores monocromos)! El bit ' siempre pro#oca parpadeo en este
adaptador! En el adaptador de color no se pueden subraar caracteres con los cdigos de color (aunque s en la EB, LB,
empleando otros m>todos)! ;abla de colores$
0 -
Degro
4 - Ho7o . - Bris 1+ - Ho7o claro
1 - ,zul
& -
Aagenta
9 - ,zul claro 1% - Aagenta claro
+ -
Lerde
/ - Aarrn
10 - Lerde
claro
14 - ,marillo
% - "ian ' - 5lanco 11 - "ian claro
1& - 5lanco
brillante
"on#iene tener cuidado con la tinta azul (1 9) a que, en estos colores, los adaptadores monocromos subraan -lo que
puede ser un e3ecto indeseable-! "uando se llama al 6F8 para imprimir, >ste in#oca a su #ez a la 5:F8, por lo que la
escritura puede ser acelerada llamando directamente a este 0ltimo, que adem-s permite escribir en color! 6e todas
maneras, lo me7or en programas de calidad es escribir directamente sobre la memoria de pantalla para obtener una
#elocidad m-)ima, aunque con ciertas precauciones -para con#i#ir me7or con entornos pseudo-multitarea "B,Ys
con nieve-!
2as pantallas de 1%+ columnas no son est-ndar #aran de unas tar7etas gr-3icas a otras, por lo que no las trataremos!
2o que s se puede hacer -con cualquier EB, LB,- es llamar a la 5:F8 para que cargue el 7uego de caracteres .)., lo que
pro#oca un aumento del n0mero de lneas a 4% (EB,) o &0 (LB,), as como un lgico aumento de la memoria de #deo
requerida (que como siempre, empieza en 05.00h)!
En las #ariables de la 5:F8 (ap>ndice ::: ) los btes 49h-//h est-n destinados a controlar la pantalla; su consulta puede
ser interesante, como demostrar- este e7emplo$ el siguiente programa comprueba el tipo de pantalla, para determinar su
segmento, llamando a la 5:F8 (#>ase el ap>ndice de las 3unciones del 6F8 de la 5:F8)! 8i no es una pantalla de te)to
est-ndar no realiza nada; en caso contrario la recorre con#ierte todos sus caracteres a ma0sculas, sin alterar el color$
mas 8EBAED;
,88CAE "8$mas, 68$mas
FHB 100h ; programa !"FA ordinario
inicio$
AFL ,E,1& ; 3uncin para obtener modo de #deo
:D; 10h ; llamar a la 5:F8
AFL 5M,05000h ; segmento de pantalla monocroma
AFL "M,+000 ; tamaGo (caracteres) de la pantalla
"A9 ,2,' ; ces realmente modo monocromo]
[E datosZoP ; en e3ecto
AFL 5M,05.00h ; segmento de pantalla de color
"A9 ,2,% ; ces modo de te)to de .0 columnas]
[E pantZcolor ; en e3ecto
"A9 ,2,+ ; ces modo de te)to de .0 columnas]
[E pantZcolor ; en e3ecto
AFL "M,1000 ; tamaGo (caract!) pantalla 40 col!
"A9 ,2,1 ; ces modo te)to de 40 columnas]
[5E pantZcolor ; as es
AFL ,2,1 ; pantalla gr-3ica o desconocida$
[A9 3inal ; 3in de programa (errorle#el(1)
pantZcolor$ AFL ,M,40h ; considerar p-gina acti#a\`0
AFL 68,,M ; 68 ( 40h (#ariables de la 5:F8)
AFL ,M,68$W4EhX ; desplazamiento de la p-gina acti#a
8EH ,M,1 ; desplazamiento I +
8EH ,M,1 ; desplazamiento I 4
8EH ,M,1 ; desplazamiento I .
8EH ,M,1 ; desplazamiento I 1/ (p-rra3os)
,66 5M,,M ; segmento de #deo e3ecti#o
datosZoP$ AFL 68,5M ; 68 ( segmento de pantalla
MFH 5M,5M ; 5M ( 0 (primer car-cter)
otraZletra$ "A9 5?;E 9;H W5MX,YaY; ccdigo ,8":: menor que YaY]
[5 noZminuscula ; luego no puede ser min0scula
"A9 5?;E 9;H W5MX,YzY; ccdigo ,8":: maor de YzY]
[, noZminuscula ; luego no puede ser min0scula
,D6 5?;E 9;H W5MX,061h ; poner en ma0sculas
noZminuscula$ ,66 5M,+ ; apuntar siguiente car-cter
2FF9 otraZletra ; repetir con los "M caracteres
AFL ,2,0 ; 3in programa (errorle#el(0)
3inal$ AFL ,E,4"h
:D; +1h
mas ED68
ED6 inicio
2.# - LA $ANTALLA EN MODO 1RL?ICO.
'!4!1! - AF6F8 BHi1:"F8!
6ada la inmensidad de est-ndares gr-3icos e)istentes para los ordenadores compatibles, que sucedieron al primer
adaptador que slo soportaba te)to (A6,), que de hecho llenan #arias estanteras en las libreras, slo se tratar- de una
manera general el tema! 8e considerar-n los est-ndares m-s comunes, con algunos e7emplos de programacin de la
pantalla gr-3ica "B, con la 5:F8 programando la LB, directamente para obtener la #elocidad potencia del
ensamblador! 2as tar7etas gr-3icas tradicionales administran normalmente entre 1/ @b 1 Ab de memoria de #deo, en el
segmento 05.00h las "B,IE>rcules en 0,000h las LB,! En los modos de #deo que precisan m-s de /4 @b se recurre a
t>cnicas especiales, tales como planos de bits para los di3erentes colores, o bien di#idir la pantalla en pequeGos 3ragmentos
que se seleccionan en un puerto EI8! 2as tar7etas EB, posteriores #ienen acompaGadas de una e)tensin HFA
que parchea la 5:F8 normal del sistema para aGadir soporte al nue#o sistema de #deo! , continuacin se listan los
principales modos gr-3icos disponibles en A6,, "B,, EB, LB,, as como en las 8uperLB, 9aradise, ;rident Benoa!
Do se consideran las peculiaridades del 9"[r!
Aodo ;e)to Hesolucin "olores 8egmento ;ar7eta
---- ----- ---------- ------- -------- ---------------------
04h 40)+& %+0)+00 4 5.00 "B,, EB,, A"B,, LB,
0&h 40)+& %+0)+00 4 grises 5.00 "B,, EB,
0&h 40)+& %+0)+00 4 5.00 "B,, LB,
0/h .0)+& /40)+00 + 5.00 "B,, EB,, A"B,, LB,
06h 40)+& %+0)+00 1/ ,000 EB,, LB,
0Eh .0)+& /40)+00 1/ ,000 EB,, LB,
01h .0)+& /40)%&0 + ,000 EB,, LB,
10h .0)+& /40)%&0 4 ,000 EB, con /4@
10h .0)+& /40)%&0 1/ ,000 EB, con +&/@, LB,
11h .0)%0 /40)4.0 + ,000 LB,, A"B,
1+h .0)%0 /40)4.0 1/I+&/P ,000 LB,
1%h 40)+& %+0)+00 +&/I+&/P ,000 LB,, A"B,
+'h '+0)&1+ 1/ Benoa
+9h .00)/00 1/ ,000 Benoa
+6h /40)%&0 +&/I+&/P ,000 Benoa
+Eh /40)4.0 +&/I+&/P ,000 Benoa
+1h '+0)&1+ +&/ Benoa
%0h .00)/00 +&/I+&/P ,000 Benoa
%'h 10+4)'/. 1/ ,000 Benoa
&.h 100)'& .00)/00 1/I+&/P ,000 9aradise LB,
&9h 100)'& .00)/00 + ,000 9aradise LB,
&5h 100)'& .00)/00 1/I+&/P ,000 ;rident ;LB, ..00, .900
&5h /40)%&0 +&/ Benoa /400
&"h .0)+& /40)400 +&/ ,000 ;rident ;LB, ..00
&"h /40)4.0 +&/ Benoa /400
&6h .0)%0 /40)4.0 +&/ ,000 ;rident ;LB, ..00 (&1+@)
&Eh .0)+& /40)400 +&/ 9aradise LB,
&Eh .00)/00 +&/ ;rident .900
&Eh .00)/00 +&/ Benoa /400
&1h .0)%0 /40)4.0 +&/ 9aradise LB, (&1+@)
&1h 10+4)'/. 1/I+&/P ,000 ;rident ;LB, ..00 (&1+@)
&1h 10+4)'/. 1/ Benoa /400
/1h 9/)/4 '/.)10+4 1/I+&/P ,000 ;rident ;LB, ..00 (&1+@)
/+h 10+4)'/. +&/ ;rident ;LB, .900
/,h .00)/00 1/ Benoa /400
'"h &1+)&1+ 1/ Benoa
'6h &1+)&1+ +&/ Benoa
2as tar7etas gr-3icas son mu distintas entre s a ni#el de hardKare, por la manera en que gestionan la memoria de #deo!
2as tar7etas 8uperLB, complican a0n m-s el panorama! En general, un programa que desee apro#echar al m-)imo el
ordenador deber- apoarse en drivers o subprogramas espec3icos, uno para cada tar7eta de #deo del mercado! Esto es as
porque aunque la 5:F8 del sistema (o el de la tar7eta) soporta una serie de 3unciones est-ndar para traba7ar con gr-3icos,
e)isten bastantes problemas! En primer lugar, su ine3iciente diseGo lo hace e)tremadamente lento para casi cualquier
aplicacin seria! 5astara con que las 3unciones que implementa la 5:F8 (pintar leer puntos de la pantalla) 3ueran r-pidas,
Nslo esoO, para lo que tan slo hace 3alta una rutina espec3ica para cada modo de pantalla, que la 5:F8 debera habilitar
nada m-s cambiar de modo; casi todas las dem-s operaciones realizadas sobre la pantalla se apoan en esas dos ello no
requerira so3tKare adicional para mantener la compatibilidad entre tar7etas! 8in embargo, los programas comerciales no
tienen m-s remedio que incluir sus propias rutinas r-pidas para trazar puntos lneas en drivers apropiados ( de paso
aGaden alguna 3uncin m-s comple7a)! ,dem-s, por desgracia, no e)iste D: CD, 8F2, 3uncin o"icial en la 5:F8 que
in3orme a los programas que se e7ecutan de cosas tan elementales como los modos gr-3icos disponibles (con sus colores,
resolucin, etc!); esto no slo es problem-tico en las tar7etas gr-3icas$ la anarqua ausencia de 3unciones de in3ormacin
tambi>n se repite con los discos, el teclado, !!! aunque los programadores a estamos acostumbrados a realizar la labor del
detecti#e para a#eriguar la in3ormacin que los programas necesitan! 8in embargo, con los gr-3icos no podemos nos
#emos obligados a preguntar al usuario qu> tar7eta tiene, de cu-ntos colores resolucin, en qu> modo!!! lo que es peor$ la
ine)istencia de 3unciones de in3ormacin se agra#a con el hecho de que las LB, de los dem-s 3abricantes haan asignado
de cualquier manera los n0meros de modo! 6e esta manera, por e7emplo, una tar7eta 9aradise en el modo &1h tiene de
/40)400 puntos con +&/ colores, mientras que una ;rident tiene, en ese mismo modo, 10+4)'/. con 1/ colores! En lo 0nico
que coinciden todas las tar7etas es en los primeros modos de pantalla, de3inidos inicialmente por :5A! Auchas 8uperLB,
tienen 3unciones que in3orman de sus modos, colores resoluciones, lo que sucede es que en esto no se han podido poner
de acuerdo los 3abricantes la 3uncin de la 5:F8 de la LB, a la que ha que in#ocar para obtener in3ormacin, Ndi3iere de
unas tar7etas a otrasO! ,3ortunadamente, e)iste un est-ndar industrial en tar7etas 8uperLB,, el est-ndar LE8,, que aunque
ha llegado demasiado tarde, m0ltiples LB, lo soportan a las que no, se les puede aGadir soporte con un pequeGo dri#er
residente! Eablaremos de >l m-s tarde!
Do con#iene seguir adelante sin mencionar antes la tar7eta gr-3ica E>rcules! 8e trata de una tar7eta que apareci en el
mercado mu poco despu>s que la "B, de :5A, con el doble de resolucin manteniendo la calidad A6, en modo te)to!
Esta tar7eta no est- soportada por la 5:F8 (manu3acturada por :5A) los 3abricantes de 8uperLB, tampoco se han
molestado en soportarla por so3tKare, aunque s por hardKare! Est- mu e)tendida en las m-quinas antiguas, pero ho en
da no se utiliza su programacin obliga a acceder a los puertos de entrada salida de manera directa al m-s ba7o ni#el!
'!4!+!- 6E;E"":JD 6E 2, ;,H[E;, BHi1:", :D8;,2,6,!
El siguiente procedimiento es uno de tantos para e#aluar la tar7eta gr-3ica instalada en el ordenador! 6e#uel#e un #alor en
52 que es el mismo que retorna la :D; 10h al llamarla con ,M(1,00h (#er 3unciones de la 5:F8 en los ap>ndices)$ 0 1
para indicar que no ha gr-3icos; + si ha "B,; %, 4 & si e)iste una EB,; / si detecta una 9B,; ' u . si ha LB, o
superior 10, 11 1+ si e)iste A"B,! Hetorna +&& si la tar7eta es desconocida (mu raro)! 2a rutina 3unciona en todos los
ordenadores, con o sin tar7etas gr-3icas instaladas del tipo que sean!
tipoZtar7eta 9HF"
9C8E 68
AFL ,M,1,00h
:D; 10h ; solicitar in3ormacin LB, a la 5:F8
"A9 ,2,1,h ; 52 ( tipo de tar7eta
[E tar7etaZoP ; 3uncin soportada (ha LB,)
AFL ,M,40h
AFL 68,,M
AFL 52,10h
AFL ,E,1+h
:D; 10h ; solicitar in3ormacin EB, a la 5:F8
"A9 52,10h
[E noZega ; de momento, no es EB,
AFL 52,1 ; supuesto A6,
;E8; 5?;E 9;H 68$W.'hX,. ; estado del control de #deo
[DR tar7etaZoP ; es A6,
AFL 52,4 ; supuesto EB, color
FH 5E,5E
[R tar7etaZoP ; as es
:D" 52 ; es EB, mono
[A9 tar7etaZoP
noZega$ AFL 52,+ ; supuesto "B,
"A9 UFH6 9;H 68$W/%hX,%64h ; base del "H;
[E tar7etaZoP ; as es
6E" 52 ; es A6,
tar7etaZoP$ 9F9 68
HE;
tipoZtar7eta ED69
'!4!%! - :D;HF6C"":JD ,2 E8;iD6,H BHi1:"F LB,!
2a tar7eta LB, es el est-ndar actual en ordenadores personales, siendo el sistema de #deo mnimo que inclue la
m-quina m-s asequible! En este apartado estudiaremos la 3orma b-sica de programar sus modos gr-3icos, haciendo un
especial hincapi> en el tema menos claramente e)plicado por lo general$ el color! 8e ignorar-n por completo las tar7etas
"B, E>rcules, aunque s se indicar- qu> parte de lo e)puesto se puede aplicar tambi>n a la EB,! ;ampoco se
considerar- la A"B,, un hbrido entre EB, LB, que solo equipa a los 98I+-%0 de :5A, bastante incompatible adem-s
con la EB, la LB,!
2a LB, soporta todos los modos gr-3icos est-ndar de las tar7etas anteriores, resumidos en la 3igura '!4!%!1, si bien los
correspondientes a la "B, (%+0)+00 en 4 colores /40)+00 monocromo) son inser#ibles para pr-cticamente cualquier
aplicacin gr-3ica actual!
1:BCH, '!4!%!1$ AF6F8 BHi1:"F8 6E L:6EF
Aodo
(he))
Hesoluci
n
"olore
s
8egment
o
Frganizaci
n
,daptador
4 & %+0 ) +00 4 5.00 entrelazado "B,
/ /40 ) +00 + 5.00 entrelazado "B,
06h %+0 ) +00 1/ ,000
planos de
bit
EB,
0Eh /40 ) +00 1/ ,000
planos de
bit
EB,
01h /40 ) %&0 + ,000
planos de
bit
EB,
10h /40 ) %&0 4 ,000
planos de
bit
EB,
10h /40 ) %&0 1/ ,000
planos de
bit
EB,
(1+.@)
11h /40 ) 4.0 + ,000 lineal
LB,IA"B
,
1+h /40 ) 4.0 1/ ,000
planos de
bit
LB,
1%h %+0 ) +00 +&/ ,000 lineal
LB,IA"B
,
2a organizacin de la memoria (entrelazado, planos de bit o lineal) es la manera en que se direcciona la memoria de
#deo por parte de la "9C! 9or e7emplo, en el modo /, cada pi)el de la pantalla est- asociado a un bit (. pi)els por bte) a
partir de la direccin 5.00$0000; sin embargo, cuando se recorren .0 btes en la memoria (/40 bits o pi)els, primera
lneacompleta) no se pasa a la segunda lnea de la pantalla sino unas cuantas m-s aba7o, en una arquitectura relati#amente
comple7a debida a las limitaciones del hardKare de la "B,! Esto ha sido superado en las siguientes tar7etas, en las que las
lneas est-n consecuti#as de manera lgica en una organizacin lineal, si bien el lmite de /4 @b de memoria que puede
direccionar en un segmento el .0./ ha obligado al truco de los planos de bit! 9ara establecer el modo de #deo se puede
emplear una 3uncin del lengua7e de programacin que se trate o bien llamar directamente a la 5:F8, si no se desea
emplear la librera gr-3ica del compilador$ la 3uncin 0 (,E(0) de ser#icios de #deo de la 5:F8 (:D; 10h) establece el modo
de #deo solicitado en ,2! En ;urbo " sera, por e7emplo$
linclude \dos!h`
main()
p
struct HEB9,"@ r;
r!rZa)(0)001+; IS ,E ( 00, ,2(1+h SI
intr (0)10, jr); IS e7ecutar :D; 10h SI
q
'!4!%!1 - E2 E,H6U,HE 6E 2, LB,!
El chip LB, consta de #arios mdulos internos, que de3inen con7untos de registros direccionables en el espacio EI8 del
.0)./! En la EB, eran de slo escritura, aunque en la LB, pueden ser tanto escritos como ledos! 9or un lado est-
el +)'u)'-a*o8, encargado de la temporizacin necesaria para el acceso a la memoria de #deo! 9or otro lado tenemos
el 'ot8ola*o8 *) /8P:-'o+, encargado del tr-3ico de in3ormacin entre la "9C, la memoria de #deo el controlador de
atributos; consta de 9 registros cua programacin es necesaria para trazar puntos a gran #elocidad en los modos de 1/
colores! El 'ot8ola*o8 *) at8-<uto+gestiona la paleta de 1/ colores el color del borde! 9or 0ltimo, el DAC o D-/-tal to
Aalo/ Co;)8t)8 se encarga en la LB, (no dispone de >l la EB,) de gestionar los +/+!144 colores que se pueden
#isualizar en pantalla! 2a parte del len son los N'/. registrosO de / bits que almacenan la intensidad en las componentes
ro7a, #erde azul de cada color, de los +&/ que como mucho puede haber simult-neamente en la pantalla (+&/S%('/.)!
'!4!%!+ - E2 "F2FH!
2a "B, puede generar 1/ colores di3erentes, utilizando un solo bit por componente de color m-s un cuarto que indica la
intensidad! 8in embargo, la EB, emplea dos bits por cada una de las tres componentes de color, con lo que obtiene +
/
(/4
colores di3erentes! 9ara asociar estos /4 colores a los no m-s de 1/ que puede haber en un momento determinado en la
pantalla, se emplean los 1/ registros de paleta del controlador de atributos$ En cada uno de estos registros, de / bits
signi3icati#os, se de3inen los 1/ colores posibles! 2a 5:F8 de la EB, la LB, carga los registros de paleta adecuadamente
para emular los mismos colores de la "B,! ,s, por e7emplo, en los modos de te)to el color 0 es el negro el 1& el blanco
brillante, si bien se puede alterar esta asignacin! Cn cambio en un registro de paleta a3ecta instant-neamente a todo el -rea
de pantalla pintado de ese color! El #alor binario almacenado en los registros de paleta tiene el 3ormato ,,8/<R1B,
siendo 8/< los bits asociados a las componentes ro7a, #erde azul de ba7a intensidad, R1B sus homlogos en alta
intensidad! ,s, el #alor 010010b se corresponde con el #erde m-s brillante!
Mo*o+ *) 10 'olo8)+ ) 51A.
En la LB, el tema del color en los modos de pantalla de 1/ colores (tanto gr-3icos como de te)to) se complica algo m-s,
debido a la presencia del 6,"$ una matriz de +&/ elementos que constan cada uno de % registros de / bits! "ada uno de los
registros de paleta apunta a un elemento del 6,", que es quien realmente contiene el color; lo que sucede es que los
registros del 6," son programados por la 5:F8 para emular los /4 colores de la EB,! E)isten dos maneras di3erentes de
inde)ar en el 6," los registros de paleta, de manera que se puede di#idir el 6," en 1/ bloques de 1/ elementos o bien en
4 bloques de /4 elementos$ en un momento dado, slo uno de los bloques (denominado p-gina de color del 6,") est-
acti#o! Esto signi3ica que se pueden crear 1/ 4 subpaletas, pudi>ndose acti#ar una u otra libremente con una 3uncin de la
5:F8 de la LB,! 9or de3ecto, la 5:F8 establece 4 p-ginas de /4 elementos en el 6,", de manera que #alores en el rango
0-/% en los 1/ registros de paleta re3erencien a posiciones distintas en el 6," (al -rea 0-/%, al /4-1+', al 1+.-191 al 19+-
+&&)$ por de3ecto, la 5:F8 emplea los elementos 0!!/% del 6," que programa para emular los /4 colores de la EB,! 8in
embargo, puede resultar m-s interesante disponer de 1/ subpaletas de 1/ elementos para conseguir determinados e3ectos
gr-3icos$ en este caso no tiene sentido que los registros de paleta almacenen #alores 3uera del rango 0-1& (de hecho, solo se
consideran los 4 bits menos signi3icati#os de los mismos)! 2a 3igura '!4!%!+ e)presa gr-3icamente la manera en que se
genera el color! 8e pueden de3inir, por e7emplo, las 1/ subpaletas en tonos ascendentes de azul , cambiando la p-gina o
subpaleta acti#a a cierta #elocidad se puede hacer que la imagen se encienda apague rtmica sua#emente! 9or
supuesto, tambi>n se pueden obtener e3ectos similares alterando directamente los registros del 6,", aunque es mucho m-s
lento que conmutar entre #arias paletas a de3inidas! "on#iene resaltar que el color del borde de la pantalla se de3ine en la
EB, en la LB, en una especie de registro que sigue a los 1/ registros de paleta$ en la LB, no inter#iene el 6," en la
generacin del color del borde, del que solo e)isten por consiguiente /4 tonos (si bien el borde suele estar en color negro
su tamaGo reducido #ariable lo hace inser#ible para nada)!
2os pi)els en los modos gr-3icos de 1/ colores pueden parpadear, si bien es una t>cnica poco empleada$ para ello, basta
con cambiar un bit de un registro del controlador de atributos, aunque e)iste una 3uncin de la 5:F8 que realiza dicha tarea
(llamar a la :D; 10h con ,M(100%h 5M(1 para acti#ar el parpadeo -situacin por de3ecto en los modos de te)to- 5M(0
para desacti#arlo)!

El t8u'o *)l (oo.
2os monitores monocromos LB, solo admiten /4 tonos se limitan siempre a presentar la componente #erde del 6,"!
2o que sucede es que la 5:F8 a7usta la intensidad de la seGal #erde para emular la presencia de las otras dos! En concreto,
suma el %0h del #alor ro7o, el &9h del #erde el 11h del azul el resultado lo 3uerza al rango 0-/%, lo cual simula
apro)imadamente la intensidad que percibira el o7o humano con los colores reales! 8i se accediera directamente al
hardKare sin auda de la 5:F8, lo cual no es nuestro caso, este sera un aspecto a considerar! 9or 0ltimo, decir que en el
modo de 4 colores %&0 lneas, solo se emplean los registros de paleta 0, 1, 4 &, si bien lo normal aqu es esperar que
e)istan 1/ colores (caso de la LB,, o incluso de la EB, con 1+.@)!
Mo*o *) !&0 'olo8)+.
En el modo 1%h de %+0)+00 con +&/ colores, la generacin del color se aparta de lo estudiado hasta ahora para los
dem-s modos gr-3icos los de te)to, a que solo inter#iene el 6,"$ el bte de memoria de #deo asociado a cada punto de
la pantalla apunta directamente a un elemento del 6,"! 9or tanto, los registros de paleta del controlador de atributos no se
emplean en este modo, siendo m-s sencillo el proceso de generacin del color!
C.(o *):--8 la pal)ta = lo+ 8)/-+t8o+ *)l DAC.
, la hora de cambiar la paleta es con#eniente emplear 3unciones de la 5:F8 o del lengua7e de programacin, a que un
acceso directo al hardKare sin m-s precauciones puede pro#ocar inter3erencias con algunas tar7etas LB,! "on#iene
tambi>n emplear las 3unciones que cambian de una sola #ez un con7unto de registros del 6,", a que hacerlo uno por uno
es demasiado lento! Ftra #enta7a de emplear la 5:F8 es que >sta hace autom-ticamente las con#ersiones necesarias para
lograr la me7or #isualizacin posible en pantallas monocromas! En algunos casos, las paletas que de3ine por de3ecto la 5:F8
al establecer el modo de pantalla son apropiadas! 8in embargo, puede ser 0til cambiarlas para lograr un degradado atracti#o
en los modos de 1/ colores casi obligatorio en el modo de +&/ colores, dada la absurda paleta propuesta por la 5:F8!
9ara de3inir un color en el 6,", basta con un poco de imaginacin$ si las tres componentes est-n a cero, saldr- el negro; si
est-n a /% (#alor m-)imo) saldr- un blanco brillante; si se ponen la ro7a la azul en %+ la #erde en 0, saldr- un morado de
oscuridad mediana! 8e puede realizar un bucle llenar los primeros /4 elementos del 6," con #alores crecientes en una
componente de color, poniendo a 0 las dem-s$ de esa manera, se genera una paleta ptima para hacer degradados
(escalas de intensidad) de un color puro!
?I1URA 2.#.".":
ISSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
S E[EA92F 6E ",A5:F 6E 2, 9,2E;, 6E 1/ "F2FHE8 (EB,ILB,) 22,A,D6F ,2 S
S 5:F8 9,H, E2EB:H 2F8 "F2FHE8 6E8E,6F8, ED;HE 2F8 /4 9F8:52E8 6E 2, S
S EB, (9FH 6E1E";F EAC2,6F8 9FH E2 6," 6E 2, LB,)! S
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSI
linclude \dos!h`
linclude \graphics!h`
#oid main()
p
struct HEB9,"@ r;
int gdr#, gmodo, coderr, i, ), color, pi)el;
char paletaW1'X;
IS E8;,52E"EH AF6F EB,ILB, /40)%&0 - 1/ "F2FHE8 SI
detectgraph (jgdr#, jgmodo); coderr(graphresult();
i3 (((gdr#O(EB,) jj (gdr#O(LB,)) ee (coderrO(grFP))
p print3(VmnDecesaria tar7eta EB, o LB,!mnV); e)it(1); q
gmodo(EB,E:; initgraph(jgdr#, jgmodo, VV); coderr(graphresult();
i3 (coderrO(grFP)
p print3(VError gr-3ico$ hs!mnV, grapherrormsg(coderr)); e)it(1);q
IS 6:5C[,H 5,D6,8 LEH;:",2E8 6E E[EA92F SI
3or ()(color(0; color\1/; color**)
3or (pi)el(0; pi)el\getma))()I1/; pi)el**, )**) p
setcolor (color); line (), 0, ), getma)());
q
IS 6E1:D:H DCEL, 9,2E;, SI
paletaW0X(0; IS ZZrgbHB5 ( 0 --` negro SI
paletaW1X(4; IS ZZ000100 ( 4 --` componente ro7a normal SI
paletaW+X(4S.; IS ZZ100000 ( %+ --` componente ro7a oscura SI
paletaW%X(4S.*4; IS ZZ100100 ( %/ --` ambas$ ro7o brillante SI
3or (i(4; i\1'; i**) paletaWiX(0; IS resto colores borde negros SI
r!rZes(19Z8EB(paleta); r!rZd)(19ZF11(paleta);
r!rZa)(0)100+; intr (0)10, jr); IS establecer paleta borde SI
getch(); closegraph();
q
9ara establecer la paleta se puede llamar a la 5:F8 (:D; 10h) con ,M(100+h E8$6M apuntando a un bu33er de 1'
btes$ uno para cada registro de paleta m-s otro 3inal para el color del borde de la pantalla! El ;urbo " permite cambiar la
paleta con instrucciones de alto ni#el; sin embargo, quienes no deseen aprender las particularidades de cada compilador,
siempre pueden recurrir a la 5:F8, que cambiando la paleta es bastante sol#ente! Echemos un #istazo al e7emplo de la
3igura '!4!%!% (para e7ecutar este programa ha que tener en cuenta que el 3ichero EB,LB,!5B: del compilador ha de estar
en el directorio de traba7o)! ,l principio se trazan unas bandas #erticales con la 3uncin line9: que ser-n coloreadas con los
1/ colores por de3ecto, aunque cambiar-n instant-neamente al modi3icar la paleta! ,l de3inir la paleta, los 4 primeros
registros son asignados con los 4 posibles tonos de ro7o, m-s bien % (el primero es el negro absoluto)$ ro7o, ro7ooscuro ro7o
brillante! ;odos los dem-s registros el borde de la pantalla son puestos a 0 (negro) por lo que en la pantalla quedan
#isibles slo las tres bandas #erticales citadas! El cambio de la paleta es instant-neo, lo que permite hacer e3ectos
especiales! En la LB,, recu>rdese que los #alores de la paleta son simples punteros al 6," no los colores reales! 2o que
sucede es que los registros del 6," son inicializados al cambiar el modo de pantalla de tal manera que emulan los colores
que se obtendra en una EB,!!! a menos que se cambien los #alores de dichos registros!
9ara ello, nada me7or que llamar de nue#o a la :D; 10h con ,M(101+h, indicando en 5M el primer elemento del 6," a
cambiar (tpicamente 0) en "M el n0mero de elementos a modi3icar (a menudo los +&/ posibles)! ;ambi>n se pasa en
E8$6M la direccin de la tabla de '/. btes que contiene la in3ormacin$ % btes consecuti#os para cada elemento del 6,"
(ro7o, #erde azul) aunque solo son signi3icati#os los / bits de menor orden de cada bte! E)iste tambi>n otra 3uncin
bastante interesante, in#ocable con ,M(101%h que consta de dos subser#icios$ el primero se selecciona poniendo un 0 en
52, e indicando en 5E si se desean 4 p-ginas de /4 elementos en el 6," (5E(0) 1/ p-ginas de 1/ elementos (5E(1)! El
segundo ser#icio se indica llamando con 52(1, permite seleccionar la p-gina del 6," acti#a en 5E (0-% 0-1&, seg0n
cmo est> estructurado)! Fb#iamente, esta 3uncin no est- disponible en el modo 1%h de +&/ colores, en el que no
inter#iene la paleta (slo el 6," entero, no a trocitos)! 2a 3igura '!4!%!4 contiene un nue#o programa completo de
demostracin, desarrollado a partir del anterior, que requiere a un aut>ntico adaptador LB,! 2o primero que se hace es
seleccionar el modo de 1/ p-ginas en el 6,", estableciendo la p-gina + como acti#a (e)clusi#amente por anto7o mio)! Ello
signi3ica que se emplear-n los elementos %+!!4' del 6," (la p-gina 0 apuntara a los elementos 0!!1&, la 1 hubieran sido los
elementos 1/!!%1 as sucesi#amente)! 2os registros de paleta, simples ndices en el 6,", toman los #alores 0,1,!!!,1&
(e)cepto el 1'b bte, color del borde, puesto a 0 para seleccionar el negro)! , continuacin, basta programar los registros
%+!!4' del 6," con los colores deseados, entre los +/+!144 posibles! "omo cada componente puede #ariar entre 0 /%,
elegimos 1/ #alores espaciados proporcionalmente (0, 4, .,!!!, /0) los asignamos a las componentes ro7a #erde
(ro7o*#erde(amarillo), apareciendo en la pantalla una escala de 1/ amarillos (el primero, negro absoluto) de intensidad
creciente! 8i bien 1/ colores son pocos, son su3icientes para representar con relati#a precisin algunas im-genes,
especialmente en las que predomina un color determinado (los 3icheros gr-3icos se #en normalmente tan mal en los modos
de 1/ colores debido a que respetan la paleta de la EB,, en la LB, sera otra historia)!
?I1URA 2.#.".#:
ISSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
S E[EA92F 6E ",A5:F 6E 2, 9,2E;, 6E 1/ "F2FHE8 ? HE9HFBH,A,":FD 6E2 S
S 6," 6E 2, LB, 9FH E2 5:F8 9,H, E2EB:H 2F8 1/ "F2FHE8 ED;HE +/+!144 S
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSI
linclude \dos!h`
linclude \graphics!h`
#oid main()
p
struct HEB9,"@ r;
int gdr#, gmodo, coderr, pagina, i, ), color, pi)el;
char paletaW1'X, dacW+&/XW%X;
IS E8;,52E"EH AF6F LB, /40)4.0 - 1/ "F2FHE8 SI
detectgraph (jgdr#, jgmodo); coderr(graphresult();
i3 ((gdr#O(LB,) ee (coderrO(grFP))
p print3(VmnDecesaria tar7eta LB,!mnV); e)it(1); q
gmodo(LB,E:; initgraph(jgdr#, jgmodo, VV); coderr(graphresult();
i3 (coderrO(grFP)
p print3(VError gr-3ico$ hs!mnV, grapherrormsg(coderr)); e)it(1);q
IS 6:5C[,H 5,D6,8 LEH;:",2E8 6E E[EA92F SI
3or ()(color(0; color\1/; color**)
3or (pi)el(0; pi)el\getma))()I1/; pi)el**, )**) p
setcolor (color); line (), 0, ), getma)());
q
IS 8E2E"":FD,H 1/ 52FTCE8 6E 1/ E2EAED;F8 ED E2 6," SI
r!rZa)(0)101%; r!rZb)(0)0100; intr (0)10, jr);
IS 9,B:D, +$ 2, 9,2E;, 8E ,9F?,H, ED E2EAED;F8 %+!!4' 6E2 6," SI
pagina(+; r!rZa)(0)101%; r!rZb)((pagina\\.) e 1; intr (0)10, jr);
IS ,9CD;,H HEB:8;HF8 6E 9,2E;, , E2EAED;F8 "FD8E"C;:LF8 6E2 6," SI
3or (i(0; i\1/; i**) paletaWiX(i;
paletaW1/X(0; IS color del borde SI
r!rZes(19Z8EB(paleta); r!rZd)(19ZF11(paleta);
r!rZa)(0)100+; intr (0)10, jr); IS establecer paleta borde SI
IS 22ED,H E2EAED;F8 %+!!4' 6E2 6," 6E ,A,H:22F8 "HE":ED;E8 SI
3or (i(%+; i\4.; i**) p
dacWiXW0X(iS4; IS #alores crecientes 0!!/0 de ro7o SI
dacWiXW1X(iS4; IS #alores crecientes 0!!/0 de #erde SI
dacWiXW+X(0; IS sin componente azul SI
q
r!rZb)(%+; IS primer elemento del 6," SI
r!rZc)(1/; IS n0mero de elementos a de3inir SI
r!rZes(19Z8EB(dacW%+X); r!rZd)(19ZF11(dacW%+X);
r!rZa)(0)101+; intr (0)10, jr); IS programar elementos del 6," SI
getch();
closegraph();
q
9or supuesto, e)isten m-s 3unciones que >stas, entre ellas las que permiten cambiar slo un registro de paleta o un
elemento del 6," ( no un bloque); sin embargo, son m-s lentas cuando se #a a cambiar un con7unto de registros! En
cualquier caso, el lector puede consultarlas en el 3ichero :D;EHHC9!28; si lo desea! ;ambi>n e)isten en la LB, las
3unciones in#ersas (obtener paletas registros del 6,")! El acceso por medio de la 5:F8 para cambiar la paleta es a
menudo m-s cmodo que emplear 3unciones del lengua7e de programacin garantiza en ocasiones un maor ni#el de
independencia respecto a la e#olucin 3utura del hardKare (aunque si la librera gr-3ica llama a la 5:F8!!!)! 8in embargo,
para otras aplicaciones, es me7or no usar la 5:F8! 9or e7emplo, el programa de la 3igura '!4!%!& accede directamente a los
registros de la LB, para modi3icar la paleta en dos bucles, en el primero disminuendo la luminosidad de la pantalla (hasta
de7arla negra) en el segundo restaur-ndola de nue#o! Este e3ecto cinemator#"ico hubiera sido imposible a tra#>s de la
5:F8 por razones de #elocidad$ el acceso directo al hardKare, con precauciones (en este caso, esperar el retrazado #ertical
para e#itar inter3erencias) es a #eces ine#itable! El programa de e7emplo 3unciona tambi>n en monitores monocromos,
aunque en la pr-ctica slo act0e en ellos sobre la componente #erde! El lector deber- consultar bibliogra3a especializada
para realizar este tipo de programacin!
?I1URA 2.#.".&:
ISSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
S E1E";F <":DEA,;FBH,1:"F= 6E 6E8L,DE":A:ED;F ? 9F8;EH:FH S
S HE,9,H:":FD 6E 2, 9,D;,22, "FD ,""E8F 6:HE";F ,2 E,H6U,HE LB,! S
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSI
linclude \dos!h`
#oid main()
p
unsigned char dacW+&/XW%X;
register i, 7;
3or (i(0; i\+&/; i**) p IS anotar la paleta acti#a SI
disable();
outportb (0)%"', i);
dac WiXW0X ( inportb (0)%"9); IS H SI
dac WiXW1X ( inportb (0)%"9); IS B SI
dac WiXW+X ( inportb (0)%"9); IS 5 SI
enable();
q
IS claridad descendente desde el
/4I/4-a#o al 0I/4-a#o de intensidad SI
3or (i(/4; i`(0; i--) p
Khile (O((inportb(0)%6,) j .)((.)); IS esperar retrazo #ertical SI
Khile (O((inportb(0)%6,) j .)((0)); IS esperar su 3in SI
3or (7(0; 7\+&/; 7**) p
disable();
outportb (0)%"., 7);
outportb (0)%"9, dacW7XW0XSi `` /);
outportb (0)%"9, dacW7XW1XSi `` /);
outportb (0)%"9, dacW7XW+XSi `` /);
enable();
q
q
IS claridad ascendente desde el
0I/4-a#o al /4I/4-a#o de intensidad SI
3or (i(0; i\(/4; i**) p
Khile (O((inportb(0)%6,) j .)((.)); IS esperar retrazo #ertical SI
Khile (O((inportb(0)%6,) j .)((0)); IS esperar su 3in SI
3or (7(0; 7\+&/; 7**) p
disable();
outportb (0)%"., 7);
outportb (0)%"9, dacW7XW0XSi `` /);
outportb (0)%"9, dacW7XW1XSi `` /);
outportb (0)%"9, dacW7XW+XSi `` /);
enable();
q
q
q
'!4!%!% - 6:HE"":FD,A:ED;F 6E 9:ME28!
9ara pintar pi)els en la pantalla para consultar su color, e)isten 3unciones de la 5:F8 de uso no recomendado! 2a razn
estriba en el mal diseGo de la 5:F8 inicial de :5A, no me7orado tampoco por las LB, clnicas! El problema es que las 5:F8
emplean 4, & hasta 10 #eces m-s tiempo del necesario para trazar los puntos! 2a causa de este problema no reside en que
empleen rutinas multipropsito para todos los modos, a que e)isten b-sicamente slo tres tipos de arquitectura de pantalla
(modos "B,, 1/ colores +&/ colores)! El 3allo reside, simplemente, en que han sido desarrollados sin pensar en la
#elocidad! 9or e7emplo, la 5:F8 emplea el algoritmo m-s lento posible que e)iste para trazar puntos en los modos de 1/
colores! 2o m-s con#eniente es utilizar los recursos del lengua7e de programacin o, me7or a0n, acceder directamente a la
memoria de pantalla con subrutinas en ensamblador! Este es el procedimiento seguido por la maora de las aplicaciones
comerciales! 8in embargo, la 5:F8 tiene la #enta7a de que permite normalizar el acceso a la pantalla! ,s, un programa
puede 3-cilmente trazar un punto en el modo 10+4)'/.)+&/ de una 8uperLB, ( nunca me7or dicho, porque como sean
muchos m-s de uno!!!)! 9ara trazar un punto se coloca en "M la coordenada M, en 6M la coordenada ?, en ,2 el color, en
5E la p-gina en ,E el #alor 0"h! , continuacin se llama,como es costumbre, a la :D; 10h! 9ara consultar el color de
un punto en la pantalla, se cargan "M 6M con sus coordenadas 5E con la p-gina, haciendo ,E(06h antes de llamar a la
:D; 10h, la cual de#uel#e el color del pi)el en ,2! 2a p-gina ser- normalmente la 0, aunque en los modos de #deo que
soportan #arias p-ginas >sta se puede seleccionar con la 3uncin & de la :D; 10h! 2a e)istencia de #arias p-ginas de #deo
se produce cuando en el segmento de /4 @b de la memoria de #deo se puede almacenar m-s de una imagen completa
(caso por e7emplo del modo /40)%&0)1/)$ e)isten entonces #arias p-ginas (+, 4, etc!) que se reparten el segmento a partes
iguales! 8e puede en estas circunstancias #isualizar una p-gina cualquiera mientras se traba7a en las otras, que mientras
tanto permanecen ocultas a los o7os del usuario!
Mo*o 1"N *) !&0 'olo8)+.
Este modo, de organizacin lineal, no presenta complicacin alguna$ los pi)els se suceden en la memoria de #deo de
izquierda a derecha de arriba a aba7o, a partir del segmento ,000! "ada punto est- asociado a un bte, cuo #alor (0-+&&)
re3erencia directamente a un elemento del 6,"! En la 3igura '!4!%!/ ha un nue#o listado de e7emplo, en este caso sin
emplear la librera gr-3ica del ;urbo "! El programa se limita a acti#ar este modo de pantalla pintando las +00 lneas con los
#alores 0!!199! , continuacin de3ine los elementos 0!!199 del 6," de la siguiente manera$ los primeros 100 en tonos
ascendentes de azul, los siguientes 100 elementos en tonos descendentes de naran7a, lo que di#ide autom-ticamente la
pantalla en dos zonas con la estructura citada! "onseguir el naran7a no es complicado$ basta sumar ro7o con amarillo; como
el amarillo es a su #ez ro7o m-s #erde, el naran7a se obtiene sumando dos cantidades de ro7o por cada una de #erde! 2os
elementos +00!!+&& del 6,", no empleados en este e7emplo, podran ser de3inidos con otros colores para dibu7ar alguna
otra cosa!
?I1URA 2.#.".0:
ISSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
S E[EA92F 6E C8F 6E2 AF6F 6E %+0)+00 "FD +&/ "F2FHE8 S
S 8:D EA92E,H 2, 2:5HEH:, BH,1:", 6E2 "FA9:2,6FH! S
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSI
linclude \dos!h`
#oid main()
p
struct HEB9,"@ r;
char dacW+&/XW%X, 3ar S#ram;
register ), ;
int i,ii;
IS E8;,52E"EH AF6F 6E 9,D;,22, SI
r!rZa)(0)1%; intr (0)10, jr); #ram(A@Z19(0),000, 0);
IS 22ED,H 2, 9,D;,22, "FD 2:DE,8 EFH:RFD;,2E8 6E "F2FH 0!!199 SI
3or ((0; \+00; **) 3or ()(0; )\%+0; )**) S#ram**(;
IS 6E1:D:H 9,2E;, ED E2 6," SI
3or (i(0; i\100; i**) p
dacWiXW0X(0;
dacWiXW1X(0; IS de3inir azules SI
dacWiXW+X(i `` 1;
q
3or (i(100; i\+00; i**) p
ii(+00-i;
dacWiXW0X(ii `` 1;
dacWiXW1X(ii `` +; IS de3inir naran7as SI
dacWiXW+X(0;
q
r!rZa)(0)101+; r!rZb)(0; r!rZc)(+00;
r!rZes(19Z8EB(dac); r!rZd)(19ZF11(dac); intr (0)10, jr);
getch(); r!rZa)(%; intr (0)10, jr);
q
Mo*o+ *) 10 'olo8)+.
9ara direccionar puntos en los modos de 1/ colores, en los que act0an interrelacionados los registros de paleta el 6,"
de la manera descrita con anterioridad, es necesario un acceso directo al hardKare por cuestiones de #elocidad! 2os lectores
que no #aan a emplear las 3unciones del lengua7e de programacin deber-n consultar bibliogra3a especializada en gr-3icos!
Y a*a (P+.
2a 0nica di3erencia de la LB, respecto a la EB,, de hecho, se debe a su peculiar manera de gestionar el color, as como
a la inclusin del modo de %+0)+00 con +&/ colores (el modo de /40)4.0 es id>ntico en 3uncionamiento al de /40)%&0 de la
EB,, solo cambia la altura de la pantalla)! E)iste tambi>n la posibilidad de colocar la LB, en dos modos de +&/ colores
alternati#os al 1%h basados en el mismo; en uno se alcanzan %+0)+40 puntos en el otro %+0)400! 2a bibliogra3a
especializada en gr-3icos e)plica los pasos a realizar para conseguir esto, 3actible en la totalidad de las tar7etas LB, del
mercado! 8in embargo, estos modos requieren un cambio en el modo de direccionamiento de los pi)els, que pasa a ser m-s
comple7o -aunque m-s potente para algunas aplicaciones-!
'!4!4! - E[EA92F 6E BHi1:"F8 EA92E,D6F 2, 5:F8!
Este programa e7emplo accede a la pantalla empleando las 3unciones de la 5:F8 para trazar puntos (#er ap>ndice
sobre 3unciones de la 5:F8)! Ctiliza el modo "B, de /40)+00 puntos, aunque se puede con3igurar para cualquier otro modo!
El programa dibu7a una conocida red en las cuatro esquinas de la pantalla, trazando lneas! El algoritmo empleado es el
de B8)++)Na( con c-lculo incremental de puntos (aunque al estar separada la rutina que traza el punto esta caracterstica
no se apro#echa, pero es 3-cil de implementar si en #ez de llamar a la 5:F8 para pintar se emplea una rutina
propia mezclada con la que traza la recta)! 2a #elocidad del algoritmo es mu ele#ada, sobre todo con las lneas largas,
m-)ime teniendo en cuenta que se trata posiblemente de una de sus implementaciones m-s optimizada (slo usa una
#ariable mantiene todos los dem-s #alores en los ' registros de datos de la "9C, sin emplear demasiado la pila
duplicando cdigo cuando es preciso en los puntos crticos)! Do entrar> en e)plicaciones matem-ticas del m>todo, del que
ha pautas en su listado! E)isten #ersiones de este m>todo que consideran de manera especial las lneas #erticales
horizontales para pintarlas de manera m-s r-pida, aunque o personalmente pre3iero rutinas independientes para esas
tareas con ob7eto de no ralentizar el trazado de rectas normales!
; SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
; S S
; S HE6!,8A - 6emostracin de gr-3ica en "B, utilizando 5:F8 S
; S S
; SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
modo ETC / ; modo de #deo
ma)Z) ETC /40
ma)Z ETC +00
ma)Zcolor ETC +
red 8EBAED;
,88CAE "8$red, 68$red
FHB 100h
inicio$
AFL ,M,modo
:D; 10h ; modo de pantalla
AFL ,2,ma)Zcolor-1 ; color #isible
AFL 5M,0 ; contador para e7e ?
AFL 59,0 ; contador para e7e M
otrasZcuatro$ AFL "M,0
AFL 6M,5M
AFL 8:,59
AFL 6:,ma)Z-1
",22 recta ; primera recta
AFL "M,ma)Z)-1
AFL 8:,ma)Z)-1
8C5 8:,59
",22 recta ; segunda
AFL "M,59
AFL 6M,0
AFL 8:,0
AFL 6:,ma)Z-1
8C5 6:,5M
",22 recta ; tercera
AFL "M,ma)Z)-1
8C5 "M,59
AFL 8:,ma)Z)-1
",22 recta ; cuarta
,66 5M,/
,66 59,14
"A9 5M,ma)Z
[5 otrasZcuatro
AFL ,E,0
:D; 1/h ; esperar pulsacin de tecla
AFL ,M,%
:D; 10h ; #ol#er a modo te)to
:D; +0h ; 3in de programa
recta 9HF"
9C8E ,M ; de ("M,6M) a (8:,6:) color ,2
9C8E 5M
9C8E "M
9C8E 6M
9C8E 8:
9C8E 6:
9C8E 59
AFL color,,2
AFL ,M,8:
8C5 ,M,"M ; ,M ( M+-M1
[D" abs)+)1
DEB ,M
M"EB "M,8:
M"EB 6M,6:
abs)+)1$ AFL 5M,6: ; ,M ( ,58(M+-M1) ( <d)=
8C5 5M,6M
AFL 59,1 ; 59 ( 1 ( <incr= si ?+`?1
[D" abs+1
DEB 59 ; 59 ( -1 ( <incr= si ?+\(?1
DEB 5M
abs+1$ "A9 ,M,5M ; 5M ( ,58(?+-?1) ( <d=
9C8E1
[, nosKap ; ,58(pendiente) menor de 1
M"EB ,M,5M
nosKap$ 8E2 5M,1 ; 5M ( <d= S +
AFL 8:,5M
8C5 8:,,M ; 8: ( <d= S + - <d)= ( <d=
AFL 6:,5M
8C5 6:,,M
8C5 6:,,M ; 6: ( <d=S+-<d)=S+ ( <incr+=
9F91
[5E penma1 ; pendiente maor de 1
penmen1$ 9C8E ,M
AFL ,2,color
",22 punto ; en ("M, 6M) ( (<)=, <=)
9F9 ,M
:D" "M ; <)=**
,D6 8:,8: ; (8:`0) ] -` <d= ` 0 ]
[8 noinc
,66 8:,6: ; <d= ` 0 $ <d= ( <d= * <incr+=
,66 6M,59 ; <= ( <= * <incr=
6E" ,M ; <d)=--
[DR penmen1
[A9 3in
noinc$ ,66 8:,5M ; <d= \ 0 $ <d= ( <d= * <incr1=
6E" ,M
[DR penmen1
[A9 3in
penma1$ 9C8E ,M
AFL ,2,color
",22 punto ; en ("M, 6M) ( (<)=, <=)
9F9 ,M
,66 6M,59 ; <= ( <= * <incr=
,D6 8:,8: ; (8:`0) ] -` <d= ` 0 ]
[8 noinc)
,66 8:,6: ; <d= ` 0 $ <d= ( <d= * <incr+=
:D" "M ; <)=**
6E" ,M ; <d)=--
[DR penma1
[A9 3in
noinc)$ ,66 8:,5M ; <d= ( <d= * <incr1=
6E" ,M ; <d)=--
[DR penma1
3in$ 9F9 59
9F9 6:
9F9 8:
9F9 6M
9F9 "M
9F9 5M
9F9 ,M
HE;
color 65 0
recta ED69
punto 9HF"
9C8E 5M ; preser#ar registros (sal#o ,M)
9C8E "M
9C8E 6M
9C8E 59
9C8E 8:
9C8E 6:
AFL ,E,0"h ; trazar punto usando 5:F8
MFH 5M,5M
:D; 10h
9F9 6:
9F9 8:
9F9 59
9F9 6M
9F9 "M
9F9 5M
HE;
punto ED69
red ED68
ED6 inicio
Tuiz- el lector opine que HE6!,8A no es tan r-pido! ? tiene razn$ la culpa es de la 5:F8, que consume un alto
porcenta7e del tiempo de proceso! 8ustituendo la rutina <punto= por una rutina de trazado de puntos propia, como la que se
lista a continuacin, la #elocidad puede llegar a quintuplicarse en un hipot>tico HE6+!,8A que la in#ocara!
punto/40)+00Z" 9HF" ; en ("M, 6M) de color ,2 ("B, /40)+00)
9C8E 68 ; slo se corrompe ,M
9C8E 5M
9C8E "M
9C8E 6M
AFL 5M,05.00h ; segmento de pantalla "B,
AFL 68,5M
AFL ,E,"2 ; preser#ar parte ba7a de <c)=
M"EB 5M,"M ; 5M ( <c)=
AFL "2,%
8EH 5M,"2 ; 5M ( <c)= I .
8EH 6M,1 ; 6M ( int (<c= I +)
[D" noZadd
,66 5M,.19+ ; 5M ( <c)= I . * (<c= AF6 +) S .19+
noZadd$ :D" "2 ; "2 ( 4
8E2 6M,"2 ; 6M ( (<c= I +) S 1/
,66 5M,6M ; 5M ( 5M * (<c= I +) S 1/
8E2 6M,1
8E2 6M,1 ; 6M ( (<c= I +) S /4
,66 5M,6M ; 5M ( 5M * (<c= I +) S .0
AFL "2,,E ; recuperar parte ba7a de <c)=
,D6 "2,' ; de7ar nb de bit a pintar (0!!')
MFH "2,' ; in#ertir orden de numeracin
AFL ,E,1 ; bit a borrar de la pantalla en ,E
8E2 ,M,"2 ; ,E ( bit a borrar, ,2 ( bit a pintar
DF; ,E
,D6 W5MX,,E ; borrar punto anterior
FH W5MX,,2 ; ubicar nue#o punto (1I0)
9F9 6M
9F9 "M
9F9 5M
9F9 68
HE;
punto/40)+00Z" ED69
9ara estudiar el 3uncionamiento de la pantalla "B, el lector puede hacer un programa que recorra la memoria de #deo
para comprender la manera en que est- organizada, un tanto peculiar pero no demasiado complicada! 8in embargo, con
EB, LB, no es tan sencillo realizar operaciones sobre la pantalla debido a la presencia de planos de bit; sal#o contadas
e)cepciones como la del siguiente apartado!
'!4!&! - E[EA92F 6E BHi1:"F8 ,""E6:ED6F ,2 E,H6U,HE!
El siguiente programa de e7emplo accede directamente al segmento de #deo de la LB, (0,000h) para trazar los puntos!
6ibu7a un #istoso o#illo basado en circun3erencias con centro ubicado en una circun3erencia base imaginaria, apro#echando
los +&/ colores de la LB, est-ndar en el modo %+0)+00! "omo la paleta establecida por de3ecto es poco interesante, se
de3ine pre#iamente una paleta con apoo directo en el hardKare (el m>todo empleado es sencillo pero no recomendable,
pro#oca nieve con algunas tar7etas)! 8e emplea el color #erde, 0nico #isualizable en monitores monocromos (aunque
cambiando la paleta con las 3unciones de la 5:F8 no hubiera sido necesario)! 2a LB, en modo 1%h asocia cada punto de
pantalla a un bte, por lo que la pantalla es una matriz de /4000 btes en el segmento 0,000h! Hecordar que la 3rmula para
calcular el desplazamiento para un punto (c),c) es %+0Sc*c)!
8i se sustitue la rutina <punto=, que traza el punto, por otra que lo haga llamando a la 5:F8, en una LB, 9aradise
(5:F8 de 14I'I..) se emplean 4 segundos . cent>simas en generar la imagen, mientras que tal como est- el programa
lo dibu7a en 40,4 cent>simas (10,1 #eces m-s r-pido); todos estos datos cronometrados con precisin sobre un %./-+& sin
memoria cach> teniendo instalada la opcin de <8E,6FU HFA= (la lenta HFA copiada en H,A, incluida la 5:F8 de la
LB,, por tanto no compite con des#enta7a)!
El algoritmo empleado para trazar la circun3erencia es de [! Aichener, quien se bas a su #ez en otro de [! 5resseham
desarrollado para plotter! 2a #ersin que incluo genera circun3erencias en pantallas de relacin de aspecto 1$1, en otras (e7!,
de /40 ) +00) producira elipses! Do entrar> en su demostracin matem-tica, que nada tiene que #er con el ensamblador;
baste decir que la rutina se basa e)clusi#amente en la aritm>tica entera calculando un solo octante de la circun3erencia (los
dem-s los obtiene por simetra)!
; SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
; S S
; S FL:22F!,8A - 6emostracin de gr-3ica en LB, utilizando hardKare S
; S S
; SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
modo ETC 1%h ; modo de #deo
ma)Z) ETC %+0
ma)Z ETC +00
ma)Zcolor ETC +&/
o#iseg 8EBAED;
,88CAE "8$o#iseg, 68$o#iseg
FHB 100h
inicio$
AFL ,M,modo
:D; 10h
",22 paletaZ#erde
AFL "M,ma)Z)
8EH "M,1 ; "M ( ma)Z) I +
AFL 6M,ma)Z
8EH 6M,1 ; 6M ( ma)Z I +
AFL 5M,6M
8EH 5M,1 ; 5M ( maZ I 4
",22 o#illo ; en ("M, 6M) de radio 5M
AFL ,E,0
:D; 1/h ; esperar pulsacin de tecla
AFL ,M,%
:D; 10h ; #ol#er a modo te)to
:D; +0h ; 3in de programa
paletaZ#erde 9HF"
AFL "M,+&/ ; los +&/ registros
AFL 6M,%".h
otroZreg$ AFL ,2,"2
FC; 6M,,2 ; registro a programar
:D" 6M
MFH ,2,,2
FC; 6M,,2 ; componente ro7a
AFL ,2,"2
HE9; ma)Z)I%+0
8EH ,2,1
ED6A
FC; 6M,,2 ; componente #erde
MFH ,2,,2
FC; 6M,,2 ; componente azul
6E" 6M
2FF9 otroZreg
HE;
paletaZ#erde ED69
o#illo 9HF" ; circun3erencia de circun3erencias
AFL 59,5M ; en ("M, 6M) con radio 5M color ,2
AFL ,2,0
AFL 8:,5M
MFH 6:,6:
8E2 59,1
8C5 59,%
DEB 59 ; 59 ( % - + S 5M
o#illoZacaba$ "A9 6:,8:
[B o#illoZoP ; o#illo completado
,66 "M,8:
,66 6M,6:
",22 circun3erencia ; en ()*8:, *6:)
:D" ,2
8C5 "M,8:
8C5 "M,8:
",22 circun3erencia ; en ()-8:, *6:)
:D" ,2
8C5 6M,6:
8C5 6M,6:
",22 circun3erencia ; en ()-8:, -6:)
:D" ,2
,66 "M,8:
,66 "M,8:
",22 circun3erencia ; en ()*8:, -6:)
:D" ,2
8C5 "M,8:
,66 6M,6:
,66 "M,6:
,66 6M,8:
",22 circun3erencia ; en ()*6:, *8:)
:D" ,2
8C5 "M,6:
8C5 "M,6:
",22 circun3erencia ; en ()-6:, *8:)
:D" ,2
8C5 6M,8:
8C5 6M,8:
",22 circun3erencia ; en ()-6:, -8:)
:D" ,2
,66 "M,6:
,66 "M,6:
",22 circun3erencia ; en ()*6:, -8:)
:D" ,2
8C5 "M,6:
,66 6M,8: ; "M ( ), 6M (
"A9 59,0
[B o#illoZdec)
,66 59,6:
,66 59,6:
,66 59,6:
,66 59,6:
,66 59,/
[A9 o#illoZinc
o#illoZdec)$ 6E" 8:
9C8E ,M
AFL ,M,6:
8C5 ,M,8:
8E2 ,M,1
8E2 ,M,1
,66 59,,M
9F9 ,M
,66 59,10
o#illoZinc$ :D" 6:
[A9 o#illoZacaba
o#illoZoP$ HE;
o#illo ED69
circun3erencia 9HF" ; en ("M,6M) con radio 5M color ,2
9C8E 5M
9C8E "M
9C8E 6M
9C8E 8:
9C8E 6:
AFL 8:,5M
MFH 6:,6:
8E2 5M,1
8C5 5M,%
DEB 5M ; 5M ( % - + S 5M
circun3Zacaba$ "A9 6:,8:
[B circun3ZoP ; circun3erencia completada
,66 "M,8:
,66 6M,6:
",22 punto ; en ()*8:, *6:)
8C5 "M,8:
8C5 "M,8:
",22 punto ; en ()-8:, *6:)
8C5 6M,6:
8C5 6M,6:
",22 punto ; en ()-8:, -6:)
,66 "M,8:
,66 "M,8:
",22 punto ; en ()*8:, -6:)
8C5 "M,8:
,66 6M,6:
,66 "M,6:
,66 6M,8:
",22 punto ; en ()*6:, *8:)
8C5 "M,6:
8C5 "M,6:
",22 punto ; en ()-6:, *8:)
8C5 6M,8:
8C5 6M,8:
",22 punto ; en ()-6:, -8:)
,66 "M,6:
,66 "M,6:
",22 punto ; en ()*6:, -8:)
8C5 "M,6:
,66 6M,8: ; "M ( ), 6M (
"A9 5M,0
[B circun3Zdec)
,66 5M,6:
,66 5M,6:
,66 5M,6:
,66 5M,6:
,66 5M,/
[A9 circun3Zinc
circun3Zdec)$ 6E" 8:
9C8E ,M
AFL ,M,6:
8C5 ,M,8:
8E2 ,M,1
8E2 ,M,1
,66 5M,,M
9F9 ,M
,66 5M,10
circun3Zinc$ :D" 6:
[A9 circun3Zacaba
circun3ZoP$ 9F9 6:
9F9 8:
9F9 6M
9F9 "M
9F9 5M
HE;
circun3erencia ED69
punto 9HF" ; trazar punto en %+0)+00 con +&/ col!
9C8E 68 ; en ("M, 6M) con color ,2
9C8E "M
9C8E 6M
M"EB 6E,62 ; 6M ( <c= S +&/
,66 "M,6M ; "M ( <c= S +&/ * <c)=
8EH 6M,1
8EH 6M,1 ; 6M ( <c= S /4
,66 "M,6M ; "M ( <c= S %+0 * <c)=
AFL 6M,0,000h
AFL 68,6M ; segmento LB,
M"EB 5M,"M ; preser#ar 5M en "M, 5M ( o33set
AFL W5MX,,2 ; pintar el punto
M"EB 5M,"M ; restaurar 5M
9F9 6M ; restaurar dem-s registros
9F9 "M
9F9 68
HE;
punto ED69
o#iseg ED68
ED6 inicio
'!4!/! - E2 E8;iD6,H BHi1:"F LE8,!
6ebido a la anarqua reinante en el mundo de las tar7etas gr-3icas, en 19.9 se reunieron un grupo importante de
3abricantes (,;:, Benoa, :ntel, 9aradise, etc) para intentar crear una norma com0n! El resultado de la misma 3ue el est-ndar
LE8,! Este est-ndar de3ine una inter3ace so3tKare com0n a todas las 5:F8 para permitir a los programadores adaptarse con
3acilidad a las di#ersas tar7etas sin tener en cuenta sus di3erencias de hardKare!
,ctualmente, las principales tar7etas soportan la norma LE8,! 2as m-s antiguas pueden tambi>n soportarla gracias a
pequeGos programas residentes que el usuario puede instalar opcionalmente! 9ara desarrollar una aplicacin pro3esional, es
una buena norma soportar alg0n modo est-ndar de la LB, , para obtener m-s prestaciones, alg0n modo LE8, para los
usuarios que est>n equipados con dicho soporte! :ntentar acceder directamente al hardKare o a las 3unciones 5:F8 propias
de cada tar7eta del mercado por separado, sal#o para aplicaciones mu concretas, es ciertamente poco menos que
imposible!
Mo*o+ /8P:-'o+.
El est-ndar LE8, soporta multitud de modos gr-3icos, numerados a partir de 100h, si bien algunos de los m-s a#anzados
(con %+000 o 1/ millones de colores) slo est-n soportados por las #ersiones m-s recientes de la norma! Entre 100h 10'h
se de3inen los modos m-s comunes de 1/ +&/ colores de todas las 8uperLB,, aunque el modo /,h tambi>n es LE8,
(.00)/00)1/) al estar soportado por m0ltiples tar7etas!
Cna de las grandes #enta7as del est-ndar LE8, es la enorme in3ormacin que pone a disposicin del programador! Es
posible conocer todos los modos qu> caractersticas de resolucin, colores arquitectura tienen! ,dem-s, ha 3unciones
adicionales mu 0tiles para guardar recuperar el estado de la tar7eta, de especial utilidad para programas residentes$ as,
estos pueden 3-cilmente conmutar a modo te)to (con la precaucin de preser#ar antes los 4 primeros @btes de la H,A de
#deo empleados para de3inir los caracteres) #ol#er al modo gr-3ico original de7ando la pantalla en el estado inicial!
El p8o/8a(a *) )M)(plo.
En el ap>ndice donde se resumen las 3unciones del 6F8 la 5:F8 aparecen tambi>n las 3unciones LE8, de #deo!
Estas 3unciones se in#ocan #a :D; 10h, con ,M tomando #alores por lo general desde 4100h hasta 410.h! 9ara realizar
programas que utilicen la norma, el lector deber- consultar dicha in3ormacin! 8in embargo, se e)pone aqu un sencillo
programa de demostracin que recoge pr-cticamente todos los pasos necesarios para traba7ar con un modo LE8,!
El primer paso consiste en detectar la presencia de soporte LE8, en el sistema, tarea que realiza la 3uncin t)+t;)+aCD!
2a 3uncin /)t<)+t!&0CD se limita a buscar el modo de maor resolucin de +&/ colores soportado por la tar7eta gr-3ica de
ese equipo, barriendo sistem-ticamente todos los modos de pantalla desde el Vme7orV hasta el VpeorV! 9ara comprobar la
e)istencia de un determinado modo gr-3ico, ),-+t)Q(o*oCD in#oca tambi>n a la 5:F8 LE8,! 2a 3uncin +)t(o*)CDestablece
un modo gr-3ico LE8,, de#ol#iendo adem-s dos in3ormaciones interesantes$ la direccin de memoria de la rutina de
conmutacin de bancos (a #eremos para qu> sir#e) el segmento de memoria de #deo, que ser- normalmente 0,000h!
1inalmente, /)t-:oCD de#uel#e in3ormacin sobre cualquier modo gr-3ico! En principio, los modos utilizados por este
programa de demostracin son conocidos! 8in embargo, la lista de modos de #deo puede ser maor en algunas tar7etas,
sobre todo en el 3uturo! 9or tanto, un esquema alternati#o podra consistir no en buscar ciertos modos concretos sino en ir
recorriendo todos elegir el que cumpla ciertas caractersticas de resolucin o colores, entre todos los disponibles!
6e toda la in3ormacin que de#uel#e /)t-:oCD es particularmente interesante el n0mero de bancos que necesita ese
modo de #deo! Ea que tener en cuenta que todos los modos de +&/ colores de m-s de %+0)+00 ocupan m-s de /4 @b de
memoria! 6e esta manera, por e7emplo, una imagen de /40)4.0 con +&/ colores utiliza unos +&/ @b de H,A, di#idida en 4
bancos! En un momento dado, slo uno de los 4 bancos puede estar direccionado en el segmento de memoria de #deo!
9ara elegir el banco acti#o (m-s bien, el inicio de la #entana lgica sobre el total de la memoria de #deo, aunque nuestro
e7emplo es una simpli3icacin) e)iste una 3uncin de la 5:F8 LE8, o, me7or a0n$ podemos llamar directamente a una
subrutina que realiza r-pidamente esa tarea (sin tener que utilizar interrupciones) cua direccin nos de#ol#i +)t(o*)CD! 6e
esta manera, el inter3ace LE8, e#ita que tengamos que hacer accesos directos al hardKare! 2a rutina +)t<aRCD se limita a
cargar el registro 6M con el banco necesario antes de e7ecutar el ",22! 6e todas maneras, esta modalidad de llamada no
tiene por qu> estar soportada por todas las 5:F8 LE8, (en cuo caso de#uel#en una direccin 0000$0000 para el ",22)
aunque la inmensa maora, por 3ortuna, lo soportan!
El 0nico cometido de este programa de demostracin es buscar el me7or modo de +&/ colores, entre los normales de las
8uperLB,, acti#arlo e ir recorriendo todos los bancos que componen la memoria de #deo (e)cepto el 0ltimo, que podra
estar incompleto) para llenar la pantalla con btes de #alor &&h 0,,h! 1inalmente, antes de terminar, se imprime la
resolucin cantidad de memoria consumida por ese modo!
ISSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
S S
S E8;,D6,H BH,1:"F LE8,$ E[EA92F 6E C8F 6E2 AE[FH AF6F 6E +&/ S
S "F2FHE8 ED "C,2TC:EH 8C9EHLB,! S
S S
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSI
linclude \dos!h`
linclude \alloc!h`
linclude \stdio!h`
linclude \stdlib!h`
linclude \string!h`
lde3ine A/40)400)+&/ 0)100 IS modos LE8, normales de +&/c SI
lde3ine A/40)4.0)+&/ 0)101
lde3ine A.00)/00)+&/ 0)10%
lde3ine A10+4)'/.)+&/ 0)10&
lde3ine A1+.0)10+4)+&/ 0)10'
unsigned
test#esa (#oid), IS 6etectar soporte LE8, SI
e)isteZmodo (unsigned), IS "omprobar si un modo es soportado SI
getbest+&/ (#oid); IS Fbtener me7or modo de +&/c SI
#oid
setbanP (long, unsigned), IS "onmutar banco de memoria SI
setmode (unsigned, long S, IS Establecer modo LE8, SI
unsigned S),
getin3o (unsigned, IS Fbtener in3ormacin del modo SI
unsigned S,
unsigned S, unsigned S, unsigned S);
IS 6EAF8;H,":FD SI
#oid main()
p
struct HEB9,"@ r;
long
"onmuta5anco; IS direccin 1,H del conmutador de banco SI
unsigned
#ideoZseg, IS direccin del segmento de #deo SI
3ar Spantalla,
i, modo, ma)Z), ma)Z, #ram, bancos, banco, limite;
i3 (Otest#esa()) p
print3 (VmnDecesario soporte LE8, para este programa!mnV);
e)it (1);
q
modo ( getbest+&/();
setmode (modo, j"onmuta5anco, j#ideoZseg);
getin3o (modo, jma)Z), jma)Z, j#ram, jbancos);
3or (banco(0; banco\bancos; banco**) p
setbanP ("onmuta5anco, banco); IS direccionar banco SI
pantalla(A@Z19(#ideoZseg, 0); IS normalmente 0),000$0 SI
i3 (bancoO(bancos-1)
limite(%+'/.; IS todo el segmento de /4 @b SI
else
limite((#ram-bancoS/4)S&1+; IS palabras 0ltimo banco SI
3or (i(0; i\(limite; i**) Spantalla**(0)&&,,; IS pintar SI
q
setbanP ("onmuta5anco, 0);
print3 (VAodo de hd)hd)+&/ con hd @bmnmnV, ma)Z), ma)Z, #ram);
q
IS "FA9HF5,H TCE EM:8;E 8F9FH;E LE8, SI
unsigned test#esa(#oid)
p
struct HEB9,"@ r;
char 3ar Smem;
unsigned #esa;
mem ( 3armalloc (+&/2);
r!rZes ( 19Z8EB (mem); r!rZdi ( 19ZF11 (mem);
r!rZa) ( 0)4100; intr (0)10, jr);
memW4X(0; i3 (strcmp (mem, VLE8,V)((0) #esa(1; else #esa(0;
3ar3ree (mem);
return (#esa);
q
IS 5C8",H E2 AF6F 6E +&/ "F2FHE8 6E A,?FH HE8F2C":FD SI
unsigned getbest+&/ (#oid)
p
i3 (e)isteZmodo (A1+.0)10+4)+&/)) return (A1+.0)10+4)+&/);
i3 (e)isteZmodo (A10+4)'/.)+&/)) return (A10+4)'/.)+&/);
i3 (e)isteZmodo (A.00)/00)+&/)) return (A.00)/00)+&/);
i3 (e)isteZmodo (A/40)4.0)+&/)) return (A/40)4.0)+&/);
i3 (e)isteZmodo (A/40)400)+&/)) return (A/40)400)+&/);
return (0);
q
IS "FA9HF5,H 2, EM:8;ED":, 6E CD AF6F BH,1:"F SI
unsigned e)isteZmodo (unsigned modo)
p
struct HEB9,"@ r;
unsigned 3ar Smem, 3ar Sarra;
mem ( 3armalloc (+&/2);
r!rZes ( 19Z8EB (mem); r!rZdi ( 19ZF11 (mem);
r!rZa)(0)4100; intr (0)10, jr);
arra ( A@Z19 (memW.X, memW'X);
3ar3ree (mem);
Khile ((SarraO(0)1111) jj (SarraO(modo)) arra**;
return (Sarra((modo);
q
IS E8;,52E"EH CD AF6F BH,1:"F LE8, ? 6ELF2LEH 2, 6:HE"":FD 6E SI
IS 2, HC;:D, 6E "FDAC;,":FD 6E 5,D"F8 ? E2 8EBAED;F 6E L:6EF SI
#oid setmode (unsigned modo, long Sconmutar, unsigned S#ideoseg)
p
struct HEB9,"@ r;
long 3ar Smem;
mem ( 3armalloc (+&/2);
r!rZes ( 19Z8EB (mem); r!rZdi ( 19ZF11 (mem);
r!rZa) ( 0)4101; r!rZc) ( modo; intr (0)10, jr);
Sconmutar ( S(mem*%);
S#ideoseg ( S(mem*+);
3ar3ree (mem);
r!rZa)(0)410+; r!rZb)(modo; intr (0)10, jr);
q
IS F5;EDEH :D1FHA,":FD 8F5HE CD AF6F BH,1:"F LE8, SI
#oid getin3o (unsigned modo, unsigned Sma)Z), unsigned Sma)Z,
unsigned S#ram, unsigned Sbancos)
p
struct HEB9,"@ r;
unsigned 3ar Smem;
mem ( 3armalloc (+&/2);
r!rZes ( 19Z8EB (mem); r!rZdi ( 19ZF11 (mem);
r!rZa) ( 0)4101; r!rZc) ( modo; intr (0)10, jr);
Sma)Z) ( memW9X; Sma)Z ( memW10X;
S#ram ( (unsigned) ( (long) memW.X S memW10X I 10+42);
3ar3ree (mem);
Sbancos ( S#ram I /4;
i3 (S#ram h /4) (Sbancos)**;
q
IS "FDAC;,H 6E 5,D"F "FD 2, A,M:A, LE2F":6,6 SI
#oid setbanP (long direccion, unsigned banco)
p
asm p
mo# a),430+h
mo# d),banco
mo# b),0
call dKord ptr direccion
q
q
2.&. - EL TECLADO.
En este apartado se estudiar- a 3ondo el 3uncionamiento del teclado en los ordenadores compatibles, a tres ni#eles$ ba7o,
intermedio alto! En el captulo 1+ se documenta el 3uncionamiento del hardKare del teclado, interesante para ciertas
aplicaciones concretas, aunque para la maor parte de las labores de programacin no es necesario llegar a tanto!
'!&!1! - 5,[F D:LE2!
?u'-oa(-)to /))8al *)l t)'la*o.
,l pulsar una tecla se genera una interrupcin 9 (:HT 1) el '.*-/o *) 8a+t8)o que identi3ica la tecla pulsada puede
leerse en el puerto de EI8 /0h, tanto en M; como en ,; (se corresponde en los ,; con el registro de salida del .04+); si se
suelta la tecla se produce otra interrupcin se genera el mismo cdigo de rastreo*1+. (bit ' acti#o)! 9or e7emplo, si se
pulsa la Y,Y se generar- una :D; 9 aparecer- en el puerto del teclado (/0h) el bte 1Eh, al soltar la Y,Y se generar- otra :D;
9 se podr- leer el bte 9Eh del puerto del teclado (#>ase la tabla del ap>ndice L, donde se listan los cdigos de rastreo del
teclado)!
5a7o el sistema 6F8, el teclado del ,; es id>ntico al del M; en los cdigos de rastreo comportamiento, debido a la
traduccin que e3ect0a el .04+ en el primero! Do obstante, el teclado del ,; posee unos comandos adicionales para
controlar los 2E6s! En otros sistemas operati#os (normalmente CD:M) el teclado del ,; es programado para traba7ar en
modo ,; pierde la compatibilidad con el del M; (los cdigos de rastreo son distintos al soltar una tecla se producen dos
interrupciones) pero ba7o 6F8 esto no sucede en ning0n caso la compatibilidad es casi del 100h!
2as teclas e)pandidas -las que han sido aGadidas al teclado est-ndar de .%I.4 teclas- tienen un comportamiento
especial, a que pueden generar hasta 4 interrupciones consecuti#as (con un inter#alo de unos 1,& milisegundos, % ms en
los cdigos dobles que con#ierte en uno el .04+) con ob7eto de emular, aunque bastante mal, ciertas combinaciones de las
teclas no e)pandidas; en general es bastante de3iciente la emulacin por hardKare el controlador del teclado (@E?5) tiene
que tratarlas de manera especial en la pr-ctica! ,s, por e7emplo, cuando est- inacti#o DCA 2F"@ se pulsa el cursor
derecho e)pandido, se generan dos interrupciones consecuti#as$ en la primera aparece un #alor 0E0h en el puerto del
teclado que indica que es una tecla e)pandida; en la segunda interrupcin aparece el #alor 46h$ el mismo que hubiera
aparecido pulsando el Y/Y del teclado num>rico! 8in embargo, si DCA 2F"@ est- acti#o, en un teclado normal de .% teclas
ha que pulsar el Y/Y del teclado num>rico 7unto con shi3t para que el cursor a#ance! Esto se simula en el teclado e)pandido
por medio de 4 interrupciones$ En las dos primeras puede aparecer la secuencia 0E0h-+,h bien 0E0h-%/h (+,h %/h son
los cdigos de las teclas shi3t normales)$ con esto se simula que est- pulsado shi3t aunque ello no sea realmente cierto (las
5:F8 m-s antiguas ignoran la maora de los btes maores de 1+., entre ellos el 0E0h); despu>s aparecen otras dos
interrupciones con los #alores 0E0h-46h (con ob7eto de simular que se pulsa el Y/Y del teclado num>rico)$ como el estado
DCA 2F"@ est- acti#o en teor;a se ha pulsado shi3t el / del teclado num>rico, el cursor a#anza a la derecha; al soltar la
tecla aparecer- la secuencia de interrupciones 0E0h-"6h-0E0h-0,,h, o en su de3ecto la secuencia equi#alente 0E0h-"6h-
0E0h-05/h! En general, estos cdigos shi3t "antasma dan problemas cuando las teclas de 8E:1; adquieren otro signi3icado
di3erente que el de conmutar el estado DCA 2F"@, lo que sucede en casi todos los editores de te)to de los modernos
compiladores! 9or ello, la 5:F8 o el @E?5 tratan de manera especial las teclas e)pandidas; en los ordenadores m-s
antiguos (con 5:F8 -o al menos su tecnologa- anterior a Do#iembre de 19.&), si no se carga el @E?5, el teclado e)pandido
3uncionar- mal, incluso en Estados Cnidos -aunque las teclas est>n bien colocadas-! "uando se lee un #alor 0E0h en una
interrupcin de teclado, el @E?5 o la 5:F8 acti#an el bit 1 (el que #ale +) de la posicin de memoria 0040h$009/h; en la
siguiente interrupcin ese bit se borra a se sabe que el cdigo ledo es el de una tecla e)pandida! El bit 0 de esa misma
posicin de memoria indica si se le un bte 0E1h en lugar de 0E0h (la tecla e)pandida <pause= o <pausa= es un caso
especial -por 3ortuna, el 0nico- genera un pre3i7o 0E1h en #ez del 0E0h habitual; de hecho, esta tecla no genera cdigos al
ser soltada, pero al pulsarla aparece la secuencia E1-16-4&-E1-96-"&)!
El <u::)8 *)l t)'la*o.
"uando se pulsa una tecla normal, la rutina que gestiona :D; 9 deposita en un bu33er dos btes con su cdigo ,8":: el
cdigo de rastreo, para cuando el programa principal decida e)plorar el teclado -lo har- siempre consultando el bu33er-! 8i el
cdigo ,8":: depositado es cero 0E0h, se trata de una tecla especial (,2;-), cursor, etc!) el segundo bte indica cu-l
(son los denominados cdigos secundarios)! El cdigo ,8":: 0E0h slo es generado en los teclados e)pandidos por las
teclas e)pandidas (marcadas como YE)Y en la tabla de cdigos de rastreo del ap>ndice L), aunque las 3unciones est-ndar de
la 5:F8 del 6F8 que in3orman del teclado lo con#ierten en cero para compatibilizar con teclados no e)pandidos! ,s
mismo, el cdigo ,8":: 010h est- reser#ado para indicar las combinaciones de ,2;-tecla que no 3ueron consideradas
inicialmente en el so3tKare de soporte de los teclados no e)pandidos, pero s actualmente (de esta manera, las rutinas de la
5:F8 saben si deben in3ormar de estas teclas o no seg0n se est> empleando una 3uncin a#anzada u obsoleta, para
compatibilizar)! En todo caso, las secuencias introducidas por medio de ,2;-tecladoZnum>rico lle#an asociado un cdigo de
rastreo 0, por lo que el usuario puede generar los caracteres ,8":: 0E0h 010h sin que se con3undan con combinaciones
especiales; adem-s, seg0n :5A, si el cdigo ,8":: 0 #a acompaGado de un cdigo de rastreo % los programas deberan
interpretarlo como un aut>ntico cdigo ,8":: 0 (esta secuencia se obtiene con "trl-+) lo que permite recuperar ese c!dio
perdido en indicar combinaciones especiales!
Es importante seGalar que aunque el bu33er (organizado como cola circular) normalmente est- situado entre 0040h$001Eh
0040h$00%Eh, ello no siempre es as; realmente el o33set del inicio el 3in del bu33er respecto al segmento 0040h lo
determinan las #ariables (tamaGo palabra) situadas en 0040h$00.0h 0040h$00.+h en todos los ordenadores posteriores a
19.1! 9or ello, la inmensa maora de las pequeGas utilidades de las re#istas los e7emplos de los libros son, por desgracia,
incorrectos$ la manera correcta de colocar un #alor en el bu33er -para simular, por e7emplo, la pulsacin de una tecla- o
e)traerlo del mismo es comprobando adecuadamente los desbordamientos de los punteros teniendo en cuenta las #ariables
mencionadas! El puntero al inicio del bu33er es una #ariable tamaGo palabra almacenada en la posicin 0040h$001,h el 3in
otra ubicada en 0040h$001"h! El siguiente e7emplo introduce un car-cter de cdigo ,8":: ,2 cdigo de rastreo ,E (es
cmodo #-lido hacer ,E(0) en el bu33er del teclado$
AFL 5M,40h ; meter car-cter ,M en el bu33er del teclado
AFL 68,5M
"2: ; e#itar con3lictos con interrupciones
AFL 5M,68$W1"hX ; puntero a la cola del bu33er
AFL "M,5M
,66 "M,+ ; apuntar "M al siguiente dato
"A9 "M,68$W.+hX ; m-s all- del 3in del bu33er
[5 noZdesb
AFL "M,68$W.0hX ; inicio de la cola circular
noZdesb$ "A9 "M,68$W1,hX ; puntero al inicio del bu33er
[E 3inZrutina ; R1 ( 1 --` bu33er lleno
AFL 68$W5MX,,M ; introducir car-cter ,8":: (,2) en el bu33er
AFL 68$W1"hX,"M ; actualizar puntero al 3inal del bu33er
"A9 89,0 ; R1(0 (89 siempre \` 0) --` bu33er no lleno
3inZrutina$ 8;:
El #alor 0 para el cdigo de rastreo es usado para introducir tambi>n algunos caracteres especiales, como las #ocales
acentuadas, etc!, aunque por lo general no es demasiado importante su #alor (de hecho, los programas suelen comprobar
pre3erentemente el cdigo ,8"::; de lo contrario, en un teclado espaGol otro 3ranc>s, Nla tecla R tendra distinto cdigoO)! Do
estara de m-s en este e7emplo comprobar si las #ariables 40h$.0h 40h$.+h son distintas de cero por si el ordenador es
demasiado antiguo, medida de seguridad que de hecho toma el @E?5 del 6H-6F8 (en estas m-quinas adem-s no es
con#eniente ampliar el tamaGo del bu33er cambi-ndolo de sitio, por e7emplo; lo normal es que est> entre 40h$1Eh 40h$%Eh)!
En el ap>ndice L se listan los cdigos secundarios$ son el segundo bte (el m-s signi3icati#o) de la palabra depositada en el
bu33er del teclado por la 5:F8 o el @E?5!
1)+t-. *) la -t)88up'-. *)l t)'la*o.
Ee aqu un e7emplo de una subrutina que intercepta la interrupcin del teclado apo-ndose en el controlador habitual
limit-ndose a detectar las teclas pulsadas,espiando lo que sucede pero sin alterar la operacin normal del teclado$
nue#aZint9$ 8;: ; permitir interrupcin peridica
9C8E ,M ; preser#ar registros modi3icados
:D ,2,/0h ; cdigo de la tecla pulsada
9C8E1 ; preparar la pila para :HE;
",22 "8$anteriorZint9 ; llamar a la :D; 9 original
! ! ! ; hacer algo con esa tecla
9F9 ,M ; restaurar registros modi3icados
:HE; ; #ol#er al programa principal
E#identemente, es necesario preser#ar restaurar todos los registros modi3icados, como en cualquier otra interrupcin
hardKare, dado que puede producirse en el momento m-s insospechado no debe a3ectar a la marcha del programa
principal, anterior2int< es una #ariable de %+ bits que contiene la direccin de la interrupcin del teclado antes de instalar la
nue#a rutina! Es necesario hacer 9C8E1 antes de llamar porque la subrutina in#ocada #a a retornar con :HE; no con
HE;1! En general, el duo 9C8E1I",22 es una manera alternati#a de simular una instruccin :D;!
8i se implementa totalmente el control de una tecla en una rutina que gestione :D; 9 -sin llamar al principio o al 3inal al
anterior gestor-, en los M; ha que en#iar una seGal de reconocimiento al teclado poniendo a 1 despu>s a 0 el bit ' del
puerto de EI8 /1h (en ,; no es necesario, aunque tampoco resulta per7udicial hurgar en ese bit en las m-quinas 3abricadas
hasta ahora); es importante no en#iar m-s de una seGal de reconocimiento, algo innecesario por otra parte, de cara a e#itar
anomalas importantes en el teclado de los M;! ,dem-s, tanto en M; como ,; ha que en#iar en este caso una seGal de 3in
de interrupcin hardKare (EF:) al .+&9 (con un simple AFL ,2,+0h; FC; +0h,,2) al igual que cuando se gestiona cualquier
otra interrupcin hardKare! El e7emplo anterior quedara como sigue$
nue#aZint9$ 8;:
9C8E ,M
:D ,2,/0h ; cdigo de la tecla pulsada
"A9 ,2,tecla ; ces nuestra tecla]
[DE 3in ; no
9C8E ,M ; #amos a <manchar= ,M
:D ,2,/1h
FH ,2,10000000b
FC; /1h,,2
,D6 ,2,01111111b
FC; /1h,,2 ; seGal de reconocimiento en#iada
9F9 ,M ; ,2 ( tecla pulsada
! ! ! ; gestionarla
AFL ,2,+0h
FC; +0h,,2 ; EF: al .+&9
9F9 ,M ; ,M del programa principal
:HE; ; #ol#er al programa principal
3in$ 9F9 ,M ; ,M del programa principal
[A9 "8$anteriorZint9 ; saltar al gestor pre#io de :D; 9
"omo se puede obser#ar, esta rutina gestiona una tecla las dem-s se las de7a al @E?5 o la 5:F8! 8lo en el caso de
que la gestione >l es preciso en#iar una seGal de reconocimiento un EF: al .+&9! En caso contrario, se salta al controlador
pre#io a esta rutina con un [A9 largo (segmento$o33set); ahora no es preciso el 9C8E1, como en el caso del ",22, por
razones ob#ias! 2a instruccin 8;: del principio habilita las interrupciones, siempre inhibidas al principio de una interrupcin
-#alga la redundancia-, lo que es con#eniente para permitir que se produzcan m-s interrupciones -por e7emplo, la del
temporizador, que lle#a nada menos que la hora interna del ordenador-! En el e7emplo, el EF: es en#iado 7usto antes de
terminar de gestionar esa tecla; ello signi3ica que mientras se la procesa, las interrupciones hardKare de menor prioridad
-todas, menos el temporizador- est-n inhibidas por mucho que se haga 8;:; el programador ha de decidir pues si es preciso
en#iar antes o no el EF: (#>ase la documentacin sobre el controlador de interrupciones .+&9 de los captulos posteriores),
aunque si la rutina es corta no habr- demasiada prisa!
Es habitual en los controladores de teclado de ,; (tanto la 5:F8 como el @E?5 del A8-6F8) deshabilitar el teclado
mientras se procesa la tecla reci>n leda, habilit-ndolo de nue#o al 3inal, por medio de los comandos 0,6h 0,Eh en#iados
al .04+! 8in embargo, la maora de las utilidades residentes no toman estas precauciones tan so3isticadas (de hecho, el
@E?5 del 6H-6F8 tampoco)! 2gicamente slo se pueden en#iar comandos al .04+ cuando el registro de entrada del
mismo est- #aco, lo que puede #eri3icarse chequeando el bit 1 del registro de estado$ no es con#eniente realizar un bucle
in3inito que de7ara colgado el ordenador de 3allar el .04+, de ah que sea recomendable un bucle que repita slo durante un
cierto tiempo; en el e7emplo se utiliza la temporizacin del re3resco de la memoria din-mica de los ,; para no emplear m-s
de 1& ms esperando al .04+! ,dem-s las interrupciones han de estar inhibidas en el momento crtico en que dura el en#o
del comando, aunque cuidando de que sea durante el menor tiempo posible$
nue#aZint9$ 8;: ; bre#e #entana para interrupciones
9C8E ,M
",22 espera
AFL ,2,0,6h
FC; /0h,,2 ; inhibir teclado
",22 espera
:D ,2,/0h ; ctecla]
8;: ; permitir r-pidamente interrupciones
!!! ; procesar tecla en#iar EF: al .+&9
",22 espera
AFL ,2,0,Eh
FC; /0h,,2 ; desinhibir teclado
9F9 ,M
:HE; ; no merece la pena hacer 8;:
espera$ 9C8E ,M
9C8E "M
AFL "M,99& ; constante para 1& ms
"2:
testre3$ :D ,2,/1h
,D6 ,2,10h ; m>todo #-lido solo en ,;
"A9 ,2,,E
[R testre3
AFL ,E,,2
:D ,2,/4h ; registro de estado del .04+
;E8; ,2,+ ; cbu33er de entrada lleno]
2FF9DR testre3 ; as es
9F9 "M
9F9 ,M
HE;
'!&!+! - D:LE2 :D;EHAE6:F!
Co+ulta *) SHI?T, CTRL, ALT, )t' C marcas *) t)'la*oD.
Estas teclas pueden ser pulsadas para modi3icar el resultado de la pulsacin de otras! :5A no ha de3inido combinaciones
con ellas (e)cepto ";H2-,2;, que sir#e para reinicializar el sistema si se pulsa en con7uncin con 6E2) por lo que los
programas residentes suelen precisamente emplear combinaciones de dos o m-s teclas de estas para acti#arse sin eliminar
prestaciones al teclado; por de3ecto, si se pulsan dos o m-s teclas de estas la 5:F8 o el @E?5 asignan prioridades
consideran slo una de ellas$ ,2; es la tecla de maor prioridad, seguida de ";H2 de 8E:1;! 9or otra parte, cabe
destacar el hecho de que ";H2, ,2; 8E:1; (al igual que Dum 2ocP, "aps 2ocP, 8croll 2ocP e :ns) no poseen la
caracterstica de autorepeticin de las dem-s teclas debido a la gestin que realiza la 5:F8 o el @E?5!
- ;eclado no e)pandido!
2lamando con ,E(+ a la :D; 1/h (3uncin + de la 5:F8 para el teclado), se de#uel#e en ,2 un bte con in3ormacin
sobre las teclas de control (8E:1;, ";H2, etc!) que es el mismo bte almacenado en 0040h$001'h (#>ase en
el ap>ndice ::: el -rea de datos de la 5:F8 las 3unciones de la 5:F8 para teclado)! En 0040h$001.h, e)iste otro bte de
in3ormacin adicional, aunque no ha 3uncin 5:F8 para consultarlo en los teclados no e)pandidos, por lo que a menudo es
necesario leerlo directamente! 9or lo general es me7or emplear las 3unciones 5:F8, si e)isten, que consultar directamente un
bit, por razones de compatibilidad! E#identemente, todas las 3unciones para teclados no e)pandidos pueden usarse tambi>n
con los e)pandidos!
- ;eclado e)pandido!
, partir de 0040h$009/h ha otros btes con in3ormacin adicional espec3ica sobre el teclado del ,; los teclados
e)pandidos$ parte de esta in3ormacin, as como de la de 0040$001.h, puede ser consultada en los teclados e)pandidos con
la 3uncin 1+h de la 5:F8 del teclado e)pandido, que de#uel#e en ,M una palabra$ en ,2 de nue#o el bte de 0040h$001'h
en ,E otro bte mezcla de di#ersas posiciones de memoria con in3ormacin 0til (consultar 3unciones de la 5:F8 para
teclado)!
2os bits de 40h$9/h slo son 3iables si est- instalado el @E?5 del MS-6F8 o 99h compatible; por e7emplo, el @E?5 del
6H-6F8 &!0I/!0 (e)cepto en modo @E?5 C8) no gestiona correctamente el bit de ,ltBr, aunque s los dem-s bits! ,ntes de
usar esta 3uncin con#iene asegurarse de que est- soportada por la 5:F8 o el @E?5 instalado!
L)'tu8a *) t)'la+ o8*-a8-a+.
"on la 3uncin 0 de la :D; 1/h (,E(0 al llamar) se lee una tecla del bu33er del teclado, esperando su pulsacin si es
preciso, se de#uel#e en ,M (,E cdigo de rastreo ,2 cdigo ,8"::); con la 3uncin 1 (,E(1 al llamar a :D; 1/h) se
de#uel#e tambi>n en ,M el car-cter del bu33er pero sin sacarlo (habr- que llamar de nue#o con ,E(0), aunque en este caso
no se espera a que se pulse una tecla (si el bu33er estaba #aco se retorna con R1(1 en el registro de estado)! En los equipos
con soporte para teclado e)pandido e)isten adem-s las 3unciones 10h 11h (correspondientes a la 0 1) que permiten
detectar alguna tecla m-s (como 111 11+) di3erenciar entre las e)pandidas las que no lo son al no con#ertir los cdigos
0E0h en 0, as como la 3uncin & (introducir caracteres en el bu33er)!
Co(<-a'-o)+ )+p)'-al)+ *) t)'la+.
- 5HE,@$ se obtiene pulsando ";H2-9,C8E en los teclados e)pandidos (";H2-8"HF22 2F"@ en los no e)pandidos)! El
controlador del teclado introduce una palabra a cero en el bu33er e in#oca la interrupcin 15h! 2os programas pueden
interceptar esta interrupcin para realizar ciertas tareas crticas antes de terminar su e7ecucin (ciertas rutinas del 6F8,
b-sicamente las de impresin por pantalla, detectan 5HE,@ abortan el programa en curso)!
- 9,C8E$ se obtiene con dicha tecla o bien con ";H2-DCA 2F"@ (teclados no e)pandidos); pro#oca que el ordenador se
detenga hasta que se pulse una tecla no modi3icadora (ni 8E:1;, ni ,2;, etc!), tecla que ser- ignorada pero ser#ir- para
abandonar la pausa! 2a pausa es interna a la rutina de control del teclado!
- 9;H 8"H (8E:1; con el (S) del teclado num>rico en teclados no e)pandidos)$ #uelca la pantalla por impresora al e7ecutar
una :D; &!
- 8?8 HET$ al pulsarla genera una :D; 1&h (,M(.&00h) al soltarla otra :D; 1&h (,M(.&01h)!
- ";H2-,2;-6E2$ el controlador del teclado coloca la palabra 1+%4h en 0040h$00'+h (para e#itar el chequeo de la memoria)
salta a la direccin 01111h$0 reinicializando el ordenador!
- ,2;-tecladoZnum>rico$ manteniendo pulsada ,2; se puede teclear en el teclado num>rico un #alor num>rico en decimal;
al soltar ,2; el cdigo ,8":: que representa se introducir- en el bu33er! El controlador del teclado almacena en 40h$19h el
n0mero en proceso de 3ormacin$ cada #ez que llega un nue#o dgito multiplica el contenido anterior por 10 se lo suma! ,l
soltar ,2;, se hace 40h$19h(0!
D)t)''-. *) +opo8t) pa8a t)'la*o ),pa*-*o.
Dormalmente no ser- necesario distinguir entre un teclado e)pandido o est-ndar, aunque en algunos casos habr- que
tener en cuenta la posible pulsacin de una tecla e)pandida su cdigo 0E0h asociado! En todo caso, el bit 4 de
0040h$009/h indica si el teclado es e)pandido; sin embargo es suicida 3iarse de esto es m-s seguro chequear por otros
medios la presencia de 3unciones de la 5:F8 para teclado e)pandido antes de usarlas! En teora, las 5:F8 de ,; del 1& de
no#iembre de 19.& en adelante soportan las 3unciones &, 10h 11h; los de M; a partir del 10 de enero de 19./ soportan la
10h la 11h! 8in embargo, en la pr-ctica todas ellas normalmente est-n disponibles tambi>n en cualquier m-quina m-s
antigua si tiene instalado un @E?5 e3iciente, #enga equipada o no con teclado e)pandido! 9or ello, lo ideal es chequear la
presencia de estas 3unciones por otros procedimientos! 9or e7emplo$ llamar a la 3uncin 1+h con ,2(0! 9or desgracia, si la
3uncin no est- implementada no de#uel#e el acarreo acti#o para indicar el error! 9ero ha un truco$ si el resultado sigue
siendo ,M(1+00h, las 3unciones de teclado e)pandido no est-n soportadas! Esto se debe a que al no estar implementada la
3uncin, nadie ha cambiado el #alor de ,M$ adem-s, en caso de estar implementada no podra de#ol#er 1+00h porque ello
signi3icara una contradiccin entre ,E ,2!
AFL ,M,1+00h
:D; 1/h ; in#ocar 3uncin teclado e)pandido
"A9 ,M,1+00h
[E noZe)pandido ; 3uncin no soportada
[A9 siZe)pandido ; 3uncin soportada
$o+-<-l-*a*)+ a;a>a*a+.
2a rutina de la 5:F8 del ,; ( de los @E?5) que lee el bu33er del teclado, cuando no ha teclas tiene que esperar por
las mismas e7ecuta de manera regular la 3uncin 90h (,E(90h) de la interrupcin 1&h indicando una espera de teclado al
llamar (,2(+)! 6e esta manera, un hipot>tico a#anzado sistema operati#o podra apro#echar ese tiempo muerto para algo
m-s 0til! ,s mismo, cuando un car-cter acaba de ser introducido en el bu33er del teclado, se e7ecuta la 3uncin 91h para
indicar que a ha 3inalizado la entrada ha caracteres disponibles! En general, estas caractersticas no son 0tiles en el
entorno 6F8 , por otra parte, han sido de3icientemente normalizadas! 9or e7emplo, al acentuar incorrectamente se generan
dos caracteres (adem-s del 3amiliar pitido)$ el @E?5 del A8-6F8 slo e7ecuta una llamada a la :D; 1&h con la 3uncin 91h
(pese a haber introducido dos caracteres en el bu33er) el de 6H-6F8 hace las dos llamadas!!!
2o que s puede resultar m-s interesante es la 3uncin de intercepcin de cdigo del teclado$ las 5:F8 de ,; no
demasiado antiguas el programa @E?5, tras leer el cdigo de rastreo en ,2, acti#an el acarreo e7ecutan inmediatamente
la 3uncin 41h de la :D; 1&h para permitir que aluien se de por enterado de la tecla opcionalmente apro#eche para
manipular ,2 simular que se ha pulsado otra tecla$ ese alguien puede de#ol#er adem-s el acarreo borrado para indicar al
@E?5 que no contin0e procesando esa tecla que la ignore (en caso contrario se procedera a interpretarla normalmente)!
9ara #eri3icar si esta 3uncin est- disponible en la 5:F8 basta con e7ecutar la 3uncin 0"0h de la :D; 1&h que de#uel#e un
puntero en E8$5M comprobar que el bit 4 de la posicin direccionada por E8$W5M*&X est- acti#o! ,lternati#amente, puede
#eri3icarse la presencia del programa @E?5, lo que tambi>n permite emplear esta 3uncin en los 9"IM;, aunque es m-s
arriesgado! 9ara detectar la presencia del @E?5 del A8-6F8 en memoria basta con llamar a la interrupcin +1h con
,M(0,6.0h comprobar que de#uel#e ,2(011h (esta 3uncin de#uel#e la #ersin del @E?5 en 5M un puntero a un -rea
de datos en E8$6:)! W6H-6F8 usa ,M(0,600hX!
Co+-*)8a'-o)+ :-al)+.
"on#iene seGalar que los teclados de ,; pueden generar interrupciones aunque no se pulsen teclas, normalmente para
de#ol#er una seGal de reconocimiento cuando alguien les ha en#iado algo -por e7emplo, la 5:F8 puede en#iar un comando
para cambiar los ledYs-; por ello, en el momento m-s insospechado puede producirse una :D; 9 con el cdigo de rastreo
01,h, la secuencia de interrupciones generada por las teclas que tienen asociado un led en los ,;, debido a los cdigos
01,h, no es e)actamente id>ntica a la de los M;, aunque se trata de un detalle poco rele#ante -incluso para quienes
pretendan hacer algo especial con estas teclas-! ;ambi>n es con#eniente indicar que en los ,; se puede leer puerto del
teclado, para a#eriguar la 0ltima tecla pulsada o soltada, en casi cualquier momento -por e7emplo, peridicamente desde la
interrupcin del temporizador-! 6e todas 3ormas, esta pr-ctica tiene e3ectos secundarios debidos al mal diseGo del so3tKare
del sistema de los ,; (tales como teclas shi3t que se enganchan, como si se quedaran pulsadas, numeritos que aparecen al
pulsar los cursores e)pandidos, etc!)! ,dem-s, en los M; slo se obtendr- una lectura correcta inmediatamente despu>s de
producirse la interrupcin del teclado antes de en#iar la correspondiente seGal de reconocimiento al mismo -por tanto, no
desde una interrupcin peridica-! ;odo esto desaconse7a la lectura del puerto del teclado desde cualquier otro sitio que no
sea :D; 9, sal#o contadas e)cepciones!
9or 0ltimo indicar que en los ,; se puede modi3icar el estado de ",98 2F"@, DCA 2F"@ o 8"HF22 2F"@ por el
simple procedimiento de alterar el bit correspondiente en 40h$1'h; dicho cambio se #er- re3le7ado en los ledYs cuando el
usuario pulse una tecla o el programa lea el teclado con cualquier 3uncin -en la pr-ctica, de manera casi instant-nea-! 8in
embargo, para aplicar esta t>cnica es aconse7able #eri3icar que se trata de un ,; porque en los 9"IM; el led -si e)iste- no se
actualiza pasa a indicar una in3ormacin incorrecta! Healmente, en los M;, el control de los led lo lle#a la propia circuitera
del teclado de manera independiente al ordenador!
'!&!%! - ,2;F D:LE2!
El acceso al teclado a alto ni#el puede realizarse a tra#>s de las 3unciones 1, /, ', . 0,h del 6F8, consider-ndolo como
dispositi#o de entrada est-ndar! ,lgunas de estas 3unciones, si de#uel#en un 0, se trata de una tecla especial la siguiente
lectura de#uel#e el cdigo secundario! El 6F8 utiliza las 3unciones 5:F8!
2.0. - LOS DISCOS.
'!/!1! - E8;HC";CH, 1:8:",!
2os discos son el principal medio de almacenamiento e)terno de los ordenadores compatibles! 9ueden ser unidades de
disco 3le)ible, remo#ibles, o discos duros -3i7os-! "onstan b-sicamente de una super3icie magn>tica circular di#idida en pistas
conc>ntricas, cada una de las cuales se subdi#ide a su #ez en cierto n0mero de sectores de tamaGo 3i7o! "omo normalmente
se emplean ambas caras de la super3icie, la unidad m-s elemental posee en la actualidad dos cabezas de lecturaIescritura,
una para cada lado del disco! 2os tres par-metros comunes a todos los discos son, por tanto$ el n0mero de cabezas, el de
pistas el de sectores! El t>rmino cilindro i hace re3erencia a la totalidad de las pistas i de todas las caras! 5a7o 6F8, los
sectores tienen un tamaGo de &1+ btes (tanto en discos duros como en disquetes) que es di3cil cambiar (aunque no
imposible)! 2os sectores se numeran a partir de 1, mientras que las pistas las caras lo hacen desde 0! El 6F8 con#ierte
esta estructura 3sica de tres par-metros a otra$ el n0mero de sector l!ico, que se numera a partir de 0 (los sectores 3sicos
les denominaremos a partir de ahora sectores BI%S para distinguirlos de los sectores lgicos del 6F8)! 9ara un disco
de S(CT)IST4 sectores BI%S por pista 7=$C4B cabezas, los sectores lgicos se relacionan con la estructura 3sica por
la siguiente 3rmula$
8ector lgico ( (sectorZ5:F8 - 1) * cara S 8E";9:8;, * cilindro S 8E";9:8;, S DCA",5 - M1
Es decir, el 6F8 recorre el disco empezando la pista 0 (la e)terior, la m-s ale7ada del centro) por la cara o cabezal 0,
recorriendo todos los sectores; luego a#anza una cara recorre de nue#o todos los sectores; despu>s pasa al siguiente
cilindro!!! repite de nue#o el proceso! 6e esta manera, #arios cabezales podran -hipot>ticamente- leer bloques de
in3ormacin consecuti#os simult-neamente! En los disquetes, M1(0, pero en los discos duros se resta un cierto 3actor de
compensacin M1, a que >stos pueden estar di#ididos en #arias particiones la que usa el 6F8 puede no estar al principio
del mismo! En general, un disco duro di#idido en #arias particiones de tipo 6F8 determina #arias unidades lgicas de disco,
cada una de las cuales dispone de un con7unto de sectores lgicos numerados a partir de 0 un 3actor de compensacin
propio para la 3rmula! 2as siguientes 3rmulas trans3orman sectores 6F8 en sus correspondientes 5:F8$
8ectorZ5:F8 ( (sector AF6 8E";9:8;,) * 1
"ara ( (sector I 8E";9:8;,) AF6 DCA",5
"ilindro ( sector I (8E";9:8;, S DCA",5) * M+
"omo la particin del 6F8 no suele empezar en el cilindro 0 (reser#ado en gran parte para la tabla de particiones) sino
m-s bien en el 1 en otro posterior (cuando ha m-s particiones antes que la del 6F8) ser- necesario aGadir un cierto #alor
adicional de compensacin M+ a la 0ltima 3rmula para calcular el cilindro e3ecti#o; esto es as porque en la pr-ctica las
particiones suelen empezar acabar ocupando cilindros enteros exactos (aunque en realidad, dada la arquitectura de la
tabla de particin, podran empezar acabar no slo en un determinado cilindro sino tambi>n en cierto sector cara del
disco, pero no es 3recuente)! M1 M+ se obtienen consultando e interpretando la tabla de particiones o el sector de arranque!
'!/!+! - ",5ER, 0! 9:8;, 0! 8E";FH 1!
El primer sector :+-'o de todos los discos contiene in3ormacin especial (el sectorZ5:F8 1 del cilindro 0 cabezal 0)!
;anto en disquetes como en discos duros, contiene un pequeGo programa que se encarga de poner en marcha el ordenador$
es el sector de arranque de los disquetes, o bien el cdigo de la tabla de particiones de los discos duros! En este 0ltimo
caso, ese programa realiza una tarea mu sencilla$ consulta la tabla de particiones ubicada en ese mismo sector, determina
cu-l es la partici!n activa dnde empieza acaba; a continuacin carga el sector l./-'o 0 de esa particin (sector de
arranque) lo e7ecuta! En los disquetes no e)iste este paso intermedio$ el sector 3sico 0 del disquete, en terminos absolutos,
es a el sector de arranque no el de particin! Esto es as porque los disquetes contienen poca in3ormacin son baratos,
no siendo preciso particionarlos para compartirlos con #arios sistemas operati#os! El programa ubicado en el sector de
arranque busca el 3ichero oculto del sistema :5A5:F!"FA o :F!8?8, lo carga le entrega el control! El programa contenido
en este 3ichero cargar- a su #ez :5A6F8!"FA o A86F8!8?8, el cual a su #ez cargar- 3inalmente el int>rprete de
comandos (normalmente, "FAA,D6!"FA)!
S 1ormato de la tabla de particin de los discos duros$
1/0; Esta tabla comienza en un o33set 15Eh del sector (al principio est- el cdigo e7ecutable); cada particin de las 4
posibles ocupa 1/ btes; al 3inal de las cuatro est- la marca 0,,&&h, ubicada en el o33set 11Eh, que indica que la tabla es
#-lida! 2os 1/ btes que la 3orman se interpretan como indica el cuadro$
*-----------------------------------------------------------------------------*
e bte 0$ 0 para particin inacti#a, .0h en la de arranque! e
e bte 1$ cabeza donde comienza la particin! e
e bte +$ bits 0 al &$ sector de inicio de la particin; /, '$ parte alta del e
e n0mero de cilindro! e
e bte %$ parte ba7a del n0mero de cilindro de inicio de la particin! e
e bte 4$ tipo de particin, las m-s comunes son 0$ Do usada; 1$ 6F8-1+ (1,; e
e 1+ bits); 4$ 6F8-1/ (1,; 1/ bits); &$ 6F8 E)tendida; /$5:B6F8 (m-s e
e de %+Ab); '$ F8I+ E918 UinD; D;18; 0,h$ F8I+ 5oot Aanager; 05h$ e
e %+-bit 1,; Uin9& (0"h con 25,); 0Eh 01h (como 0/ 0& pero con e
e 25,); .1h 2inu); .+h 2inu) sKap; .%h$ 2inu) nati#e; 0,&h$ 1ree586 e
e o 586I%./; 01+h$ particin secundaria (no estudiada en este libro)! e
e bte &$ cabeza donde termina la particin! e
e bte /$ bits 0 al &$ sector de 3in de la particin; /, '$ parte alta del e
e n0mero de cilindro! e
e bte '$ parte ba7a del n0mero de cilindro de 3in de la particin! e
e btes . al 11$ 6oble palabra que indica el sector relati#o (en todo el e
e disco) en que comienza la particin, e)presado en sectores! e
e btes 1+ al 1&$ 6oble palabra con el tamaGo de esa particin en sectores! e
*-----------------------------------------------------------------------------*
?o8(ato *) la TABLA DE $ARTICIN
Eabitualmente, las particiones suelen empezar en el segundo cabezal del cilindro 0, con lo que toda la primera pista 3sica
del disco duro est- #aca! 2ugar ideal para #irus, algunos 3abricantes han utilizado esta interesante caracterstica para
me7orar el arranque, colocando una 3alsa tabla de particin que muestre un men0 en pantalla cargue despu>s la particin
de #erdad, permitiendo tambi>n m-s de 4 particiones! 8in embargo, estas maniobras suelen reducir la compatibilidad!
E)isten tambi>n cdigo de particiones so3isticado que permite seleccionar una de las 4 particiones manteniendo pulsada una
tecla en el arranque, sin tener que andar e7ecutando 16:8@ para seleccionar la particin acti#a!!! Nlo que se puede hacer con
400 btes de cdigoO! Healmente, la arquitectura global de las particiones de un equipo (en particular si tiene m-s de 4, una
mezcla de sistemas operati#os Io #arios discos duros), puede llegar a ser comple7a$ practquese con un buen editor de
disco para aprender m-s (e7! el 6:8@E6:; de las Dorton Ctilities o las 9"-;ools)!
2as particiones e)tendidas lle#an su propio sector de particin adicional, en el que no ha cdigo de programa sino, en su
lugar, una lista de dispositi#os! Ea dos entradas por cada dispositi#o$ la primera indica el tipo (1-1,;1+, 4-1,;1/); la
segunda entrada apunta al siguiente dispositi#o (caso de e)istir) o es 0 (no ha m-s dispositi#os)! El 6F8 4!0 posteriores
eliminaron la limitacin de los %+ Ab en las particiones el so3tKare actual, a actualizado, no da problemas con los discos
de m-s de %+ Ab! 9or ello, en discos de m-s de %+ 40 Ab lo normal es instalar 6F8 4!0 superior!
S 1ormato del sector de arranque$
En el sector de arranque, adem-s del sencillo programa de puesta en marcha del sistema, ha cierta in3ormacin 0til
acerca de las caractersticas del disco o particin! 2os primeros % btes no son signi3icati#os$ contienen el cdigo de
operacin de una instruccin [A9 que salta a donde realmente comienza el cdigo, aunque con#iene que dicha instruccin
de salto est> al principio del sector de arranque para que algunos sistemas #aliden dicho sector (es #-lido un salto corto
seguido de DF9 o un salto completo de % btes)! , partir del cuarto (o33set %) se puede encontrar la in3ormacin #-lida! En el
sector de arranque del disquete est- contenido el 595 (5ios 9arameter 5locP) que analizaremos m-s tarde!
*-----------------------------------------------------------------------------------------------------------------------*
e o33set % (. btes)$ :denti3icacin del sistema (e7!, V:5A %!%V) e
e o33set 11 (1 palabra)$ 5tes por sector, e7! &1+! e
e o33set 1% (1 bte)$ 8ectores por cluster (e7! +) e
e o33set 14 (1 palabra)$ 8ectores reser#ados al principio (1 en diquettes) e
e o33set 1/ (1 bte)$ D0mero de copias de la 1,; (+ normalmente) e
e o33set 1' (1 palabra)$ D0mero de entradas al directorio raz (11+ en discos de %/0 @b) e
e o33set 19 (1 palabra)$ D0mero total de sectores del disco (0 en discos de m-s de %+ Ab) e
e o33set +1 (1 bte)$ 5te de tipo de disco (#>ase tabla m-s adelante) e
e o33set ++ (1 palabra)$ D0mero de sectores ocupados por cada 1,; e
e o33set +4 (1 palabra)$ D0mero de sectores por pista e
e o33set +/ (1 palabra)$ D0mero de cabezas (+ en disquetes de doble cara) e
e o33set +. (+ palabras)$ D0mero de sectores especiales reser#ados! Dota$ slo se debe considerar la primera mitad de e
e esta doble palabra en #ersiones del sistema %!%0 o anteriores (no ha problemas con 6H-6F8, e
e que en todas sus #ersiones, hasta la /!0 incluida, es un 6F8 %!%1)! El #alor de este campo e
e depende de la posicin relati#a que ocupe la particin dentro del disco duro (ser- 0 en los e
e disquetes), este #alor ha de sumarse al del n0mero de sector del 6F8 antes de traducirlo a e
e un n0mero de sector de la 5:F8! e
e o33set %+ (+ palabras)$ D0mero total de sectores del disco en discos de m-s de %+ Ab (esta in3ormacin slo debe e
e obtenerse de aqu si la palabra ubicada en el o33set 19 es cero)! e
e o33set %/ (1 bte)$ D0mero de unidad 3sica (a partir del 6F8 4!0)! e
e o33set %' (1 bte)$ Heser#ado! e
e o33set %. (1 bte)$ #alor +9h desde 6F8 4!0 (marca de #alidacin que indica que los btes ubicados desde el e
e o33set %/ al o33set /1 est-n de3inidos)! e
e o33set %9 (+ palabras)$ D0mero de serie del disco (a partir de 6F8 4!0)! e
e o33set 4% (11 btes)$ ;tulo del disco (desde 6F8 4!0); por de3ecto se inicializa con VDF D,AE V, aunque tanto e
e el 6F8 4!0 como el &!0 /!M siguen empleando adem-s las tradicionales etiquetas de #olumen!e
e o33set &4 (. btes)$ 8istema de 3icheros (a partir de 6F8 4!0)$ puede ser V1,;1+ V o V1,;1/ V! e
*-----------------------------------------------------------------------------------------------------------------------*
?o8(ato *)l SECTOR DE ARRAN4UE
El bte del tipo de disco (o33set +1) intenta identi3icar el tipo de disco, aunque no lo consigue en muchos casos dada la
ilgica utilizacin que se ha hecho de >l! 2a recomendacin es hacer lo que #iene haciendo el 6F8 desde la %!%0$ no hacer
caso de lo que dice este bte para identi3icar los discos! 2a 0nica e)cepcin tal #ez sea el #alor 01.h que identi3ica a los
dispositi#os no removibles$
*---------------------------------------------------------------------*
e 01Eh - discos de &r-1/0 @b (1 cara, . sectoresIpista, 40 pistas) e
e 011h - discos de &r-%+0 @b (+ caras, . sectoresIpista, 40 pistas) e
e 01"h - discos de &r-1.0 @b (1 cara, 9 sectoresIpista, 40 pistas) e
e 016h - discos de &r-%/0 @b (+ caras, 9 sectoresIpista, 40 pistas) e
e 019h - discos de &r-1,+ Ab (+ caras, 1& sectoresIpista, .0 pistas) e
e 019h - discos de %s-'+0 @b (+ caras, 9 sectoresIpista, .0 pistas) e
e 01.h - discos duros algunos #irtuales e
e 010h - discos de %s-1,44 Ab (+ caras, 1. sectoresIpista, .0 pistas) e
e 010h - discos de %s-+,.. Ab (+ caras, %/ sectoresIpista, .0 pistas) e
e 010h - restantes 3ormatos de disco e
*---------------------------------------------------------------------*
T-po+ *) D-+'o+
'!/!%! - 2, 1,;!
6espu>s del sector de arranque, aparecen en el disco una serie de sectores que constituen la ;abla de 2ocalizacin de
1icheros (1ile ,location ;able o 1,;)! "onsiste en una especie de mapa que indica qu> zonas del disco est-n libres, cu-les
ocupadas, dnde est-n los sectores de3ectuosos, etc! Dormalmente ha dos copias consecuti#as de la 1,; (#>ase el o33set
1/ del sector de arranque), a que es el -rea m-s importante del disco de la que dependen todos los dem-s datos
almacenados en >l! Do de7a de resultar e)traGo que ambas copias de la 1,; est>n 3sicamente consecuti#as en el disco$ si
accidentalmente se estropeara una de ellas (por e7emplo, raando con un bolgra3o el disco) lo m-s normal es que la otra
tambi>n resultara daGada! En general, muchos programas de chequeo de disco no se molestan en #eri3icar si ambas 1,;
son id>nticas (empezando por algunas #ersiones de "E@68@)! 9or otra parte, hubiera sido me7or eleccin haberla colocado
en el centro del disco$ dada la 3recuencia de los accesos a la misma, de cara a localizar los di3erentes 3ragmentos de los
3icheros, ello me7orara notablemente el tiempo de acceso medio! ,unque cierto es que los cach>s de disco los bu""ers del
con3ig!ss pueden hacer casi milagros!!! a costa de memoria!
,ntes de seguir adelante, con#iene hacer un pequeGo par>ntesis e)plicar el concepto de cluster$ un cluster es la unidad
mnima de in3ormacin a la que accede el 6F8, desde el punto de #ista lgico! Dormalmente consta de #arios sectores (#er
o33set 1% del sector de arranque)$ dos en un disquete de %/0 @b, uno en un disquete de alta densidad, entre 4 1/
-normalmente- en un disco duro! El disco queda di#idido, por tanto, en un cierto n0mero de clusters! 2a 1,; es realmente un
mapa que contiene 1+ 1/ bits -como #eremos- por cada cluster, indicando su estado$
cluster libre$ #alor 0
cluster de3ectuoso$ #alores 011'h ( 0111'h)!
cluster no utilizable$ #alores 011& al 011/h ( 0111& al 0111/h)!
0ltimo cluster del 3ichero$ #alor 011. al 0111h ( 0111.h al 01111h)!
otro #alor$ puntero al siguiente cluster del 3ichero!
2os 3icheros en disco no siempre ocupan posiciones contiguas$ normalmente est-n m-s o menos 3ragmentados debido a
que se apro#echan los huecos de7ados por otros 3icheros borrados, de ah el auge de los programas que compactan los
discos con ob7eto de acelerar el acceso a los datos! 9or tanto, cada 3ichero consta de un cluster inicial indicado en la entrada
del directorio -como se #er-- que inicia una cadena tan larga como la longitud del mismo (e)presada en clusters), e)istiendo
normalmente un #alor 0111h 01111h en el 0ltimo cluster para seGalar el 3inal (del 011.h al 011Eh del 0111.h al
0111Eh no se emplean)! "onsultando la 1,; se puede determinar la ubicacin de los 3ragmentos en que est-n 3sicamente
di#ididos los 3icheros en los discos, as como qu> zonas est-n a0n disponibles cu-les son de3ectuosas en el mismo! 2os
cluster se numeran a partir de +, a que las dos primeras entradas en la 1,; est-n reser#adas para el sistema! 2os clusters
hacen re3erencia e)clusi#a a la zona de datos$ el -rea que #a detr-s del sector de arranque, la 1,; el directorio! 9or ello,
en un disquete de %/0 @b, con clusters de 1 @b %&4 @b libres para datos, ha %&4 clusters (numerados de + a %&&) los /
@b misteriosos que 3altan son el sector de arranque, las dos 1,; -como #eremos despu>s- el directorio raz! 9uede ser
#-lida, por e7emplo, la siguiente 1,; de 1+ bits habiendo un 3ichero , que ocupe los clusters +, %, & /$
El)()to *) la ?AT 5alo8 It)8p8)ta'-.
0 116 El disco es de tipo 016h (despreciar restantes bits)
1 111 Entrada no utilizada
+ 00% El siguiente cluster del 3ichero , es el %
% 00& El siguiente cluster del 3ichero , es el &
4 11' "luster de3ectuoso
& 00/ El siguiente cluster del 3ichero , es el /
/ 111 Este es el 0ltimo cluster del 3ichero ,
' 01% El siguiente cluster del 3ichero 5 es el 01%
!!! !!!
"omo se #e, el primer bte de la primera entrada a la 1,; es inicializado con el mismo #alor que el bte de tipo de disco
del sector de arranque! 2os restantes bits de las dos primeras entradas suelen estar todos a 1! 9ara determinar el n0mero de
clusters del disco, ha de restarse del n0mero total de sectores la ci3ra correspondiente al n0mero de sectores reser#ados
(normalmente 1 en los disquetes, correspondiente al sector de arranque), los que ocupa la 1,; los empleados por el
directorio raz (que se #er- m-s adelante); a continuacin se di#ide ese n0mero de sectores de datos resultante por el
n0mero de sectores por cluster!
El hecho de emplear 1,;Ys de 1+ bits es debido a que con menos bits (e7!, un bte) slo podra haber unos +&0 clusters
en el disco! En un disco de 1,+ Ab ello signi3icara que la unidad mnima de in3ormacin sera 1+00I+&0 ( & @b$ el 3ichero
m-s pequeGo (de 1 bte) ocupara N& @bO! Empleando 1,;Ys de 1/ bits se podran hacer clusters incluso de tamaGo menor
que el sector (menos de &1+ btes), apro#echando m-s el espacio del disco! 8in embargo, ello hara que la propia 1,;
ocupase demasiado espacio en el disco! 9or ello, en los disquetes se emplean 1,;Ys de 1+ bits (1 bte medio)$ para un
programa en cdigo m-quina ello no ralentiza los c-lculos (aunque al ser humano no se le de mu bien traba7ar con medios
btes)! En la pr-ctica, se toman palabras de 1/ bits se desprecian los 4 bits m-s signi3icati#os en los clusters pares los 4
menos signi3icati#os en los impares!
, continuacin se listan dos rutinas que permiten acceder a una 1,; de 1+ bits pre#iamente cargada en memoria, con
ob7eto de consultar o modi3icar alguna entrada! E#identemente, despu>s habr- que #ol#er a grabar la 1,; en disco, tantas
#eces como copias de la misma e)istan en >ste! 2as rutinas necesitan que la 1,; est> completamente cargada en memoria,
lo cual no es un requerimiento demasiado costoso, habida cuenta de que no puede ocupar m-s de 40.& S 1,& ( /1+. btes!
; SSSSSSSSSSSS Escribir un elemento en una 1,; de 1+ bits
; Entrada$ ,M ( posicin de dicho elemento
; 68$5M ( 1,; completamente cargada en memoria
; 6M ( nue#o #alor de dicho elemento
poPeZ3at 9HF"
9C8E ,M ; preser#ar registros
9C8E 5M
9C8E 6M
,66 5M,,M ; 5M ( 5M * cluster
8EH ,M,1 ; ,M ( cluster I +
9C8E1 ; "1 ( 1 si impar
,66 5M,,M ; 5M ( 5M * cluster S 1,&
AFL ,M,W5MX ; ,M ( palabra con dato 1+ bits
9F91
[" poPeZ3atZimp
,D6 ,M,1111000000000000b ; preser#ar la otra entrada
[A9 poPeZ3atZoP
poPeZ3atZimp$ ,D6 ,M,0000000000001111b ; preser#ar la otra entrada
9C8E "M
AFL "2,4
8E2 6M,"2 ; colocarlo$ 4 bits a la izda
9F9 "M
poPeZ3atZoP$ FH ,M,6M ; <mezclar=
AFL W5MX,,M ; nue#o #alor en la 1,;
9F9 6M
9F9 5M
9F9 ,M
HE; ; retorno sin alterar registros
poPeZ3at ED69
; SSSSSSSSSSSS 2eer un elemento de una 1,; de 1+ bits
; Entrada$ ,M ( posicin de dicho elemento
; 68$5M ( 1,; completamente cargada en memoria
; 8alida$ 6M ( #alor de dicho elemento
peePZ3at 9HF"
9C8E ,M ; preser#ar registros
9C8E 5M
,66 5M,,M ; 5M ( 5M * cluster
8EH ,M,1 ; ,M ( cluster I +
9C8E1 ; "1 ( 0 si par
,66 5M,,M ; 5M ( 5M * cluster S 1,&
AFL 6M,W5MX
9F91
[D" peePZ3atZpar
9C8E "M
AFL "2,4
8EH 6M,"2 ; 6M(6MI1/$ si 6M()z0, 6M(0)z
9F9 "M
peePZ3atZpar$ ,D6 6E,00001111b ; borrar posible dgito izdo
9F9 5M
9F9 ,M
HE; ; retornar slo 6M modi3icado
peePZ3at ED69
;al #ez, en 3uturos disquetes de ele#ada capacidad sea necesario pasar a una 1,; de 1/ bits, aparecida con el 6F8 %!0,
que es la usada por todos los discos duros e)cepto el de 10 Ab del M; original de :5A! "on una 1,; de 1+ bits el nb de
cluster m-s alto posible es 40.&, que se corresponde con un disco de 40.4 clusters (numerados de + a 40.&)! En principio,
no e)iste ninguna manera sencilla de a#eriguar el tipo de 1,; de un disco, a que el 3abricante ol#id incluir un bte de
identi3icacin al e3ecto! 2a documentacin publicada es contradictoria en las di#ersas 3uentes que he consultado, en todas
es por desgracia incorrecta (unos dicen que la 1,; 1/ comienza a partir de 40'. clusters, otros que a partir de 40./, otros
con3unden el n0mero de clusters con el n0mero m-s alto de cluster!!!)! 8in embargo, todas las #ersiones del 6F8
comprobadas (A8-6F8 %!1, %!%, 4!0, &!0 6H-6F8 &!0 /!0) operan con una 1,; de 1/ bits en discos de 40.& clusters
(inclusi#e) en adelante; esto es, a partir de 40./ como n0mero de cluster m-s alto! Esto puede #eri3icarse 3-cilmente
creando discos #irtuales con 40.4I40.& clusters, copiando algunos 3icheros mirando la 1,; con alg0n programa de utilidad
(a simple #ista se distingue si las entradas son de 1+ 1/ bits)! 9or desgracia, sal#o en A8-6F8 %!% en 6H-6F8 /!0, los
comandos "E@68@ del sistema consideran errneamente que los discos de 40.&, 40./ 40.' clusters Nposeen una 1,;
de 1+ bitsO, lo cual resulta adem-s completamente absurdo, dado que 40.' (011'h) es la marca de cluster de3ectuoso en
una 1,; de 1+ bits Nen ning0n caso podra ser un n0mero de cluster cualquieraO! 8in embargo, pese a este problema de
"E@68@, los discos con m-s de 40.4 clusters han de ser diseGados con una 1,; de 1/ bit, a que es mucho m-s gra#e
tener problemas con el 6F8 que con "E@68@! Ftra solucin es procurar no crear discos de ese n0mero crtico de clusters,
o con3iar que el usuario no e7ecute el casi ol#idado "E@68@ sobre ellos! 9or 3ortuna, los discos normales no est-n por ahora
en la 3rontera crtica entre la 1,; de 1+ la de 1/ bits, aunque con los discos #irtuales s se pueden crear unidades con esos
tamaGos crticos$ la casi totalidad de los discos #irtuales del mercado tienen problemas en estos casos! En algunos discos
duros se puede determinar tambi>n el tipo de 1,; consultando la tabla de particiones, aunque no es el m>todo m-s
con#eniente! 6ebe tener en cuenta el lector que manipular una 1,; sin conocer su tipo supone destrozar la in3ormacin
almacenada en el disco! 8in embargo, tampoco ha que tener tanto miedo$ lo que s puede resultar peligroso es llegar al
e)tremo de preguntar al usuario el tipo de 1,;!!!
,hora puede surgir la pregunta$ si la 1,; mantiene una cadena que indica cmo est- distribuido un 3ichero en el disco,
cdnde se almacena el inicio de esa cadena, esto es, la primera entrada en la 1,; del 3ichero]!
'!/!4!- E2 6:HE";FH:F H,QR!
:nmediatamente despu>s de la 1,; su(s) r>plica(s) de seguridad #iene el directorio raz! 6etr-s de >ste a #ienen los
clusters conteniendo la in3ormacin del disco propiamente dicha! El directorio consta de %+ btes por cada
3icheroIsubdirectorio (los subdirectorios no son m-s que un tipo especial de 3ichero)! En los discos de %/0 @b, por e7emplo, el
directorio se e)tiende a lo largo de ' sectores (%&.4 btes ( 11+ entradas como m-)imo)! El tamaGo ubicacin del
directorio pueden obtenerse del sector de arranque, como se #io al principio! 2a in3ormacin almacenada en los %+ btes es
la siguiente$
*-----------------------------------------------------------* *--------------------------------------------------*
e o33set 0 (. btes)$ Dombre del 3ichero e e bit 0$ acti#o si el 3ichero es de slo lectura e
e o33set . (% btes)$ E)tensin del nombre del 3ichero e e bit 1$ acti#o si el 3ichero es oculto e
e o33set 11 (1 bte)$ 5te de atributos e e bit +$ acti#o si el 3ichero es de sistema e
e o33set 1+ (10 btes)$ Heser#ado (9,88UFH6 ci3rada 6H-6F8) e e bit %$ acti#o si esa entrada de directorio es e
e o33set ++ (+ btes)$ EoraS+04. * minutosS%+ * segundosI+ e e la etiqueta de #olumen e
e o33set +4 (+ btes)$ (aGo-19.0)S&1+ * mesS%+ * da e e bit 4$ acti#o si es un subdirectorio e
e o33set +/ (+ btes)$ 9rimera entrada en la 1,; e e bit &$ bit de archi#o usado por 5,"@C9 HE8;FHE e
e o33set +. (4 btes)$ ;amaGo del 3ichero en btes e e bits /,'$ no utilizados e
*-----------------------------------------------------------* *--------------------------------------------------*
ENTRADA DE DIRECTORIO BYTE DE ATRIBUTOS
En el bte de atributos, #arios bits pueden estar acti#os a un tiempo! El atributo de sistema no tiene un signi3icado en
particular, es una reliquia heredada del "9IA (los 3icheros ocultos del sistema lo tienen acti#o)! En un mismo disco slo
puede haber una entrada con el bit % acti#o; adem-s, en este caso se interpretan el nombre la e)tensin como un 0nico
con7unto de 11 caracteres! 2as entradas de tipo subdirectorio (bit 4 del bte de atributos acti#o) tienen un #alor cero en el
campo de tamaGo (o33set +.)$ el tamaGo de un 3ichero subdirectorio est- determinado por el n0mero de entradas que ocupa
en la 1,; (en la pr-ctica, esto sucede con cualquier otro 3ichero, aunque si no es de directorio en el o33set +. esta
in3ormacin se indica con precisin de btes)!
El nombre del 3ichero puede comenzar por 0E&h, lo que indica que el 3ichero que estu#o ah ha sido borrado! 8i empieza
por +Eh (cdigo ,8":: del punto (!)) por +Eh, +Eh (dos puntos consecuti#os) se trata de una entrada que re3erencia a un
3ichero subdirectorio!
'!/!&! - 2F8 8C56:HE";FH:F8!
"omo hemos #isto, un subdirectorio en principio puede ser una simple entrada del directorio raz! El subdirectorio,
3sicamente, es a su #ez un 3ichero un tanto especial$ contiene datos binarios !!! que son nada m-s nada menos que otras
entradas de directorio para otros 3icheros, de %+ btes como siempre! 6entro de cada subdirectorio ha al menos dos
entradas especiales$ un 3ichero con un nombre punto (!) que re3erencia al propio subdirectorio -que as puede
autolocalizarse- otro con doble punto (!!) que re3erencia al directorio padre -del que cuelga- siendo posible, gracias a ello,
retroceder cuanto se desee por el -rbol de directorios sin necesidad de que todos los caminos partan del raz! 8i la primera
entrada en la 1,; del 3ichero (!!) es un 0, quiere decir que ese subdirectorio cuelga del raz, de lo contrario apuntar- al
primer cluster del 3ichero subdirectorio padre!
El tamaGo de un "ichero subdirectorio es ilimitado -sin e)ceder, e#identemente, la capacidad del disco-! 9or ello, en un
subdirectorio puede haber una gran cantidad de 3icheros (muchos m-s de 11+ &00) sin problemas! "ada 3ichero que se
crea en un subdirectorio aumenta el tamaGo del 3ichero subdirectorio en %+ btes! 9or ello, en un disco de %/0 @b (%&4 @b
libres) se puede crear un subdirectorio en >l se pueden introducir, en caso e)tremo, 11%+/ 3icheros (m-s el (!) el (!!)) de
tamaGo cero que parad7icamente llenaran el disco (recordar que cada entrada al directorio ocupa %+ btes)! Dormalmente
nadie suele cometer esos e)cesos! 8i en un subdirectorio haba demasiados 3icheros se borra una buena parte de los
mismos, el tamaGo del 3ichero subdirectorio debera reducirse, pero en la pr-ctica el 6F8 no se ocupa de estas pequeGeces,
habida cuenta de que los 3icheros subdirectorio son unos pequeGos islotes en el gran oc>ano disco (los usuarios m-s
tacaGos siempre pueden optar por crear un nue#o subdirectorio mo#er todos los 3icheros a >l, borrando el anterior para
recuperar el espacio libre)!
"onsiderando el nombre completo de un 3ichero, con toda la traectoria de directorios, el proceso a seguir para localizarlo
en el disco es ir recorriendo los 3icheros subdirectorio de uno en uno, hasta llegar al 3ichero subdirectorio donde est-
registrado el 3ichero , en la posicin correspondiente, obtener su punto de entrada en la 1,;!
6icho sea de paso, tal #ez sea una pena que el disco no conste de un 0nico <3ichero raz= pri#ilegiado de directorio, que
podramos denominar <subdirectorio raz=! Ello permitira tambi>n un n0mero ilimitado de entradas (en #ez de 11+, ++4, etc!)
sera m-s lgico que una ristra de sectores! 8in embargo, esta peculiar circunstancia tambi>n aparece en otros sistemas
operati#os, como el CD:M! 8us moti#os tendr-!
'!/!/! - E2 595 ? 695!
El 595 (5ios 9arameter 5locP) es una estructura de datos que contiene in3ormacin relati#a a la unidad de disco! El 595
es una pieza #ital en los controladores de dispositi#o de bloques, como #eremos en un 3uturo captulo, por lo que a
continuacin se e)pone su contenido (id>ntico a una parte del sector 0)$
*---------------------------------------------------------------------------*
e o33set 0 6U btesZporZsector e
e o33set + 65 sectoresZporZcluster e
e o33set % 6U sectoresZreser#adosZalZcomienzoZdelZdisco e
e o33set & 65 n0meroZdeZ1,;s e
e o33set / 6U n0meroZdeZentradasZenZelZdirectorioZraz e
e o33set . 6U n0meroZtotalZdeZsectores (0 con nb de sector de %+ bits) e
e o33set 10 65 bteZdescriptorZdeZmedio e
e o33set 11 6U numeroZdeZsectoresZporZ1,; e
e -- , partir del 6F8 %!0$ e
e o33set 1% 6U sectoresZporZpista e
e o33set 1& 6U n0meroZdeZcabezas e
e o33set 1' 66 n0meroZdeZsectoresZocultos e
e -- , partir del 6F8 4!0 (m-s bien 6F8 %!%1) e
e o33set +1 66 n0meroZdeZsectores (unidades con direccionamiento de e
e sector de %+ bits) e
e o33set +& 65 / 6C9 (]) (/ btes no documentados) e
e o33set %1 6U n0meroZdeZcilindros e
e o33set %% 65 tipoZdeZdispositi#o e
e o33set %4 6U atributosZdelZdispositi#o e
*---------------------------------------------------------------------------*
El 6F8 con#ierte internamente el 595 en 695 (6ri#e 9arameter 5locP), una estructura similar con m-s in3ormacin 0til!
9ara obtener el 695 de una unidad determinada, puede utilizarse la 3uncin %+h del 6F8, 1)t D8-;) $a8a()t)8
Blo'R (indocumentada); la cadena de 695s del 6F8 puede recorrerse a partir del primer 695 (obtenido con la 3uncin &+h
del 6F8, 1)t L-+t o: L-+t+, tambi>n indocumentada)!
'!/!'! - 2, 5:F8 ? 2F8 6:8TCE;E8!
Hesulta interesante conocer el comportamiento de la 5:F8 en relacin a los disquetes, a que las aplicaciones
desarrolladas ba7o 6F8 de una u otra manera habr-n de cooperar con la 5:F8 por razones de compatibilidad (o al menos
respetar ciertas especi3icaciones)! El 3uncionamiento del disquete se controla a tra#>s de 3unciones de la :D; 1%h, aunque
esta interrupcin por lo general acaba llamando a la :D; 40h que es quien realmente gestiona el disco en las 5:F8
modernas de ,;! 2as 3unciones soportadas por esta interrupcin son$ reset del sistema de disco (reset del controlador de
disquetes, en#o del comando speci"y recalibramiento del cabezal), consulta del estado del disco (obtener resultado de la
0ltima operacin), lectura, escritura #eri3icacin de sectores, 3ormateo de pistas, obtencin de in3ormacin del disco las
disqueteras, deteccin del cambio de disco, establecimiento del tipo de soporte para 3ormateo!!! algunas de estas 0ltimas
3unciones no est-n disponibles en las m-quinas 9"IM;! 2a 5:F8 se apoa en #arias #ariables ubicadas en el segmento 40h
de la memoria! Estas #ariables son las siguientes (para m-s in3ormacin, consultar el ap>ndice al 3inal del libro)$
5te 40h$%Eh
Estado de recalibramiento del disquete! Esta #ariable indica #arias cosas$ si se ha producido una interrupcin
de disquete, o si es preciso recalibrar alguna disquetera debido a un reset anterior!
5te 40h$%1h
Estado de los motores! En esta #ariable se indica, adem-s del estado de los motores de las 4 posibles
disqueteras (si est-n encendidos o no), la 0ltima unidad que 3ue seleccionada la operacin en curso sobre la
misma!
5te 40h$40h
"uenta para la detencin del motor! Este bte es decrementado por la interrupcin peridica del temporizador;
cuando llega a 0 todos los motores de las disqueteras (realmente, el 0nico que estaba girando) son detenidos!
6e7ar el motor girando unos segundos tras la 0ltima operacin e#ita tener que esperar a que el motor acelere
antes de la siguiente (si esta llega poco despu>s)!
5te 40h$41h
Estado de la 0ltima operacin$ se actualiza tras cada acceso al disco, indicando los errores producidos (0 (
ninguno)!
5tes 40h$4+
h
, partir de esta direccin, ' btes almacenan el resultado de la 0ltima operacin de disquete o disco duro! 8e
trata de los ' btes que de#uel#e el DE"'/& tras los principales comandos!
5te 40h$.5h "ontrol del soporte (,;)! Esta #ariable almacena, entre otros, la 0ltima #elocidad de trans3erencia seleccionada!
5te 40h$.1h
:n3ormacin del controlador de disquete (,;)! 8e indica si la unidad soporta .0 cilindros (pues s, la #erdad) si
soporta #arias #elocidades de trans3erencia!
5te 40h$90h
Estado del soporte en la unidad ,! 8e indica la #elocidad de trans3erencia a emplear en el disquete introducido
en esta unidad, si precisa o no saltos dobles del cabezal (caso de los disquetes de 40 cilindros en unidades de
.0), el resultado de los intentos de la 5:F8 (la #elocidad puede ser correcta o no, seg0n se haa logrado
determinar el tipo de soporte)!
5te 40h$91h 2o mismo que el bte anterior, pero para la unidad 5!
5te 40h$9+h Estado del soporte en la unidad , al inicio de la operacin!
5te 40h$9%h Estado del soporte en la unidad 5 al inicio de la operacin!
5te 40h$94h D0mero de cilindro en curso en la unidad ,!
5te 40h$9&h D0mero de cilindro en curso en la unidad 5!
,dem-s de estas #ariables, la 5:F8 utiliza tambi>n una tabla de par-metros apuntada por la :D; 1Eh! 2os #alores para
programar ciertas caractersticas del 16" seg0n el tipo de disco pueden #ariar, aunque algunos son comunes! Esta tabla
determina las principales caractersticas de operacin del disco! 6icha tabla est- inicialmente en la HFA, en la posicin
01000h$0E1"'h de todas las 5:F8 compatibles (pr-cticamente el 100h), aunque el 6F8 suele des#iarla a la H,A para
poder actualizarla! El 3ormato de la misma es$
bte 0$
8e corresponde con el bte 1 del comando Y8peci3Y del '/&, que indica el step rate (el tiempo de acceso cilindro-
cilindro, a menudo es 06h ( % / ms) el head unload time (normalmente, 01h ( +40 4.0 ms)!
bte 1$
Es el bte + del comando Y8peci3Y$ los bits '!!1 indican el head load time (normalmente 01h ( + 4 ms) el bit 0
suele estar a 0 para indicar modo 6A,!
bte +$ ;ics de relo7 (pulsos de la interrupcin .) que transcurren tras el acceso hasta que se para el motor!
bte %$ 5tes por sector (0(1+., 1(+&/, +(&1+, %(10+4)!
bte 4$ 8ectores por pista!
bte &$ 2ongitud del ?4) entre sectores (normalmente +,h en unidades de &r 15h en las de %s)!
bte /$ 2ongitud de sector (ignorado si el bte % no es 0)!
bte '$ 2ongitud del B,9 % al 3ormatear (.0 en &r %s-66, .4 en &r-E6 10. en %s-E6)!
bte .$ 5te de relleno al 3ormatear (normalmente 01/h)!
bte 9$ ;iempo de estabilizacin del cabezal en ms!
bte 10
$
;iempo de aceleracin del motor (en unidades de 1I. de segundo)!
El tiempo de estabilizacin del cabezal es el tiempo que ha que esperar tras mo#er el cabezal al cilindro adecuado,
hasta que >ste se asiente, con ob7eto de garantizar el >)ito de las operaciones 3uturas; esta bre#e pausa es establecida en
+& milisegundos en la 5:F8 del 9" original, aunque otras 5:F8 el propio 6F8 suelen ba7arlo a 1&! 6el mismo modo, el
tiempo de aceleracin del motor (bte 10) es el tiempo que se espera a que el motor adquiera la #elocidad de rotacin
correcta, nada m-s ponerlo en marcha! En cualquier caso, es norma general intentar tres #eces el acceso a disco (con
resets de por medio) hasta considerar que un error es real! En general, pese a estos #alores usuales, la 3le)ibilidad del
sistema de disco es e)traordinaria suele responder 3a#orablemente con unos altsimos ni#eles de tolerancia en las
temporizaciones! Cna e)cepcin quiz- la constitue el #alor de ?4) empleado al 3ormatear, al ser un par-metro demasiado
importante!
'!/!.! - 6:8TCE;E8 12F9;:",2 %s 6E +0 A5!
2as unidades que soportan estos disquetes, que tambi>n admiten los de '+0@ 1!44A (aunque a menudo no los de
+!..A) traba7an con controladoras 8"8: e incorporan una 5:F8 propia para dar soporte a estos dispositi#os! El secreto de
estos disquetes est- en el posicionamiento ptico del cabezal, lo que permite ele#ar notablemente el n0mero de pistas! 9or
e7emplo, las unidades de +0 Ab parecen estar equipadas con '&% cilindros +' sectoresIpista! ,unque en el sector de
arranque indica que posee +&1 cilindros / cabezales, el sentido com0n nos permite deducir que esto no puede ser as! 2o
de los +' sectores por pista parece indicar que la #elocidad de trans3erencia de estos disquetes es e)actamente un &0h
maor que la de los con#encionales de 1!44A ('&0 @bitIseg 3rente a &00 @bitIseg)!
El 1FHA,; del 6F8 &!0 posteriores puede 3ormatear los disquetes 3loptical, pero lo hace a ba7o ni#el, con lo que tarda
cerca de %0-4& minutos en inicializarlos! "omo a #ienen 3ormateados de 3-brica, en realidad basta con aGadirles un sector
de arranque e inicializar la 1,; el directorio raz! ;ambi>n se puede #eri3icar la super3icie magn>tica para detectar posibles
sectores de3ectuosos! 2os programas de utilidad que acompaGan estas unidades realizan todas estas tareas en unos 4
minutos! El tipo de 1,; asignado puede ser seleccionado por el usuario (1+ 1/ bits), as como otros par-metros t>cnicos
(tamaGo de clusters, etc!)!
2as tar7etas controladoras suelen permitir un cierto grado de 3le)ibilidad, de cara a seleccionar la letra de unidad que se
desea asignar al 3loptical! "on3igur-ndolo como ,$ se puede incluso arrancar desde un disquete de >stos!
'!/!9! - E[EA92F 6E ,""E8F ,2 6:8"F , ,2;F D:LE2!
8e puede acceder a #arios ni#eles, siendo me7or el m-s alto por razones de compatibilidad$
1) 9rogramando directamente el controlador de disquetesIdisco duro para acceder a sectores 3sicos!
+) 2lamando a la 5:F8 para leer cierto sector, de cierta cara cierto cilindro!
%) 2lamando al 6F8 para leer un sector lgico determinado en la unidad que se le indique!
4) 2lamando al 6F8 para acceder a un 3ichero por su nombre ruta!
El m>todo (1) es apropiado para realizar 3ormateos especiales en sistemas de proteccin anticopia; el (+) es 0til para
acceder a otras particiones de otros sistemas operati#os o a disquetes 3ormateados por otros sistemas operati#os; las
opciones (%) (4) son las m-s cmodas e interesantes! En general, en la medida de lo posible es con#eniente no ba7ar del
ni#el (%); de lo contrario se pierde la posibilidad de acceder a ciertas unidades (por e7emplo, un disco #irtual no e)iste en
absoluto para la 5:F8)!
, continuacin se muestra un programa de e7emplo que solicita el nombre de un 3ichero lo #isualiza por pantalla,
carg-ndolo por 3ragmentos apo-ndose en las 3unciones del 6F8 que se comentan en el ap>ndice que resume las
3unciones del sistema operati#o! 9arad7icamente, el acceso se realiza a alto ni#el pese a tratarse de un programa en
ensamblador! "omo se puede obser#ar, al 3inal del programa se de3inen dos bu33ers de datos de .0 +04. btes! 8i no se
desea que estos bu33ers alarguen el tamaGo del programa e7ecutable, pueden de3inirse de la siguiente manera$
3ichnom ETC d
bu33er ETC d*.0
8in embargo, si se procede de esta 0ltima manera con#endra asegurarse primero de que e)isten +1+. btes de memoria
libres tras el cdigo del programa, a que de esta manera el 6F8 no realiza la comprobacin por nosotros (se limita a cargar
cualquier programa que quepa en memoria)! 6e todas maneras, normalmente suele haber m-s de +1+. btes libres de
memoria tras cargar cualquier programa!!! "on#iene hacer notar que si en lugar de 6C9 (0) se coloca 6C9 (]), el linPador de
5orland (;2:D@ %!0), al contrario que el 2:D@ de Aicroso3t, ;,A9F"F reser#a espacio e3ecti#o para esas #ariables! Esto
slo sucede, lgicamente, cuando el 6C9 (]) est- al 3inal del programa no ha nada m-s a continuacin -ni m-s cdigo ni
datos que no sean 6C9 (])-!
; SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
; S S
; S A:H,!,8A - Ctilidad para #isualizar 3icheros de te)to! S
; S S
; SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
mira 8EBAED;
,88CAE "8$mira, 68$mira
FHB 100h ; programa de tipo !"FA
inicio$
2E, 6M,inputZt)t ; mensa7e
AFL ,E,9 ; 3uncin de impresin
:D; +1h ; llamar al 6F8
2E, 6M,3ichnom ; direccin para el <input=
AFL 5?;E 9;H W3ichnomX,/0 ; no m-s de /0 caracteres
AFL ,E,10 ; 3uncin de entrada de teclado
:D; +1h ; llamar al 6F8
AFL 52,W3ichnom*1X ; longitud e3ecti#a tecleada
AFL 5E,0 ; en 5M
,66 5M,F118E; 3ichnom ; apuntar al 3inal
AFL 5?;E 9;H W5M*+X,0 ; poner un cero al 3inal
2E, 6M,3ichnom*+ ; o33set a cadena ,8"::R nombre
AFL ,2,0 ; modo de lectura
AFL ,E,%6h ; 3uncin para abrir 3ichero
:D; +1h ; llamar al 6F8
[" error ; "1(1 --` error
AFL handle,,M ; cdigo de acceso al 3ichero
trocito$ AFL 5M,handle ; cdigo de acceso al 3ichero
AFL "M,+04. ; n0mero de btes a leer
2E, 6M,bu33er ; direccin del bu33er
AFL ,E,%1h ; 3uncin para leer del 3ichero
:D; +1h ; llamar al 6F8
[" error ; "1(1 --` error
AFL "M,,M ; btes ledos realmente
["MR cerrar ; no ha nada que imprimir
9C8E ,M ; preser#arlos
2E, 5M,bu33er ; imprimir bu33er !!!
imprime$ AFL 62,W5MX ; car-cter a car-cter
AFL ,E,+ ; ir llamando al ser#icio + del
:D; +1h ; 6F8 para imprimir en pantalla
:D" 5M ; siguiente car-cter
2FF9 imprime ; acabar caracteres
9F9 ,M ; recuperar nb de btes ledos
"A9 ,M,+04. ; cleidos +04. btes]
[E trocito ; s, leer otro trocito m-s
cerrar$ AFL 5M,handle ; cdigo de acceso al 3ichero
AFL ,E,%Eh ; cerrar 3ichero
:D; +1h ; llamar al 6F8
[" error ; "1 ( 1 --` error
:D; +0h ; 3in del programa
error$ 2E, 6M,3alloZt)t ; mensa7e de error
AFL ,E,9 ; 3uncin de impresin
:D; +1h ; llamar al 6F8
"A9 handle,0 ; c3ichero abierto]
[DE cerrar ; s$ cerrarlo
:D; +0h ; 3in del programa
; ------------ datos #ariables
handle 6U 0 ; handle de control del 3ichero
inputZt)t 65 1%,10,VDombre del 3ichero$ dV
3alloZt)t 65 1%,10,VSSS Error SSSV,1%,10,10,VdV
3ichnom 65 .0 6C9 (0) ; bu33er para leer desde el teclado
bu33er 65 +04. 6C9 (0) ; V V V V el disco
mira ED68
ED6 inicio
'!/!10! - E[EA92F 6E ,""E8F ,2 6:8"F , 5,[F D:LE2!
El programa de e7emplo desarrollado requiere un adaptador LB, a que utiliza el modo de /40 por 4.0 con 1/ colores
para obtener una representacin gr-3ica de alta calidad del contenido del disco, en lugar de la tradicional pobre
representacin habitual en modo te)to! ,dem-s, se reprograman los registros de paleta el 6," de la LB, para elegir
colores m-s atracti#os! El 3uncionamiento del programa se basa en acceder a la 1,; crear una imagen gr-3ica de la
misma! 9ara ello, calcula cuantos puntos de pantalla debe trazar por cada cluster de disco (utiliza una #entana de /%/)%+/ (
+0'%%/ puntos)! ,unque este n0mero no es entero, por razones de e3iciencia se traba7a con 3racciones para e#itar el empleo
de coma 3lotante! Auchas #eces el ensamblador no es su3iciente para asegurar la #elocidad$ la primera #ersin del programa
tardaba 1. segundos en dibu7ar un mapa en un %./-+&, con una rutina escrita en su maor parte en ensamblador! ;ras
me7orar el algoritmo optimizar el cdigo en la zona crtica donde se trazan los puntos, se redu7o a menos de 0,// segundos
el tiempo necesario (N%14000 puntos por segundo a +& AEzO)! 9ara leer los sectores del disco no se utiliza la 3uncin
absread() del 5orland " +!0, a que posee una errata por la que 3alla con unidades de m-s de %+'/' clusters! En su lugar,
una rutina en ensamblador se encarga de llamar a la interrupcin +&h teniendo cuidado con el tipo de disco (particiones de
m-s de %+ Ab o de menos de esa cantidad)! 2a 1,; se lee en una matriz, a que no ocupa m-s de 1+. @b en el peor de los
casos! 8e lee de tres #eces para e#itar que en un slo acceso a disco, #a :D; +&h, se rebasen los /4 @b permitidos si la
1,; ocupa m-s de /4 @b (el puntero al bu33er apunta al inicio del segmento al ser de tipo ECBE)! , continuacin, se
interpreta la 1,; (seg0n sea de 1+ 1/ bits) se crea otra matriz de tamaGo equi#alente al n0mero de clusters del disco!
Esta 0ltima matriz -que indica los clusters libres, ocupados de3ectuosos- es la que se #olcar- en pantalla adecuadamente!
El programa tambi>n imprime in3ormacin general sobre el disco, utilizando la 3uncin de impresin de la 5:F8! 8e imprime
todo lo necesario antes de dibu7ar a que para trazar los puntos es preciso programar el adaptador de #deo de una manera
di3erente a la que emplea la 5:F8 (por razones de #elocidad)$ despu>s de e7ecutar preparaZpunto(), la 5:F8 no es capaz de
escribir en pantalla! 2a inclusin de ensamblador en los programas en " se #er- con detalle en un captulo posterior!
2istado de 6A,9 +!1
2.2. - EL $S$.
"omo se #io en el captulo anterior, antes de que el "FAA,D6!"FA pase el control al programa que se pretende
e7ecutar, se crea un bloque de +&/ btes llamado $S$ ()roram Sement )re"ix), cua descripcin detallada se da a
continuacin!

2a direccin del 989 en los programas "FA #iene determinada por la de cualquier registro de segmento
("8(68(E8(88) nada m-s comenzar la e7ecucin del mismo! 8in embargo, en los programas de tipo EME slo #iene
determinada por 68 E8! En cualquier caso, e)iste una 3uncin del 6F8 para obtener la direccin del 989, cuo uso
recomienda el 3abricante del sistema en aras de una maor compatibilidad con 3uturas #ersiones del sistema operati#o! 2a
3uncin es la /+h est- disponible a partir del 6F8 %!0!
En la siguiente in3ormacin, los campos del 989 que ocupen un bte o una palabra han de interpretarse como tal; los que
ocupen 4 btes deben interpretarse en la 3orma segmento$o33set! En negrita se resaltan los campos m-s importantes!
- o33sets 0 al 1$ palabra +0"6h, correspondiente a la instruccin :D; +0h! En "9IA se poda terminar un programa
e7ecutando un salto a la posicin 0! En A8-6F8, un programa "FA Ntambi>nO!
- o::+)t+ ! al "$ una palabra con la direccin de memoria (segmento) del 0ltimo p-rra3o disponible en el sistema! ;eniendo
en cuenta dnde acaba la memoria el punto en que est- cargado nuestro programa, no es di3cil saber la memoria que
queda libre! 8upuesto E8 apuntando al 989$
AFL ,M,E8$W+X ; p-rra3o m-s alto disponible
AFL "M,E8 ; segmento del 989
8C5 ,M,"M ; ,M ( p-rra3os libres
AFL "M,1/
AC2 "M ; 6M$,M btes libres
- o33set 4$ no utilizado!
- o33sets & al 9$ salto al despachador de 3unciones del 6F8 (en "9IA se e7ecutaba un ",22 &, el A8-6F8 Ntambi>n lo
permiteO)! Do es recomendable llamar al 6F8 de esta manera! 2os 989 creados por la 3uncin 45h en algunas #ersiones del
6F8 no tienen correctamente inicializado este campo!
- o33sets 0,h al 06h$ contenido pre#io del #ector de terminacin (:D; ++h)!
- o33sets 0Eh al 11h$ contenido pre#io del #ector de "trl-5reaP (:D; +%h)!
- o33sets 1+h al 1&h$ contenido pre#io del #ector de manipulacin de errores crticos (:D; +4h)!
- o33sets 1/h al 1'h$ segmento del 989 padre!
- o33sets 1.h al +5h$ tabla de traba7o del sistema con los 3icheros ([ob 1ile ;able o [1;) $ un bte por handle (a 011h si
cerrado; los primeros son los dispositi#os "FD, DC2, !!! siempre est-n abiertos)! 8lo hasta +0 3icheros (si no, #>ase o33set
%+h)!
- o::+)t+ !CN al !DN$ desde el 6F8 +!0, una palabra que apunta al segmento del espacio de entorno, donde se puede
encontrar el #alor de #ariables de entorno tan interesantes como 9,;E, "FA89E",!!! hasta el nombre del propio
programa que se est- e7ecutando en ese momento el directorio de donde se carg (no siempre es el actual; el programa
pudo cargarse, apo-ndose en el 9,;E, en cualquier otro directorio di3erente del directorio en curso)! L>ase el captulo .
para m-s in3ormacin de las #ariables de entorno!
- o33sets +Eh al %1h$ desde el 6F8 +!0, #alor de 88$89 en la entrada a la 0ltima :D; +1h in#ocada!
- o33sets %+h al %%h$ desde el 6F8 %!0, n0mero de entradas en la [1; (por de3ecto, +0)!
- o33sets %4h al %'h$ desde el 6F8 %!0, puntero al [1; (por de3ecto, 989$1.h)! 6esde el 6F8 %!0 puede haber m-s de +0
3icheros abiertos a la #ez gracias a este campo, que puede ser mo#ido de sitio! 8in embargo, es slo a partir del 6F8 %!%
cuando en un 989 hi7o (por e7emplo, creado con la 3uncin EME") se copia la in3ormacin de m-s que de los +0 primeros
3icheros, si ha m-s de +0! 8e puede saber si un 3ichero es remoto (en la A8-net) comprobando si el bte de la [1; est-
comprendido entre .0h-01Eh, aunque es me7or siempre acceder antes a las 3unciones del 6F8!
- o33sets %.h al %5h$ desde el 6F8 %!0, puntero al 989 pre#io (por de3ecto, 01111h$01111h en las #ersiones del 6F8 %!));
es utilizado por 8E,HE en el 6F8 %!%!
- o33sets %"h al %1h$ no usados hasta ahora!
- o33sets 40h al 41h$ desde el 6F8 &!0, #ersin del sistema a de#ol#er cuando se in#oca la 3uncin %0h!
- o33sets 4+h al 4'h$ no usados hasta ahora!
- o33set 4.h$ desde UindoKs %, el bit 0 est- acti#o si la aplicacin es no-UindoKs!
- o33sets 49h al 41h$ no usados hasta ahora!
- o33sets &0h al &+h$ cdigo de :D; +1hIHE;1! Do recomendado hacer ",22 989$&"h para llamar al 6F8!
- o33sets &%h al &5h$ no usados hasta ahora!
- o33sets &"h al '5h$ apuntan a los dos 1"5Ys (1ile "ontrol 5locPs) usados antaGo para acceder a los 3icheros (uno en &"h
el otro en /"h)! Es una reliquia en desuso, adem-s este -rea no se inicializa si el programa es cargado en memoria
superior con el comando 2F,6E:BE del A8-6F8 &!0 posteriores, por lo que no con#iene usarlo ni siquiera para captar
par-metros, al menos en programas residentes -susceptibles de ser instalados con 2F,6E:BE-! 8i se utiliza el primer 1"5
se sobreescribe adem-s el segundo!
- o33sets '"h al '1h$ no usados hasta ahora!
- o::+)t+ 39N al 9??N$ es la zona donde aparecen los par-metros suministrados al programa! El primer bte indica la
longitud de los par-metros, despu>s #ienen los mismos al 3inal un retorno de carro (,8":: 1%) que es un tanto redundante
-a 3in de cuentas, a se sabe la longitud de los par-metros-! Ese retorno de carro, sin embargo, no <se cuenta= en el bte
que indica la longitud! ;>ngase en cuenta que no son mausculizados autom-ticamente (est-n tal como los tecle el
usuario), adem-s los par-metros pueden estar separados por uno o (P+ espacios en blanco o tabuladores (,8":: 9)!
En general, comprobar los #alores que recibe el 989 cuando se carga un programa es una tarea que se realiza de
manera sencilla con el programa 6E5CBI8?A6E5! 9ara ello basta una orden tal como V6E5CB 9HFBH,A,!"FA
EF2, I;V$ al entrar en el 6E5CB (o 8?A6E5) basta con hacer <6 0= para e)aminar el 989 de 9HFBH,A,! 9ara #er los
par-metros (EF2, I; en el e7emplo) se hara <6 .0=!
2.3. - EL $ROCESO DE ARRAN4UE DEL $C.
,l conectar el 9" >ste comienza a e7ecutar cdigo en los 1/ 0ltimos btes de la memoria (direccin 011110h en 9"IM;,
0111110h en +./ 011111110h en %./ superiores)! En esa posicin de memoria, en la que ha HFA, e)iste un salto a
donde realmente comienza el cdigo de la 5:F8! Este salto suele ser de tipo largo (segmento$o33set) con ob7eto de cargar en
"8 un #alor que re3erencie al primer mega de memoria, donde tambi>n est- direccionada la HFA (todos los
microprocesadores arrancan en modo real)! El programa de la HFA inicialmente se limita a chequear los registros de la
"9C, primero el de estado luego los dem-s (en caso de 3allo, se detiene el sistema)! , continuacin, se inicializan los
principales chips (interrupciones, 6A,, temporizador!!!); se detecta la con3iguracin del sistema, accediendo directamente a
los puertos de EI8 tambi>n consultando los sKitches de con3iguracin de la placa base (9"IM;) o la "AF8 (,;); se
establecen los #ectores de interrupcin se chequea la memoria H,A si el contenido de la direccin 40h$'+h es distinto de
1+%4h (el contenido de la memoria es aleatorio inicialmente)! 9or 0ltimo, se entrega el control sucesi#amente a las posibles
memorias HFA adicionales que e)istan (la de la LB,, el disco duro en M;, etc!) con ob7eto de que des#en los #ectores que
necesiten! ,l 3inal del todo, se intenta acceder a la primera unidad de disquetes$ si no ha disquete, se procede igualmente
con el primer disco duro (en los 9" de :5A, si no ha disco duro ni disquete se e7ecuta la HFA 5,8:")! 8e carga el primer
sector en la direccin 0$'"00h se entrega el control a la misma! Ese sector cargado ser- el sector de arranque del disquete
o la tabla de particin del disco duro (el cdigo que contiene se encargar- de cargar el sector de arranque del propio disco
duro, seg0n la particin acti#a)! El programa del sector de arranque busca el 3ichero del sistema :F!8?8 (o :5A5:F!"FA en
9"-6F8) lo carga, entreg-ndole el control (programa 8?8:D:;) o mostrando un mensa7e de error si no lo encuentra! 2as
#ersiones m-s modernas del 6F8 no requieren que :F!8?8 :5A5:F!"FA comience en el primer cluster de datos del
disco, aunque s que se encuentre en el directorio raz! 9uede que tambi>n se cargue al principio el 3ichero A86F8!8?8 (o
:5A6F8!"FA) o bien puede que el encargado de cargar dicho 3ichero sea el propio :F!8?8 o :5A5:F!"FA! El nombre de
los 3icheros del sistema depende de si >ste es 9"-6F8 (o 6H-6F8) o A8-6F8! ;eniendo en cuenta que el A8-6F8 el
9"-6F8 son pr-cticamente id>nticos desde la #ersin +!0 (9"-6F8 3unciona en m-quinas no :5A), la e)istencia de las dos
#ersiones se e)plica slo por razones comerciales! El 3ichero :F!8?8 o :5A5:F!"FA en teora debera ser entregado por el
#endedor del ordenador$ este 3ichero pro#ee soporte a las di3erencias espec3icas que e)isten en el hardKare de las
di3erentes m-quinas! 8in embargo, como todos los 9" compatibles son casi id>nticos a ni#el hardKare (sal#o algunas de las
primeras m-quinas que intentaron imitar al 9") en la pr-ctica es el 3abricante del 6F8 (Aicroso3t o 6igital Hesearch) quien
entrega dicho 3ichero! Ese 3ichero es como una capa que se interpone entre la 5:F8 del 9" el cdigo del sistema operati#o
contenido en A86F8!8?8 o :5A6F8!"FA! Este 0ltimo 3ichero es el encargado de inicializar los #ectores +0h-+1h
completar las tablas de datos internas del sistema! ;ambi>n se interpreta el "FD1:B!8?8 para instalar los controladores de
dispositi#o que den soporte a las caractersticas peculiares de la con3iguracin del ordenador! 1inalmente, se carga el
int>rprete de mandatos$ por de3ecto es "FAA,D6!"FA aunque no ha razn para que ello tenga que ser as
necesariamente (pruebe el lector a poner en "FD1:B!8?8 la orden 8EE22 "$m6F8mT5,8:"!EME; aunque si se abandona
T5,8:" algunas #ersiones modernas del 6F8 son a0n capaces de cargar el "FAA,D6 por sus propios medios, despu>s
del error pertinente, en #ez de bloquear el ordenador)! En las #ersiones m-s recientes del 6F8, el sistema puede residir en
memoria superior o en el EA,$ en ese caso, el proceso de arranque se complica a que es necesario localizar el 6F8 en
esa zona despu>s de cargar los controladores de memoria!
2.S. - ?ORMATO DE LAS EXTENSIONES ROM.
2as memorias HFA que incorporan di#ersas tar7etas (de #deo, controladoras de disco duro, de red) pueden estar
ubicadas en cualquier punto del -rea 0"0000h-011111h! 2a HFA 5:F8 del ordenador se encarga de ir recorri>ndolas
entreg-ndolas el control durante la inicializacin, con ob7eto de permitirlas des#iar #ectores de interrupcin e7ecutar otras
tareas propias de su inicializacin!
2a 5:F8 recorre este -rea en incrementos de + @b buscando la signatura &&h, 0,,h$ estos dos btes consecuti#os tienen
que aparecer al principio para considerar que ah ha una HFA! El tercer bte, que #a detr-s de >stos, indica el tamaGo de
esa e)tensin HFA en bloques de &1+ btes! 9or razones de seguridad, se realiza una suma de comprobacin de toda la
e)tensin HFA si el resultado es 0 se considera una aut>ntica HFA #-lida! En ese caso, se entrega el control (con un
",22 entre segmentos) al cuarto bte de la e)tensin HFA! ,h habr- de estar ubicado el cdigo de la e)tensin HFA
(habitualmente un salto a donde realmente comienza)! ,l 3inal del todo, el cdigo de la e)tensin HFA debe de#ol#er de
nue#o el control a la 5:F8 del sistema, por medio de un retorno le7ano (HE;1)!
El cdigo almacenado en estas e)tensiones HFA puede contener accesos directos al hardKare llamadas a la HFA
5:F8 del sistema! 8in embargo, con#iene recordar que el 6F8 no ha sido cargado a0n no se pueden emplear sus
3unciones! 2a #enta7a de las e)tensiones HFA es que aumentan las prestaciones del sistema antes de cargar el 6F8! El
incon#eniente es que en otros sistemas operati#os (CD:M, etc!) que emplean el modo protegido, estas memorias HFA en
general no son accesibles! En la actualidad, con la disponibilidad de memoria superior ba7o 6F8, resulta m-s con#eniente
que las e)tensiones de hardKare #engan acompaGadas de dri#ers para 6F8, U:D6FU8, F8I+,!!! que no con una HFA,
mucho m-s di3cil de actualizar! Cn e7emplo de memoria HFA podra ser$
bios 65 &&h, 0,,h
65 %+ ; 1/ @b de HFA
[A9 inicio
!!!
!!!
3inZbios !!! ; la suma de todos los btes ( 0
2os primeros ordenadores de :5A incorporaban una memoria HFA con el 5,8:"! El "FAA,D6 de aquellas #ersiones
del 6F8 (desconozco si el actual tambi>n) era capaz de e7ecutar comandos internos de3inidos en estas HFA, al igual que un
"28 o un 6:H, #amos! El 3ormato era, por e7emplo$
biosZbasic 65 &&h, 0,,h
65 /4 ; %+ @b de HFA-5,8:"
[A9 inicio
65 & ; longitud del siguiente comando
65 V5,8:"V
[A9 basic ; salto al comienzo del 5,8:"
65 / ; longitud del siguiente comando
65 V5,8:",V
[A9 basic ; salto al comienzo (el mismo del 5,8:")
65 0 ; no m-s comandos
basic !!!
!!!
3inZbios !!! ; la suma de todos los btes ( 0
8i esto le parece una tontera al lector, es que no ha #isto lo que #amos a #er ahora! Hesulta que tambi>n se pueden
almacenar programas en 5,8:" (el cdigo 3uente, aunque to8enizado) en las 5:F8! N8, un listado en HFAO$
mortgagebas 65 &&h, 0,,h
65 4. ; +4 @b de contabilidad
HE;1 ; nada que hacer
65 0,,h, &&h ; esto es un listado 5,8:"
!!! ; aqu, el programa
3inZbios !!! ; la suma de todos los btes ( 0
2.19. - ?ORMATO ?ISICO DE LOS ?ICHEROS EXE.
2os 3icheros EME poseen una estructura en el disco distinta de su imagen en memoria, al contrario que los "FA! Es
con#eniente conocer esta estructura para ciertas tareas, como por e7emplo la creacin de anti#irus - tambi>n la de #irus-,
que requiere modi3icar un 3ichero e7ecutable a ensamblado o compilado! ,nalizaremos como e7emplo de programa EME el
del captulo /, que re0ne las principales caractersticas necesarias para nuestro estudio! 8e comentar-n los principales btes
que componen el 3ichero e7ecutable en el disco (10.. en total)! , continuacin se lista un #olcado del 3ichero e7ecutable a
estudiar! ;odos los datos est-n en he)adecimal (parte central) ,8":: (derecha); la columna de la izquierda es el o33set del
primer bte de la lnea! 6onde ha puntos suspensi#os, se repite la lnea de arriba tantas #eces como sea preciso$
0000 46 &, 40 00 0% 00 01 00-+0 00 00 00 11 11 04 00 ARf!!!!! !!!!!!!
0010 00 0+ 00 00 00 00 0+ 00-%E 00 00 00 01 00 15 %0 !!!!!!!!`!!!!!p0
00+0 /, '+ 00 00 00 00 00 00-00 00 00 00 00 00 00 00 7r!!!!!!!!!!!!!!
00%0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 0& 00 !!!!!!!!!!!!!!!!
0040 0+ 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 !!!!!!!!!!!!!!!!
00&0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 !!!!!!!!!!!!!!!!
! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
0110 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 !!!!!!!!!!!!!!!!
0+00 06 0, &4 /& '. '4 /1 +0-/1 +0 /9 /6 '0 '+ /9 /6 !!;e)to a imprim
0+10 /9 '+ 06 0, +4 00 00 00-00 00 00 00 00 00 00 00 ir!!d!!!!!!!!!!!
0++0 1E %% "0 &0 5. 00 00 .E-6. 5, 00 00 54 09 "6 +1 !%f9.!!!M$!!4!AO
0+%0 "5 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 @!!!!!!!!!!!!!!!
0+40 '0 /9 /" /1 '0 /9 /" /1-'0 /9 /" /1 '0 /9 /" /1 pilapilapilapila
! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
2os 3icheros EME constan de una cabecera, seguida de los segmentos de cdigo, datos pila; esta cabecera se carga en
un bu33er au)iliar no 3ormar- parte de la imagen de3initi#a del programa en memoria! , continuacin se e)plica el contenido
de los btes de la cabecera$
O::+)t 9 (+ btes)$ Lalores 3i7os 46h &,h (en ,8"::, YARY) &,h 46h (YRAY); esta in3ormacin indica que el 3ichero es
realmente de tipo EME no lle#a esa e)tensin por anto7o de nadie!
O::+)t ! (+ palabras)$ ;amaGo del 3ichero en el disco! 2a palabra m-s signi3icati#a (o33set 4) da el n0mero total de sectores
que ocupa$ % en este caso (% S &1+ ( 1&%/)! El tercer sector no est- totalmente lleno, pero para eso est- la palabra menos
signi3icati#a (o33set +) que indica que el 0ltimo sector slo tiene ocupados los primeros 40h btes! 9or tanto, el tamaGo
e3ecti#o del 3ichero es de 10+4 * /4 ( 10.. btes, lo que se corresponde con la realidad!
O::+)t 0 (1 palabra)$ D0mero de reubicaciones a realizar! :ndica cu-ntas #eces se hace re3erencia a un segmento absoluto$
el montador del sistema operati#o tendr- que relocalizar en memoria todas las re3erencias a segmentos absolutos seg0n en
qu> direccin se cargue el programa para su e7ecucin! En el e7emplo slo ha 1 (correspondiente a la instruccin AFL
,M,datos)!
O::+)t 3 (1 palabra)$ ;amaGo de esta cabecera del 3ichero EME! 2a cabecera que estamos analizando que precede al
cdigo datos del programa ser- m-s o menos larga en 3uncin del tamaGo de la tabla de reubicaciones, como luego
#eremos! En el e7emplo son +00h ((&1+) btes, el tamaGo mnimo, habida cuenta que slo ha una reubicacin (de hecho,
a0n cabran muchas m-s)!
O::+)t 9AN (1 palabra)$ Anima cantidad de memoria requerida por el programa, en p-rra3os, en adicin al tamaGo del
mismo! En el e7emplo es 0 (el programa se con3orma con lo que ocupa en disco)!
O::+)t 9CN (1 palabra)$ A-)ima cantidad de memoria requerida (p-rra3os)! 8i es 0, el programa se cargar- lo m-s alto
posible en la memoria (opcin IE del 2:D@ de Aicroso3t); si es 01111h, como en el e7emplo, el programa se cargar- lo m-s
aba7o posible en la memoria -lo m-s normal-!
O::+)t 9EN (+ palabras)$ Lalores para inicializar 88 (o33set 0Eh) 89 (o33set 10h)! E#identemente, el #alor para 88 est- a0n
sin reubicar (habr- de sum-rsele el segmento en que se cargue el programa)! En el e7emplo, el 88 relati#o es 4 89 ( +00h
((&1+ btes de tamaGo de pila de3inido)!
O::+)t 1!N (1 palabra)$ 8uma de comprobacin$ son en teora los 1/ bits de menos peso de la negacin de la suma de todas
las palabras del 3ichero! El 6F8 debe hacer poco caso, porque ;2:D@ no se molesta ni en inicializarlo (El 2:D@ de Aicroso3t
s)! Fl#idar este campo!
O::+)t 1#N (+ palabras)$ Lalores para inicializar "8 (o33set 1/h) e :9 (o33set 14h)! El #alor para "8 est- a0n sin reubicar
habr- de sum-rsele el segmento de3initi#o en que se cargue el programa! En el e7emplo, el #alor relati#o de "8 es +, siendo
:9 ( 0!
O::+)t 13N (1 palabra)$ :nicio de la tabla de reubicacin, e)presado como o33set! En el e7emplo es %Eh, lo que indica que la
tabla comienza en el o33set %Eh! "ada entrada en la tabla ocupa 4 btes! 2a 0nica entrada de que consta este programa
tiene el #alor 000+$000& ( +&h, lo que indica que en el o33set +00h*+&h (++&h) ha una palabra a reubicar -se suma +00h
que es el tamaGo de la cabecera-! En e3ecto, en el o33set ++&h ha una palabra a cero, a la que habr- de sum-rsele el
segmento donde sea cargado el programa! Esta palabra a cero es el operando de la instruccin AFL ,M,datos (el cdigo de
operacin de AFL ,M,n es 05.h)!
O::+)t 1AN (1 palabra)$ D0mero de o#erla (0 en el e7emplo, es un programa principal)!
O::+)t 1CN al "DN$ Lalores desconocidos (dependientes de la #ersin de 2:D@ o ;2:D@)!
Captulo 5III: LA 1ESTIN DE MEMORIA DEL DOS
3.1. - TI$OS DE MEMORIA EN UN $C.
6aremos un bre#e repaso a los tipos de memoria asociados a los ordenadores compatibles en la actualidad! "on#iene
tambi>n echar un #istazo al ap>ndice :, donde se describe de manera m-s esquem-tica, para completar la e)plicacin!
.!1!1! - Aemoria con#encional!
Es la memoria H,A comprendida entre los 0 los /40 @b; es la memoria utilizada por el 6F8 para los programas de
usuario! 2os %.4 @b restantes hasta completar el megabte se reser#an para otros usos, como memoria para gr-3icos, 5:F8,
etc! En muchas m-quinas, un buen 3ragmento de esta memoria est- ocupado por el sistema operati#o los programas
residentes, quedando normalmente no m-s de &/0 @b a disposicin del usuario!
.!1!+! - Aemoria superior!
Este t>rmino, de reciente aparicin, designa el -rea comprendida entre los /40 los 10+4 @b de memoria del sistema!
Entre 19.9 1990 aparecieron programas capaces de gestionar este -rea para apro#echar los huecos de la misma que no
son utilizados por la 5:F8 ni las tar7etas gr-3icas! 2a memoria superior no se toma de la memoria instalada en el equipo, sino
que est- en ciertos chips aparte relacionados con la 5:F8, los gr-3icos, etc! 9or ello, un ,; con 1 Ab de H,A normalmente
posee /40 @b de memoria con#encional %.4 @b de memoria extendida! 2os segmentos ,0000 50000 est-n reser#ados
para gr-3icos, aunque rara #ez se utilizan simult-neamente! El segmento "0000 contiene la HFA del disco duro en M; (en
,; el disco duro lo gestiona la propio 5:F8 del sistema) Io 5:F8 de tar7etas gr-3icas! El segmento 60000 es empleado
normalmente para el marco de p#ina de la memoria e)pandida! El segmento E0000 suele estar libre el 10000 almacena
la 5:F8 del equipo! 2os modernos sistemas operati#os 6F8 permiten (en los equipos %./ %./s) superiores) colocar
memoria 3sica e)tendida en el espacio de direcciones de la memoria superior; con ello es 3actible rellenar los huecos
vac;os apro#echarlos para cargar programas residentes! "iertos equipos +./ tambi>n soportan esta memoria, gracias a
unos chips de apoo, pero no es 3recuente!
.!1!%! - Aemoria de #deo!
El primer adaptador de #deo de :5A era slo para te)to empleaba 4 @b! 6espu>s han ido apareciendo la "B, (1/ @b),
EB, (/4-+&/ @b), LB, (+&/ @b) 8LB, (hasta + Ab)! "omo slo ha 1+. @b reser#ados para gr-3icos en el espacio de
direcciones del .0./, las tar7etas m-s a#anzadas tienen paginada su memoria con una serie de puertos de EI8 se indica
qu> 3ragmento del total de la memoria de #deo est- siendo direccionado (en la LB,, slo /4 @b en ,0000)!
.!1!4! - Aemoria e)pandida!
8urgi en los 9"IM; como respuesta a la necesidad de romper el lmite de los /40 @b, se trata de un sistema de
paginacin! "onsiste en aGadir chips de memoria en una tar7eta de e)pansin, as como una cierta circuitera que permita
colocar un 3ragmento de esa memoria e)tra en lo que se denomina (a8'o *) pP/-a de memoria e)pandida, que
normalmente es el segmento 60000 del espacio de direcciones del .0./ (/4 @b)! Este marco de p-gina est- di#idido en 4
bloques de 1/ @b! ,ll se pueden colocar bloques de 1/ @b e)trados de esos chips adicionales por medio de comandos de
EI8 en#iados a la tar7eta de e)pansin! 9ara que los programas no tengan que hacer accesos a los puertos para hacer
m-s cmodo el traba7o, surgi la especi3icacin 2:A-EA8 (2otus-:ntel-Aicroso3t E)panded Aemor 8stem) que consiste
b-sicamente en un dri#er instalable desde el con3ig!ss que pone a disposicin de los programas un amplio abanico de
3unciones in#ocables por medio de la interrupcin /'h! 2a memoria e)pandida est- di#idida en p-ginas lgicas de 1/ @b que
pueden ser colocadas en las normalmente 4 p-ginas 3sicas del marco de p-gina! 2os microprocesadores %./ (incluido
ob#iamente el 8M) permiten adem-s con#ertir la memoria e)tendida en e)pandida, gracias a sus mecanismos de gestin de
memoria$ en estas m-quinas la memoria e)pandida es emulada por EAA%./ o alg0n gestor similar!
.!1!&! - Aemoria e)tendida!
Es la memoria ubicada por encima del primer mega en los procesadores +./ superiores! 8lo se puede acceder a la
maora de esta memoria en modo protegido, por lo que su uso queda relegado a programas comple7os o di#ersos dri#ers
que la apro#echen (discos #irtuales, cach>s de disco duro, etc!)! Eace a bastante tiempo se diseG una especi3icacin para
que los programas que utilicen la memoria e)tendida puedan con#i#ir sin con3lictos$ se trata del controlador MA8! Este
controlador implementa una serie de 3unciones normalizadas que adem-s 3acilitan la utilizacin de la memoria e)tendida,
optimizando las trans3erencias de bloques en los %./ superiores (utiliza autom-ticamente palabras de %+ bits para acelerar
el acceso)! 2a especi3icacin MA8 #iene en el programa E:AEA!8?8, E:6F8!8?8 en algunas #ersiones del EAA%./! El
controlador MA8 tambi>n aGade 3unciones normalizadas para acceder a la memoria superior!
.!1!/! - Aemoria cach>!
6esde el punto de #ista del so3tKare, es memoria (con#encional, e)pandida o e)tendida) empleada por un controlador de
dispositi#o (dri#er) para almacenar las partes del disco de m-s 3recuente uso, con ob7eto de acelerar el acceso a la
in3ormacin! , ni#el hardKare, la memoria cach> es una pequeGa H,A ultrarr-pida que acompaGa a los microprocesadores
m-s a#anzados; los programas no tienen que ocuparse de la misma! ;ambi>n incorporan memorias cach> algunos
controladores de disco duro, aunque se trata b-sicamente de memoria normal corriente para acelerar los accesos!
.!1!'! - Aemoria shadoK H,A!
2os chips de HFA no han e#olucionado tanto como las memorias H,A; por ello es 3recuente que un 4./ a // AEz tenga
una 5:F8 de slo . bits a . Ahz! , partir de los procesadores %./ (tambi>n %./s)) superiores, e)isten unos mecanismos
de gestin de memoria #irtual que permiten colocar H,A en el espacio lgico de direcciones de la HFA! "on ello, es 3actible
copiar la HFA en H,A acelerar sensiblemente el rendimiento del sistema, especialmente con los programas que se
apoan en la 5:F8! ;ambi>n los chipset de la placa base pueden aGadir soporte para esta caracterstica! 2a shadoK H,A
normalmente son %.4 @b que reemplazan cualquier 3ragmento de HFA ubicado entre los /40-10+4@b de H,A durante el
proceso de arranque (boot) del sistema! En ocasiones, el usuario puede optar entre %.4 @b de shadoK %.4 @b m-s de
memoria e)tendida en el programa 8E;C9 de su ordenador!
.!1!.! - Aemoria "AF8 H,A!
8on /4 btes de memoria (1+. en algunas m-quinas) ubicados en el chip del relo7 de tiempo real de la placa base de los
equipos ,; superiores! , esta memoria se accede por dos puertos de EI8 en ella se almacena la con3iguracin 3echa
hora del sistema, que permanecen tras apagar el ordenador (gracias a las pilas)! E#identemente no se puede e7ecutar
cdigo sobre la H,A "AF8 (Di pueden esconderse #irus, al contrario de lo que algunos mal in3ormados opinan! Ftra cosa
es que utilicen alg0n bte de la "AF8 para controlar su 3uncionamiento)!
.!1!9! - Aemoria alta o EA,!
8e trata de los primeros /4 @b de la memoria e)tendida (colocados entre los 10+4 los 10.. @b)! Dormalmente, cuando
se intentaba acceder 3uera del primer megabte (por e7emplo, con un puntero del tipo 1111$1000 ( 100110) un arti3icio de
hardKare lo impeda, con#irtiendo esa direccin en la 0$0110 por el simple procedimiento de poner a cero la lnea ,+0 de
direcciones del microprocesador en los +./ superiores! Ese arti3icio de hardKare lo protagoniza el chip controlador del
teclado (.04+) a que la lnea ,+0 pasa por sus manos! 8i se le insta a que conecte los dos extremos (en#iando un simple
comando al controlador del teclado) a partir de ese momento es el microprocesador quien controla la lnea ,+0 , por tanto,
en el e7emplo anterior se hubiera accedido e3ecti#amente a la memoria e)tendida! 2os nue#os sistemas operati#os 6F8
habilitan la lnea ,+0 , gracias a ello, est-n disponibles otros /4 @b adicionales! 9ara ser e)actos, como el rango #a desde
1111$0010 hasta 1111$1111 se puede acceder a un total de /&&+0 btes (/4 @b menos 1/ btes) de memoria! ;>ngase en
cuenta que las direcciones 1111$0000 a la 1111$0001 est-n dentro del primer megabte! En el EA, se cargan actualmente
el 6H-6F8 &!0I/!0 el A8-6F8 &!0 posteriores; e#identemente siempre que el equipo, adem-s de ser un ,;, disponga
como mnimo de /4 @b de memoria e)tendida! En ciertos equipos poco compatibles es di3cil habilitar la lnea ,+0, por lo que
el E:AEA!8?8 de Aicroso3t dispone de un par-metro que se puede #ariar probando docenas de #eces hasta conseguirlo, si
ha suerte (adem-s, ha 5:F8 mu inter#encionistas que di3icultan el control de ,+0)!
3.!. - BLO4UES DE MEMORIA.
Lamos ahora a conocer con pro3undidad la manera en que el sistema operati#o 6F8 gestiona la memoria; un tema poco
tratado, a que esta in3ormacin no est- o3icialmente documentada por Aicroso3t!
2os bloques de memoria en el 6F8 son agrupaciones de btes siempre m0ltiplos enteros de 1/ btes$ en realidad son
agrupaciones de p-rra3os! 2a memoria de un 9" -siempre ba7o 6F8- est-, por tanto, di#idida en grupos de p-rra3os! 9or
tanto, una palabra de 1/ bits permite almacenar la direccin del p-rra3o de cualquier posicin de memoria dentro del
megabte direccionable por el .0./! ;odo bloque de memoria tiene asociado un p8op-)ta8-o, que bien puede ser el 6F8 o
un programa residente que haa solicitado al 6F8 el control de dicho bloque! "uando se e7ecuta un programa, el sistema
crea dos bloques para el mismo$ el <loEu) *) ()(o8-a *)l p8o/8a(a el <loEu) *) ()(o8-a *)l )to8o!
.!+!1! - El bloque de memoria del programa!
"uando se e7ecuta un programa, el 6F8 busca el maor bloque de memoria disponible (con#encional o superior, seg0n
sea el caso) se lo asigna - no el bloque m-s cercano a la direccin 0, como algunos a3irman-! Este -rea recibe el nombre
de bloque de programa o segmento de programa! 2a direccin del primer p-rra3o del mismo es de suma importancia se
denomina $ID (9rocess :6, identi3icador de proceso)! En los primeros +&/ btes de este -rea el 6F8 crea el $S$a
conocido -+&/ btes- 3ormado por #arios campos de in3ormacin relacionada con el programa! ;ras el 989 #iene el cdigo
del programa e7ecutable! 9ara los ob7eti#os de este captulo basta con conocer dos campos del 989$ el primero est- en su
o33set 0 son dos btes (por tanto, los primeros dos btes del 989) que contienen la palabra +0"6h ( +'"6h en algunos
casos)! Esto se corresponde con el cdigo de operacin de la instruccin ensamblador :D; +0h (o :D; +'h); esto es as por
razones histricas heredadas del "9IA! 9or ello, cuando un programa 3inaliza, puede hacerlo con un salto al inicio del 989
(un [A9 0 en los programas "FA) donde se e7ecuta el :D; +0h, aunque normalmente el programador e7ecuta directamente
el :D; +0h que es m-s seguro! El otro campo del 989 que nos interesa es el o33set +"h$ en >l ha una palabra que indica el
p-rra3o donde comienza el bloque de entorno asociado al programa!
.!+!+! - El bloque del entorno!
El espacio de entorno del "FAA,D6!"FA es el bloque de entorno del "FAA,D6!"FA (que podemos considerar
como un programa residente)! Es una zona de memoria donde se almacenan las #ariables de entorno de3inidas con el
mandato 8E; del sistema, as como con algunos comandos como 9,;E, 9HFA9;, etc! 9or e7emplo, la orden 9,;E
"$m6F8 es an-loga a 8E; 9,;E("$m6F8! 2as #ariables de entorno pueden consultarse con 8E; (sin par-metros)! las
#ariables de entorno sir#en para crear in3ormacin que puedan usar m0ltiples programas, aunque se usan poco en la
realidad! "uando un programa es cargado, adem-s del bloque de memoria del programa se crea el bloque del entorno! 8e
trata de una #ulgar copia del espacio de entorno del "FAA,D6!"FA; de esta manera, el programa en e7ecucin tiene
acceso a las #ariables de entorno del sistema aunque no las puede modi3icar (estara modi3icando una mera copia)! 2as
#ariables de entorno se almacenan en 3ormato ,8"::R ordinario (esto es, terminadas por un bte a cero) tienen una
sinta)is del tipo L,H:,52E(8C L,2FH! ;ras la 0ltima de las #ariables ha otro bte m-s a cero para indicar el 3inal!
6espu>s de esto, slo a partir del 6F8 %!0, #iene una palabra que indica el n0mero de cadenas ,8"::R especiales que
#ienen a continuacin$ normalmente 1, que contiene una in3ormacin mu 0til$ la especi3icacin completa del nombre del
programa que est- siendo e7ecutado -incluida la unidad ruta de directorios- lo que permite a los programas saber su propio
nombre desde qu> directorio est-n siendo e7ecutados , por tanto, dnde deben abrir sus 3icheros (por educacin no es
con#eniente hacerlo en el directorio raz o en el actual)! En el espacio de entorno del "FAA,D6, este aGadido del 6F8 %!0
posteriores parece no estar de3inido!
.!+!%! - 2os bloques de control de memoria (A"5Ys)!
;odos los bloques de memoria (tanto programa como entorno) #ienen precedidos por una cabecera de un p-rra3o (1/
btes) que almacena in3ormacin relati#a al mismo! Esta cabecera recibe el nombre t>cnico de MCB (Aemor "ontrol 5locP)
tiene la siguiente estructura$
En el o33set 0 se sit0a el byte de marca (46h si no es el 0ltimo A"5 de la cadena de A"5Ys en memoria, &,h si es el
0ltimo), en el o33set 1 ha una palabra que indica el 9:6 del programa propietario del bloque, en el o33set % otra palabra indica
el tamaGo (como siempre, p-rra3os) del bloque, sin incluir este p-rra3o del A"5! 2os btes que #an del & al ' est-n
reser#ados! Entre el . el 1& se sit0a el nombre del programa propietario, aunque esta in3ormacin slo e)iste en los
bloques de programa con A8-6F8 4!0 posterior (tambi>n en 6H-6F8 &!0I/!0, aunque este operati#o es aparentemente
un 6F8 %!%1)! El nombre acaba con un cero si tiene menos de . caracteres (en 6H-6F8 &!0 acaba siempre con un cero,
trunc-ndose el .b car-cter si lo haba; esta errata ha sido corregida en 6H-6F8 /!0)!
.!+!4! - 2a cadena de los bloques de memoria!
"uando un programa 3inaliza su e7ecucin, normalmente el 6F8 libera su bloque de memoria de entorno! 8in embargo,
los programas residentes permanecen con el bloque de memoria de entorno en la H,A del sistema, hasta que se les
desinstale o se reinicialice el equipo! 2os buenos programas residentes suelen liberar el bloque de memoria del entorno
antes de terminar, con ob7eto de economizar una memoria que normalmente no usan (entre otras razones porque tiene un
tamaGo #ariable e impredecible)! "omo mnimo e)isten dos programas residentes en todo momento$ el n0cleo (Pernel) del
sistema operati#o el "FAA,D6!"FA, aunque los usuarios suelen aGadir el @E?5 , en muchos casos, el 9H:D;,
,99ED6, BH,9E:"8, BH,1;,52, D281CD", 8E,HE, etc!
"omo todos los bloques de memoria est-n ubicados unos tras otros, adem-s se conoce el tamaGo de los mismos, es
3actible hacer un programita que recorra la cadena de bloques de memoria hasta que se encuentre uno cuo bte de marca
#alga &,h (0ltimo A"5), pudi>ndose identi3icar los programas residentes cargados la memoria que emplean! 2a direccin
del primer A"5 era al principio un secreto de Aicroso3t, aunque ho casi todo el mundo sabe que las siguientes lneas$
AFL ,E,&+h
:D; +1h
AFL ,M,E8$W5M-+X
de#uel#en en ,M la direccin del primer A"5 de la cadena, utilizando la 3uncin indocumentada &+h del sistema
operati#o!
.!+!&! - Helacin entre bloque de programa de entorno!
El siguiente esquema aclarar- la relacin e)istente entre el bloque de programa el de entorno! 2os #alores num>ricos
que 3iguran son arbitrarios (pero correctos)!
.!+!/! - ;ipos de bloques de memoria!
5-sicamente e)isten cinco tipos de bloques de memoria$ bloques de programa, de entorno, del sistema, bloques de datos
bloques libres! 2os dos primeros a han sido ampliamente e)plicados! 2os bloques del sistema se corresponden con
el 8ernel o n0cleo del sistema operati#o o los dispositi#os instalables; normalmente tienen su 9:6 como 000.! En los nue#os
sistemas operati#os en las m-quinas donde la cadena de bloques de memoria puede a#anzar por encima de los /40 @b,
las zonas correspondientes a H,A de #deo e)tensiones 5:F8 suelen tener un 9:6 000' en 6H-6F8 (que indica -rea
e)cluida) 000. (A8-6F8 &!0) son consideradas como bloques de memoria ordinarios, aunque slo sea para saltarlos de
alguna manera! 2os bloques libres tienen un 9:6 0000! El 9:6 000/ (slo aparece en 6H-6F8) indica que se trata de un
bloque de memoria superior MA8!
2os bloques de datos aparecen en raras ocasiones, debido al uso de las 3unciones del sistema operati#o para localizar
bloques de memoria! "uando un programa se e7ecuta, tiene asignada la maor parte de la memoria para s, pero es
per3ectamente 3actible que solicite al 6F8 una reduccin de la memoria asignada (3uncin 4,h) , con los @b que haa
liberado, puede #ol#er a llamar al 6F8 para crear bloques de memoria (3uncin 4.h) o destruirlos (con la 3uncin 49h)!
, la hora de recorrer la cadena de bloques de memoria, si se sigue el siguiente orden de e#aluacin el resultado ser-
siempre correcto$ en primer lugar, si aparece un 9:6 0000 signi3ica que es un bloque libre! 8i el 9:6 no apunta a un 989 (no
apunta a un -rea que empieza por +0"6h +'"6h) se trata entonces de un bloque del sistema! 8i el 9:6 apunta al A"5*1,
se trata de un bloque del programa (recu>rdese que el A"5 lo precede inmediatamente)! 8i el 9:6 apunta a un 989 en cuo
o33set +"h una palabra apunta al A"5*1, se trata del bloque del entorno de ese 989! 8i no es ninguno de estos 0ltimos
bloques, por eliminacin ha de ser un bloque de datos!
.!+!'! - 2iberar el espacio de entorno en programas residentes!
Hesulta triste #er como algunos so3isticados programas residentes llegan incluso a autorrelocalizarse en
memoria machacando parte del 989 con ob7eto de economizar algunos btes; despu>s un alto porcenta7e de los mismos se
ol#ida de liberar el espacio de entorno, que para nada utilizan que suele ocupar incluso m-s memoria que todo el 989!
2a manera de liberar el espacio de entorno antes de que un programa quede residente es la siguiente (necesario 6F8
%!0 como mnimo si se obtiene la direccin del 989 utilizando la 3uncin /+h)$
AFL ,E,/+h
:D; +1 ; obtener direccin del 989 en 5M
AFL E8,5M
AFL E8,E8$W+"hX ; direccin del espacio de entorno
AFL ,E,49h ; 3uncin para liberar bloque
:D; +1h ; bloque destruido
,lternati#amente, se puede liberar directamente el bloque de memoria del entorno poniendo directamente un 0 en su 9:6,
aunque es menos elegante! 8i E8 apunta al 989$
AFL ,M,E8$W+"hX ; direccin del espacio de entorno
6E" ,M ; apuntar a su A"5
AFL E8,,M
AFL UFH6 9;H E8$W1X,0 ; liberar bloque (9:6(0)
.!+!.! - 9eculiaridades del A8-6F8 4!0 posteriores!
2a in3ormacin siguiente e)plica las particularidades de los bloques de memoria con A8-6F8 4!0 posteriores; no es
#-lida para 6H-6F8 aunque algunos aspectos concretos puedan ser comunes! 6esde el A8-6F8 %!1, el primer bloque de
memoria es un segmento de datos del sistema, que contiene los dri#ers instalados desde el "FD1:B!8?8! , partir del 6F8
4!0, este bloque de memoria est- di#idido en subbloques, cada uno de ellos precedidos de un bloque de control de memoria
con el siguiente 3ormato$
o33set 0$ 5te, indica el tipo de subsegmento$
V6V - controlador de dispositi#o
VEV - e)tensin de controlador de dispositi#o
V:V - :18 (:nstallable 1ile 8stem) dri#er
V1V - 1:2E8( (-rea de almacenamiento de estas estructuras, si 1:2E8`&)
VMV - 1"58( (-rea de almacenamiento de estas estructuras)
V"V - 5C11EH8( IM (-rea de bu33ers en memoria e)pandida)
V5V - 5C11EH8( (-rea de bu33ers)
V2V - 2,8;6H:LE( (-rea de almacenamiento de las "68)
V8V - 8;,"@8( (zona de cdigo datos de las pilas del sistema)
V;V - :D8;,22( (-rea transitoria de este mandato)
o33set 1$ 9alabra, indica dnde comienza el subsegmento (normalmente a continuacin)
o33set %$ 9alabra, indica el tamaGo del subsegmento (en p-rra3os)
o33set .$ . btes$ en los tipos V6V e V:V, nombre del 3ichero que carg el dri#er!
9or tanto, desde el 6F8 4!0, una #ez localizado el primer A"5, puede despreciarse tomar el que #iene inmediatamente
a continuacin (p-rra3o siguiente) para recorrer los subsegmentos conectados! En el 6F8 &!0 siguientes, los bloques
propiedad del sistema tienen el nombre V8"V (System Code, cdigo del sistema o -reas de memoria superior e)cluidas) o
bien V86V (System Data, con controladores de dispositi#o, etc!)! 6esde la #ersin &!0 del 6F8, estos bloques V86V contienen
subbloques con las mismas caractersticas que los del 6F8 4!0!
,dicionalmente, el 6F8 &!0 introdu7o los bloques denominados CA5 que recorren la memoria superior, en las di3erentes
-reas en que puede estar 3ragmentada! ,cceder a estos bloques de control de memoria es bastante complicado$ el
segmento donde empiezan est- almacenado en el o33set 11h de la tabla de in3ormacin sobre bu33ers de disco, cua
direccin inicial a su #ez se obtiene en el puntero largo que de#uel#e en E8$5M*1+h la 3uncin indocumentada 1)t L-+t o:
L-+t+ (&+h)$ normalmente el resultado es el segmento 9111h! En general, es m-s sencillo ignorar la memoria superior como
una entidad independiente recorrer toda la memoria sin m-s! 8in embargo, para poder acceder a los bloques de memoria
superior >stos han de estar ligados a los de la memoria con#encional$ para conectarlos, si no lo est-n, puede emplearse la
3uncin, tradicionalmente indocumentada (aunque recientemente ha de7ado de serlo) 1)t o8 S)t M)(o8= Allo'at-o
St8at)/= (&.h) del 6F8$ es con#eniente preser#arla antes #ol#er a restaurar esta in3ormacin despu>s de alterarla! En
cualquier caso, el 3ormato de los bloques de control CA5 es el siguiente$
o33set 0$ 5te con #alor &,h para el 0ltimo bloque 46h en otro caso!
o33set 1$ 9alabra con el 9:6!
o33set %$ 9alabra con el tamaGo del bloque en p-rra3os!
o33set .$ . 5tes$ VCA5V si es el primer bloque CA5 V8AV si es el 0ltimo!
.!+!9! - "mo recorrer los bloques de memoria!
2a organizacin de la memoria #ara seg0n la #ersin del sistema operati#o instalada! En lneas generales, todo lo
comentado hasta ahora -e)cepto lo del apartado anterior- es #-lido para cualquier #ersin del 6F8! 8in embargo, en las
m-quinas que tienen memoria superior, las cosas pueden cambiar un poco en esta zona de memoria$ si tienen instalado
alg0n gestor de memoria e)traGo, este -rea puede estar desconectada por completo de los primeros /40 @b! "on 6H-6F8
el usuario puede utilizar el comando AEAA,M para habilitar o inhibir el acceso a la memoria superior; desde el A8-6F8 &!0
e)isten 3unciones espec3icas del sistema para estas tareas!
El programa de e7emplo listado m-s aba7o recorre toda la memoria sin adentrarse en las particularidades de ning0n
sistema operati#o! ;an slo se toma la molestia de intentar detectar si e)iste memoria superior , en ese caso, mostrar
tambi>n su contenido! Este algoritmo puede no enseGar todo lo que podra enseGar gracias a las 0ltimas #ersiones del 6F8,
pero s gran parte, 3unciona en todas las #ersiones! 9ara comprobar si e)iste memoria superior utiliza una t>cnica mu
sencilla$ al alcanzar el 0ltimo bloque de memoria, se comprueba si el siguiente empezara en el segmento 9111h en #ez del
,000h como cabra esperar en una m-quina de /40@b (slo suelen tener memoria superior las m-quinas que al menos
tienen /40 @b)! 8i esto es as no se considera que el bloque sea el 0ltimo se prosigue con el siguiente, saltando la barrera
de los /40 @b! En este caso, ob#iamente, los 1/ btes que 3altan para completar los /40 @b de memoria son precisamente
un A"5! Esta t>cnica 3unciona slo a partir del A8-6F8 &!0; en 6H-6F8 /!0, si la memoria superior est- inhibida con
AEAA,M -C, no 3unciona (6H-6F8 /!0 se encarga de machacar el 0ltimo A"5 de la memoria con#encional no de7a ni
rastro) aunque s con AEAA,M *C! ;ambi>n se imprime el nombre de los programas, aunque en 6F8 %!%0 #ersiones
anteriores salga basura! ,dem-s, el 9:6 de tipo / se interpreta como un bloque de memoria superior MA8 -que se estudiar-
en el siguiente apartado de este mismo captulo- ba7o 6H-6F8 /!0, imprimi>ndose tambi>n el nombre!
2a primera accin de A,9,AEA al ser e7ecutado es reba7ar la memoria que tiene asignada hasta el mnimo necesario;
por ello en el resultado 3igura ocupando slo 1440 btes teniendo tras de s un gran bloque libre! Es con#eniente que los
programas reba7en al principio la memoria asignada con ob7eto de 3acilitar el traba7o ba7o ciertos entornos pseudo-multitarea
soportados por el 6F8; de hecho, es norma com0n en el cdigo generado por los compiladores realizar esta operacin al
principio! 8in embargo, no todo el mundo se preocupa de ello , a 3in de cuentas, tampoco es tan importante!
Cn e7emplo de la salida que puede producir este programa es el siguiente, tomado de una m-quina con memoria superior
ba7o los dos sistemas operati#os m-s comunes (aunque en los e7emplos los espacios de entorno han coincidido 7unto al
bloque de programa, ello no siempre sucede as)! 2as di3erentes ocupaciones de memoria de los programas en ambos
sistemas operati#os se deben 3recuentemente a que se trata de #ersiones distintas$
6H-6F8 /!0 A8-6F8 &!0
A,9,AEA +!+ A,9,AEA +!+
- :n3ormacin sobre la memoria del sistema! - :n3ormacin sobre la memoria del sistema!
;ipo Cbicacin ;amaGo 9:6 9ropietario ;ipo Cbicacin ;amaGo 9:6 9ropietario
-------- --------- ------- ----- --------------- -------- --------- ------- ----- ---------------
8istema 0000-00%1 1!0+4 :nterrupciones 8istema 0000-00%1 1!0+4 :nterrupciones
8istema 0040-0041 +&/ 6atos del 5:F8 8istema 0040-0041 +&/ 6atos del 5:F8
8istema 00&0-0+%" '!... 8istema Fperat! 8istema 00&0-0+&+ .!+40 8istema Fperat!
8istema 0+%E-0+16 %!0'+ 000. 8istema 0+&4-04&1 .!%.4 000.
9rograma 0+11-0%1E &1+ 0+11 "FAA,D6 8istema 04/1-04/4 /4 000.
Entorno 0%+0-0%%1 &1+ 0+11 "FAA,D6 9rograma 04//-0&0E +!'04 04// "FAA,D6
6atos 0%41-0%&. %.4 0+11 "FAA,D6 2ibre 0&10-0&1% /4 0000 \Dadie`
9rograma 0%&,-0%EE +!%.4 0%&, A,;,B,AE Entorno 0&1&-0&44 '/. 04// "FAA,D6
Entorno 0%10-040. 400 040, @E?HE8E; Entorno 0&4/-0&/' &44 0&/9 A,9,AEA
9rograma 040,-0416 %+0 040, @E?HE8E; 9rograma 0&/9-0&"+ 1!440 0&/9 A,9,AEA
Entorno 0411-04%' 400 04%9 A,9,AEA 2ibre 0&"4-911E /%1!'+. 0000 \Dadie`
9rograma 04%9-049+ 1!440 04%9 A,9,AEA 8istema ,000-6.00 ++9!%9+ 000.
2ibre 0494-911E /%/!&9+ 0000 \Dadie` 8istema 6.0+-E1&9 %.!+'+ 000.
8istema ,000-6E11 +&.!04. 000' 2ibre E1&5-E1'1 &9+ 0000 \Dadie`
8istema 6101-E4'' ++!%.4 000. 9rograma E1.1-E1.6 +0. E1.1 6F8LEH
8istema E4'9-E4.% 1'/ 000. 9rograma E1.1-E+%" +!'.4 E1.1 D281CD"
8istema E4.&-E4.6 144 000. 9rograma E+%E-E%,1 &!9+0 E+%E BH,9E:"8
8istema E4.1-E&91 4!144 000. 9rograma E%51-E&%% /!19+ E%51 8E,HE
8istema E&9%-E'6, 9!%44 000. 9rograma E&%&-E/%' 4!144 E&%& 6F8@E?
8istema E'6"-E.0/ /.. 000. 9rograma E/%9-E'E+ /!.1/ E/%9 9H:D;
8istema E.0.-E.10 144 000. 9rograma E'E4-E.40 1!4.. E'E4 H"2F"@
8istema E.1+-E.1, 144 000. 9rograma E.4+-E./+ &+. E.4+ 6:8@2E6
8istema E.1"-E.6E %!1+0 000. 9rograma E./4-E"10 1.!/40 E./4 6,;,92C8
9rograma E.E0-E,&1 &!9+0 E.E0 BH,9E:"8 9rograma E"1+-E6&9 1!//4 E"1+ E5HE,@
9rograma E,&%-E,/0 ++4 E,&% "2:"@ 9rograma E6&5-E6'E &'/ E6&5 ,D8:C9
9rograma E,/+-E,/E +0. E,/+ 6F8LEH 9rograma E6.0-E6." +0. E6.0 9,;"E@E?
9rograma E,'0-E,'1 +&/ E,'0 ,2;6C9 9rograma E6.E-E69% 9/ E6.E ;68@
,rea MA8 E,.1-E,.1 +40 000/ 51A9+L," 6atos E69&-1/64 %'!... E6.E ;68@
9rograma E,91-E,"0 '/. E,91 L8, 2ibre 1/6/-1/11 /'+ 0000 \Dadie`
,rea MA8 E,"+-E51' 1!%'/ 000/ H"2F"@
,rea MA8 E519-E5%0 %.4 000/ 6:8@2E6
9rograma E5%+-E654 10!+.. E5%+ LU,;"E
,rea MA8 E65/-EEE" 4!9'/ 000/ 6,;,92C8
,rea MA8 EEEE-E141 1!&/. 000/ E5HE,@
2ibre E1&1-E11E +!'.4 0000 \Dadie`
8istema 1000-1&11 +4!&'/ 000'
8istema 1/01-1/11 4!0.0 000.
2istado de A,9,AEA +!+
.!%! - AEAFH:,8 EM;ED6:6, ? 8C9EH:FH MA8!
El controlador MA8 implementa una serie de 3unciones para acceder de manera sencilla a la memoria e)tendida! En
principio, ha 3unciones para asignar liberar el EA, (3recuentemente a estar- ocupado por el sistema operati#o), para
controlar la lnea ,+0 (en la actualidad suele estar permanentemente habilitada), para a#eriguar la memoria e)tendida
disponible, para asignar dicha memoria a los programas que la solicitan (a los que de#uel#e un handle de control, igual que
cuando se abre un 3ichero), liberarla, de#ol#er la direccin 3sica para quien desee realizar trans3erencias directas lo m-s
interesante$ para (o;)8 <loEu)+, bien sea entre zonas de la memoria e)tendida o entre la memoria con#encional la
e)tendida, de la manera m-s ptima r-pida seg0n el tipo de "9C que se trate! 6igamos que la memoria e)tendida MA8 es
como un gran banco o almac>n de memoria torpe, del que podemos traer o lle#ar datos nada m-s!
,dicionalmente, el controlador MA8 aGade 3unciones para gestionar la memoria superior! 2os bloques de memoria
superior no son accesibles de manera directa por los programas, a menos que >stos sean e)presamente cargados en este
-rea con E:2F,6 2F,6E:BE! 8in embargo, los programas pueden solicitar zonas de memoria superior al controlador
MA8, que adem-s de la memoria e)tendida gestiona tambi>n estas -reas! Estos bloques de memoria son gestionados de
manera independiente a los de la memoria con#encional, e)istiendo 3unciones espec3icas del controlador MA8 para localizar
liberar los bloques! "on 6H-6F8 /!0 algunos gestores de memoria, en la memoria superior pueden residir tanto bloques
de memoria 6F8 gestionados por el sistema (normalmente, como consecuencia de un E:2F,6 para instalar programas
residentes), as como aut>nticos bloques de memoria MA8! Healmente, las zonas que emplea el 6H-6F8 no son sino
bloques de este tipo de memoria!
El A8-6F8 &!0 posteriores, sin embargo, reser#an toda la memoria superior para sus propios usos -cargar programas
residentes- cuando se indica 6F8(CA5 en el "FD1:B!8?8; por lo que si alguna aplicacin solicita memoria superior MA8
no la encontrar-! 9ero se puede emplear la 3uncin &3N para conectar la memoria superior a continuacin, con la misma
3uncin, cambiar la estrategia de asignacin de memoria para que el sistema asigne memoria superior en respuesta a las
3unciones ordinarias de asignacin de memoria! 6espu>s es con#eniente restaurar la estrategia de asignacin el estado de
la memoria superior a la situacin inicial (tambi>n se puede consultar pre#iamente con la 3uncin &.h)!
2a hecho de que un programa pueda solicitar memoria superior al sistema es una posibilidad interesante$ ello permite a
los programas residentes auto-relocalizarse de una manera sencilla a estas zonas, anticip-ndose a la actuacin de usuarios
ine)pertos que podran ol#idarse del E:2F,6 o el 2F,6E:BE! 9or otra parte, se economiza algo de memoria al poder
suprimirse el 989 en la copia! "on A8-6F8 &!0 posteriores, no obstante, el programa deber- de7ar algo residente en
memoria con#encional (si no se termina residente, el sistema libera los bloques asignados en memoria superior) o bien
modi3icar el 9:6 de los bloques en memoria superior para que al terminar sin quedar residente el 6F8 no los libere!
9ara poder emplear los ser#icios del controlador MA8 ha que #eri3icar primero que est- instalado el programa
E:AEA!8?8 o alguno equi#alente (el EAA%./ del 6H-6F8 /!0 integra tambi>n las 3unciones del E:AEA!8?8, as como el
TEAA%./)! 9ara ello se chequea la entrada 4%h en la interrupcin Aultiple), comprobando si de#uel#e .0h en el registro ,2
( no 011h como otros programas residentes)$
AFL ,M,%&+1h ; obtener #ector de :D; +1h en E8$5M
:D; +1h
AFL ,M,E8
"A9 ,M,0
[E noZhaZMA8 ; en 6F8 +!) la :D; +1h est- inde3inida
AFL ,M,4%00h ; chequear presencia de MA8
:D; +1h ; interrupcin Aultiple)
"A9 ,2,.0h
[E haZMA8
[DE noZhaZMA8
,ntes de llamar a la :D; +1h se comprueba que esta interrupcin est- apuntando a alg0n sitio (con el segmento distinto
de 0) a que en algunas #ersiones +!) del 6F8 est- sin inicializar el sistema se cuelga si se in#oca sin precauciones! 2as
3unciones del controlador MA8 no se in#ocan por medio de ninguna interrupcin, como sucede con las del 6F8 o la 5:F8!
En su lugar, una #ez detectada la presencia del mismo se le debe interrogar pregunt-ndole dnde est- instalado, por medio
de la sub3uncin 10h$
AFL ,M,4%10h ; preguntar direccin del controlador
:D; +1h
AFL MA8Zseg,E8 ; almacenarla
AFL MA8Zo33,5M
donde MA8Zseg MA8Zo33 es una estructura del tipo$
gestorZMA8 2,5E2 6UFH6
MA8Zo33 6U 0
MA8Zseg 6U 0
9osteriormente, cuando haa que utilizar un ser#icio o 3uncin del controlador MA8 se colocar- el n0mero del mismo en
,E se e7ecutar- un CALL /)+to8QXMS! 9ara utilizar las llamadas al MA8 es preciso que en la pila queden al menos +&/
btes libres! En un ap>ndice al 3inal del libro se listan documentan todas las 3unciones MA8!
8i por cualquier moti#o 3uera necesario en un programa residente interceptar las llamadas al controlador MA8 realizadas
por los programas de aplicacin, ha que decir que ello es posible! 9or supuesto, no es tan sencillo como des#iar un #ector
de interrupcin$ ha que modi3icar el cdigo del propio controlador! 9or 3ortuna, todos los controladores MA8 suelen
comenzar con una instruccin de salto larga o corta ([A9 MMMM$MMMM, [A9 MMMM, [A9 8EFH; MM) , si >sta ocupa
menos de & btes, los restantes est-n cubiertos de instrucciones DF9 (cdigo de operacin 90h)! 8e pueden modi3icar los
primeros btes del mismo para poner un salto hacia nuestra propia rutina, que luego acabe llamando a su #ez al controlador
pre#io (el H,A6H:LE de Aicroso3t, por e7emplo, realiza esta complicada maniobra)!
3.#.- MEMORIA EX$ANDIDA EMS.
2a memoria e)pandida, como se coment al principio del captulo, es una t>cnica de paginacin para sol#entar la
limitacin de /40 @b de memoria de los 9"! Easta la #ersin % del controlador de memoria e)pandida, esta e)tensin
consiste en un segmento de memoria de /4 @b (en la direccin 060000h o 0E0000h, a #eces otras como 0".000h, etc!)
di#idido en cuatro p-ginas adacentes de 1/ @b! Ese segmento se denomina (a8'o *) pP/-a de la memoria e)pandida!
2as cuatro p-ginas son las pP/-a+ :+-'a+ numeradas entre 0 %! "uando un programa solicita memoria e)pandida, se le
asigna un handle de control (un n0mero de 1/ bits) que la re3erencia, as como cierto n0mero de pP/-a+ l./-'a+ asociado
al mismo! , partir de ese momento, cualquier p-gina lgica puede ser (ap)a*a sobre una de las cuatro p-ginas 3sicas! 6e
este modo, es 3actible acceder simult-neamente a cuatro p-ginas lgicas entre todas las disponibles! 9or ello es posible
incluso asignar la misma p-gina lgica a m-s de una p-gina 3sica, aunque es un tanto absurdo! 2a principal utilidad de la
memoria e)pandida es de cara a almacenar grandes estructuras de datos e#itando en lo posible un acceso a disco! 2a
memoria e)pandida se implementa con una e)tensin del hardKare, aunque algunos equipos +./ a la tienen integrada en
la placa base! En los %./ superiores, la "9C puede ser colocada en modo virtual @A, una #ariante del modo protegido en la
que la memoria e)pandida puede ser emulada por las t>cnicas de memoria #irtual de este microprocesador, sin necesidad
de una e)tensin hardKare! ,lgunos sistemas de memoria e)pandida real (no emulada) pueden soportar incluso una
reinicializacin del 9" sin perder el contenido de esa memoria!
9ara utilizar la memoria e)pandida ha que in#ocar la interrupcin /'h! 9ara detectar la presencia del controlador ha dos
m>todos! El primero consiste en buscar un dispositi#o VEAAMMMM0V, a que el gestor de memoria e)pandida se carga
desde el "FD1:B!8?8 de3ine un controlador de dispositi#o de caracteres con ese nombre! Es tan sencillo como intentar
abrir un 3ichero con ese nombre comprobar si e)iste! 6esde la lnea de comandos del 6F8 se puede hacer as$
:1 EM:8; EAAMMMM0 E"EF E,? "FD;HF2,6FH EA8
E)iste el riesgo de que en lugar de un controlador con ese nombre se trate Nde un 3ichero que alg0n gracioso haa
creadoO$ para cerciorarse, ha unas 3unciones de control :F";2 en el 6F8 para asegurar que se trata de un dispositi#o no
de un 3ichero! 8in embargo, no es recomendable este m>todo para detectar el EAA en los programas residentes en los
controladores de dispositi#o$ e)iste otro medio m-s con#eniente para esos casos, que tambi>n puede ser empleado de
manera general en cualquier otra aplicacin! "onsiste en buscar la cadena VEAAMMMM0V en el o33set 10
del +)/()to apuntado por el #ector /'h (despreciando el o33set de dicho #ector) Nas de sencilloO!
2as 3unciones del EAA se in#ocan colocando en ,E el n0mero de 3uncin e7ecutando la :D; /'h$ a la #uelta, ,E
normalmente #aldr- 0 para indicar que todo ha ido bien! En un ap>ndice al 3inal del libro se listan documentan todas
las 3unciones EA8! Estas 3unciones se numeran a partir de 40h, aunque desde la 41h slo est-n disponibles a partir de la
#ersin 4!0 del controlador, si bien en muchos casos no son necesarias! 2as principales 3unciones (soportadas por EA8 %!+)
son$
40h
Fbtener el estado del controlador (#er si es operati#o la memoria EA8 puede 3uncionar
bien)!
41h Fbtener el segmento del marco de p-gina (no tiene por qu> se 06000h ni 0E000h)!
4+h 9reguntar el n0mero de p-ginas libres que a0n no est-n asignadas!
4%h
,signar p-ginas (esta 3uncin de#uel#e un handle de control, igual que cuando se abre un
3ichero)!
44h $apear p-ginas (colocar una cierta p-gina lgica 0!!D en una de las 3sicas 0!!%)!
4&h 2iberar las p-ginas asignadas, para que puedan usarlas 3uturos programas (Nes #italO)!
4/h 9reguntar la #ersin del controlador de memoria e)pandida!
4'h
8al#ar el conte)to del mapa de p-ginas (usado por los ;8H para no alterar el marco de
p-gina)!
4.h
Hestaurar el conte)to del mapa de p-ginas (usado por los ;8H para no alterar el marco
de p-gina)!
46h Fbtener in3ormacin de todos los handles que ha las p-ginas que tienen asignadas!
2a memoria e)pandida, le7os de ser slo un in#ento obsoleto para superar los /40@ en los #ie7os ordenadores, es una de
las memorias m-s #ers-tiles disponibles ba7o 6F8! Auchos programas pueden #er incrementado notablemente el
rendimiento si se desarrollan empleando esta memoria en lugar de la MA8! 2a razn es que, con la memoria e)tendida, ha
que traerla (copiarla) a la memoria con#encional, procesarla #ol#erla a copiar a la memoria e)tendida! 8in embargo, con la
memoria e)pandida EA8, una rapidsima 3uncin coloca en el espacio de direcciones del .0./ la memoria que #a a ser
accedida$ all mismo puede ser procesada sin necesidad de mo#imiento 3sico! Esto es debido a que la conmutacin p-ginas
de memoria e)pandida se hace, dicho entre comillas, seleccionando el chip de H,A que se utiliza, sin e)istir mo#imiento
3sico de datos! En algunos casos, sin embargo, la EA8 no aumenta el rendimiento$ por e7emplo, al construir un disco #irtual,
habr- que trans3erir datos desde la memoria con#encional a la MA8 la EA8; en cualquier caso se #a a producir un
mo#imiento 3sico (cqu> mas da que sea hacia la EA8 que hacia la MA8])!
En los modernos sistemas operati#os, la memoria e)pandida soportada a partir de las #ersiones 4!0 del EAA (E)panded
Aemor Aanager) cubre un amplio espectro del espacio de direcciones dentro del megabte gestionado por el A8-6F8!
,qu, las p-ginas no han de ser necesariamente consecuti#as; son m-s de 4 tampoco tienen que ser necesariamente de
1/ @b! 8in embargo, por de3ecto - por razones de compatibilidad- las cuatro primeras p-ginas 3sicas est-n colocadas
adacentemente por encima de los /40@ son de 1/ @b, no siendo recomendable modi3icar esta especi3icacin! 9or
e7emplo, en el sistema %./ en que se escribieron las primeras #ersiones de este libro, con un EAA 4!0, las p-ginas 3sicas 0
a la % estaban ubicadas a partir de la direccin 0".000h; las p-ginas 4 a la +'h estaban ubicadas entre la direccin 10000h
a la 91111h, cubriendo tambi>n los primeros /40 @b (e)cepto los primeros /4 @b)!
8i alguien est- pensando en des#iar la interrupcin /'h desde un programa residente, para interceptar manipular las
llamadas de los programas de aplicacin a esa interrupcin, a puede ir ol#id-ndose! 2a razn es que los %./ superiores
est-n en modo #irtual ./ con los controladores EA8 instalados! Esto signi3ica que cuando un programa in#oca una
interrupcin, como la :D; /'h, la "9C -de la manera que est- programada- pasa inmediatamente a continuacin a e7ecutar
una rutina en modo protegido 3uera del espacio de direcciones del A8-6F8! "on algunos gestores de memoria, como el
EAA%./ del 6H-6F8 /!0, no sucede nada$ ese programa super#isor retorna a la tarea #irtual e7ecuta el cdigo ubicado en
el espacio de direcciones del A8-6F8! 8in embargo, con TEAA%./, el controlador de memoria est- ubicado 3uera de ese
espacio de direcciones, a no #uel#e a >l! 8i se mira con el 6E5CB a donde apunta la :D; /'h en una m-quina con
TEAA (por e7emplo, traceando una llamada a la interrupcin), se #er- que este #ector apunta al siguiente cdigo$
:D; +.h
:HE;
E#identemente, Nese no es el controlador de memoriaO! 9ara acceder a >l ha que e7ecutar una interrupcin de verdad!
8upongo que a tra#>s de la especi3icacin L"9: (Lirtual "ontrol 9rogram :nter3ace) que regula el acceso a los modos
e)tendidos del %./, habr- alg0n medio de poder acceder al cdigo del controlador EA8, o interceptar las llamadas! 8in
embargo, no es tan 3-cil como cambiar un #ector!!!

S-ar putea să vă placă și