Está en la página 1de 66

ARQUITECTURA E HISTORIA DE LOS MICROORDENADORES

El ensamblador es un lenguaje de programacin que, por la traduccin


directa de los mnemnicos a instrucciones maquina, permite realizar
aplicaciones rpidas, solucionando situaciones en las que los tiempos de
ejecucin constituye el factor principal para que el proceso discurra con la
suficiente fluidez. Esta situacin, que indudablemente s influye sobre la
eleccin del lenguaje de programacin a utilizar en el desarrollo de una
determinada rutina, y dada la aparicin de nuevos compiladores de lenguajes
de alto nivel que optimizan el cdigo generado a niveles muy prximos a los
que un buen programador es capaz de realizar en ensamblador, no es la nica
razn para su utilizacin.
Es sobradamente conocido que los actuales sistemas operativos son
programados en su mayor parte en lenguajes de alto nivel, especialmente C,
pero siempre hay una parte en la que el ensamblador se hace casi insustituible
bajo DOS y es la programacin de los drivers para los controladores de
dispositivos, relacionados con las tareas de ms bajo nivel de una mquina,
fundamentalmente las operaciones de entrada/salida en las que es preciso
actuar directamente sobre los dems chips que acompaan al
microprocesador. Por ello y porque las instrucciones del lenguaje ensamblador
estn ntimamente ligadas a la mquina, vamos a realizar primero un somero
repaso a la arquitectura interna de un microordenador.
1.1. - ARQUITECTURA VON NEWMAN.
Centrndonos en los ordenadores sobre los que vamos a trabajar
desarrollar a grandes rasgos la arquitectura Von Newman que, si bien no es
la primera en aparecer, s que lo hizo prcticamente desde el comienzo de los
ordenadores y se sigue desarrollando actualmente. Claro es que est siendo
desplazada por otra que permiten una mayor velocidad de proceso, la RISC.
En los primeros tiempos de los ordenadores, con sistemas de numeracin
decimal, una electrnica sumamente complicada muy susceptible a fallos y un
sistema de programacin cableado o mediante fichas, Von Newman propuso
dos conceptos bsicos que revolucionaran la incipiente informtica:
a) La utilizacin del sistema de numeracin binario. Simplificaba
enormemente los problemas que la implementacin electrnica de las
operaciones y funciones lgicas planteaban, a la vez proporcionaba una mayor
inmunidad a los fallos (electrnica digital).
b) Almacenamiento de la secuencia de instrucciones de que consta el
programa en una memoria interna, fcilmente accesible, junto con los datos
que referencia. De este forma la velocidad de proceso experimenta un
considerable incremento; recordemos que anteriormente una instruccin o un
dato estaban codificados en una ficha en el mejor de los casos.
Tomando como modelo las mquinas que aparecieron incorporando las
anteriores caractersticas, el ordenador se puede considerar compuesto por las
siguientes partes:
- La Unidad Central de Proceso, U.C.P., ms conocida por sus siglas en
ingls (CPU).
- La Memoria nterna, M.
- Unidad de Entrada y Salida, E/S.
- Memoria masiva Externa, ME.
Realicemos a continuacin una descripcin de lo que se entiende por cada
una de estas partes y cmo estn relacionadas entre si:
- La Unidad Central de Proceso (CPU) viene a ser el cerebro del ordenador
y tiene por misin efectuar las operaciones aritmtico-lgicas y controlar las
transferencias de informacin a realizar.
- La Memoria nterna (M) contiene el conjunto de instrucciones que ejecuta
la CPU en el transcurso de un programa. Es tambin donde se almacenan
temporalmente las variables del mismo, todos los datos que se precisan y
todos los resultados que devuelve.
- Unidades de entrada y salida (E/S) o nput/Output (/O): son las
encargadas de la comunicacin de la mquina con el exterior, proporcionando
al operador una forma de introducir al ordenador tanto los programas como los
datos y obtener los resultados.
Como 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 conjunto de lneas que enlazan los distintos
componentes del ordenador, por ellas se realiza la transferencia de datos entre
todos sus elementos.
Se distinguen tres tipos de bus:
- De control: forman parte de l las lneas que seleccionan desde dnde y
hacia dnde va dirigida la informacin, tambin las que marcan la secuencia de
los pasos a seguir para dicha transferencia.
- De ato!: por l, de forma bidireccional, fluyen los datos entre las distintas
partes del ordenador.
- De "recc"one!: como vimos, la memoria est dividida en pequeas
unidades de almacenamiento que contienen las instrucciones del programa y
los datos. El bus de direcciones consta de un conjunto de lneas que permite
seleccionar de qu posicin de la memoria se quiere leer su contenido.
Tambin direcciona los puertos de E/S.
La forma de operar del ordenador en su conjunto es direccionar una
posicin de la memoria en busca de una instruccin mediante el bus de
direcciones, llevar la instruccin a la unidad central de proceso -CPU- por
medio del bus de datos, marcando la secuencia de la transferencia el bus de
control. En la CPU la instruccin se decodifica, interpretando qu operandos
necesita: si son de memoria, es necesario llevarles a la CPU; una vez que la
operacin es realizada, si es preciso se devuelve el resultado a la memoria.
1.#. - EL MICRO$ROCESADOR.
Un salto importante en la evolucin de los ordenadores lo introdujo el
microprocesador: se trata de una unidad central de proceso contenida
totalmente en un circuito integrado. Comenzaba as la gran carrera en busca de
lo ms rpido, ms pequeo; rpidamente el mundo del ordenador empez a
ser accesible a pequeas empresas e incluso a nivel domstico: es el boom de
los microordenadores personales. Aunque cuando entremos en la descripcin
de los microprocesadores objeto de nuestro estudio lo ampliaremos, har un
pequeo comentario de las partes del microprocesador:
- Unidad aritmtico-lgica: Es donde se efectan las operaciones aritmticas
(suma, resta, y a veces producto y divisin) y lgicas (and, or, not, etc.).
- Decodificador de instrucciones: All se interpretan las instrucciones que van
llegando y que componen el programa.
- Bloque de registros: Los registros son celdas de memoria en donde queda
almacenado un dato temporalmente. Existe un registro especial llamado de
indicadores, estado o flags, que refleja el estado operativo del microprocesador.
- Bloque de control de buses internos y externos: supervisa todo el proceso
de transferencias de informacin dentro del microprocesador y fuera de l.
1.%. - &REVE HISTORIA DEL ORDENADOR $ERSONAL ' EL DOS.
La trepidante evolucin del mundo informtico podra provocar que algn
recin llegado a este libro no sepa exactamente qu diferencia a un ordenador
"AT" del viejo "XT" inicial de BM. Algunos trminos manejados en este libro
podran ser desconocidos para los lectores ms jvenes. Por ello, haremos una
pequea introduccin sobre la evolucin de los ordenadores personales,
abarcando toda la historia (ya que no es muy larga).
La (remon"c")n.
En 1973, el centro de investigacin de Xerox en Palo Alto desarroll un
equipo informtico con el aspecto externo de un PC personal actual. Adems
de pantalla y teclado, dispona de un artefacto similar al ratn; en general, este
aparato (denominado Alto) introdujo, mucho antes de que otros los
reinventaran, algunos de los conceptos universalmente aceptados hoy en da.
Sin embargo, la tecnologa del momento no permiti alcanzar todas las
intenciones. Alguna innovacin, como la pantalla vertical, de formato similar a
una hoja de papel (que desearan algunos actuales internautas para los
navegadores) an no ha sido adoptada: nuestros PC's siguen pareciendo
televisores con teclas, y los procesadores de textos no muestran legiblemente
una hoja en vertical completa incluso en monitores de 20 pulgadas.
El m"cro(roce!aor.
El desarrollo del primer microprocesador por ntel en 1971, el 4004 (de 4
bits), supuso el primer paso hacia el logro de un PC personal, al reducir
drsticamente la circuitera adicional necesaria. Sucesores de este procesador
fueron el 8008 y el 8080, de 8 bits. Ed Roberts construy en 1975 el Alta"r
**++ basndose en el 8080; aunque esta mquina no tena teclado ni pantalla
(slo interruptores y luces), era una arquitectura abierta (conocida por todo el
mundo) y cuyas tarjetas se conectaban a la placa principal a travs de 100
terminales, que ms tarde terminaran convirtindose en el bus estndar S-100
de la industria.
El A((le-I apareci en 1976, basado en el microprocesador de 8 bits 6502,
en aquel entonces un recin aparecido aunque casi 10 veces ms barato que
el 8080 de ntel. Fue sucedido en 1977 por el A((le-II. No olvidemos los
rudimentos de la poca: el Apple- tena un lmite mximo de 48 Kbytes de
memoria. En el mismo ao, Commodore sac su $ET con 8 Kbytes. Se
utilizaban cintas de casete como almacenamiento, aunque comenzaron a
aparecer las unidades de disquete de 5. Durante finales de los 70
aparecieron muchos otros ordenadores, fruto de la explosin inicial del
microprocesador.
Lo! m"cro! e lo! *+.
En 1980, Sir Clive Sinclair lanz el ZX-80, seguido muy poco despus del
,--*1. Estaban basados en un microprocesador sucesor del 8085 de ntel: el
Z80 (desarrollado por la empresa Zilog, creada por un ex-ingeniero de ntel).
Commodore irrumpi con sus VIC-#+ y, posteriormente, el Commoore ./,
basados an en el 6502 y, este ltimo, con mejores posibilidades grficas y
unos 64 Kb de memoria. Su competidor fue el ,--S(ectr0m de Sinclair,
tambin basado en el Z80, con un chip propio para gestin de grficos y otras
tareas, la ULA, que permiti rebajar su coste y multiplic su difusin por
europa, y en particular por Espaa. Sin embargo, todos los ordenadores
domsticos de la poca, como se dieron en llamar, estaban basados en
procesadores de 8 bits y tenan el lmite de 64 Kb de memoria. Los intentos de
rebasar este lmite manteniendo an esos chips por parte de la plataforma MS-
(supuesto estndar mundial con la misma suerte que ha corrido el Esperanto) o
los C$C de Amstrad, de poco sirvieron.
El I&M $C.
Y es que BM tambin fabric su propio ordenador personal con vocacin
profesional: el 12 de agosto de 1981 present el I&M $C. Estaba basado en el
microprocesador 8088, de 16 bits, cuyas instrucciones sern las que usemos
en este libro, ya que todos los procesadores posteriores son bsicamente (en
MS-DOS) versiones mucho ms rpidas del mismo. El equipamiento de serie
consista en 16 Kbytes de memoria ampliables a 64 en la placa base (y a 256
aadiendo tarjetas); el almacenamiento externo se haca en cintas de casete,
aunque pronto aparecieron las unidades de disco de 5 pulgadas y simple
cara (160/180 Kb por disco) o doble cara (320/360 Kb). En 1983 apareci el
I&M $C--T, que traa como novedad un disco duro de 10 Mbytes. Un ao ms
tarde aparecera el I&M $C-AT, introduciendo el microprocesador 286, as
como ranuras de expansin de 16 bits (el bus ISA de 16 bits) en contraposicin
con las de 8 bits del PC y el XT (bus SA de 8 bits), adems incorporaba un
disco duro de 20 Mbytes y disquetes de 5 pero con 1.2 Mbytes.
En general, todos los equipos con procesador 286 o superior pueden
catalogarse dentro de la categora AT; el trmino XT hace referencia al
8088/8086 y similares. Finalmente, por PC (a secas) se entiende cualquiera de
ambos; aunque si se hace distincin entre un PC y un AT en la misma frase,
por PC se sobreentiende un XT, menos potente. El trmino PC ya digo, no
obstante, es hoy en da mucho ms general, referenciando habitualmente a
cualquier ordenador personal.
Alrededor del PC se estaba construyendo un imperio de software ms
importante que el propio hardware: estamos hablando del sistema operativo
PC-DOS. Cuando aparecieron mquinas compatibles con el PC de BM, tenan
que respetar la compatibilidad con ese sistema, lo que fue sencillo (ya que
Microsoft, le gustara o no a BM, desarroll el MS-DOS, compatible con el PC-
DOS pero que no requera la BOS del ordenador original, cuyo copyright era
de BM). ncluso, el desarrollo de los microprocesadores posteriores ha estado
totalmente condicionado por el MS-DOS. [Por cierto, la jugada del PC-
DOS/MS-DOS se repetira en alguna manera pocos aos despus con el OS/2-
Windows].
A partir de 1986, BM fue paulatinamente dejando de tener la batuta del
mercado del PC. La razn es que la propia BM tena que respetar la
compatibilidad con lo anterior, y en ese terreno no tena ms facilidades para
innovar que la competencia. El primer problema vino con la aparicin de los
procesadores 386: los dems fabricantes se adelantaron a BM y lanzaron
mquinas con ranuras de expansin an de 16 bits, que no permitan obtener
todo el rendimiento. BM desarroll demasiado tarde, en 1987, la arquitectura
Microchannel, con bus de 32 bits pero cerrada e incompatible con tarjetas
anteriores (aunque se desarrollaron nuevas tarjetas, eran caras) y la incluy en
su gama de ordenadores $S1# (alguno de cuyos modelos era an realmente
SA). La insolente respuesta de la competencia fue la arquitectura ESA,
tambin de 32 bits pero compatible con la SA anterior.
Otro ejemplo: si BM gobern los estndares grficos hasta la VGA, a partir
de ah sucedi un fenmeno similar y los dems fabricantes se adelantaron a
finales de los 80 con mejores tarjetas y ms baratas; sin embargo, se perdi la
ventaja de la normalizacin (no hay dos tarjetas superiores a la VGA que
funcionen igual).
ESA tambin era caro, as que los fabricantes orientales, cruzada ya la
barrera de los aos 90, desarrollaron con la norma VESA las placas con bus
local (VESA Local Bus); bsicamente es una prolongacin de las patillas de la
CPU a las ranuras de expansin, lo que permite tarjetas rpidas de 32 bits pero
muy conflictivas entre s. Esta arquitectura de bus se populariz mucho con los
procesadores 486. Sin embargo, al final el estndar que se ha impuesto ha sido
el propuesto por el propio fabricante de las CPU: ntel, con su bus CI, que con
el Pentium se ha convertido finalmente en el nico estndar de bus de 32 bits.
Estas mquinas an admiten no obstante las viejas tarjetas SA, suficientes
para algunas aplicaciones de baja velocidad (modems,... etc).
La e2ol0c")n el MS-DOS.
Una manera sencilla de comprender la evolucin de los PC es observar la
evolucin de las sucesivas versiones del DOS y los sistemas que le han
sucedido.
En 1979, Seatle Com(0ter necesitaba apoyar de alguna manera a sus
incipientes placas basadas en el 8086. Como Digital Research estaba tardando
demasiado en convertir el CP/M-80 a CP/M-86, desarroll su propio sistema: el
QDOS 0.1, que fue presentado en 1980. Antes de finales de ao apareci
QDOS 0.3.
Bill Gates, dueo de M"cro!o3t, de momento slo posea una versin de
lenguaje BASC para 8086 no orientada a ningn sistema operativo particular,
que le gust a algn directivo de BM. Bill Gates ya haba hecho la primera
demostracin mundial de BASC corriendo en un 8086 en las placas de Seatle
Computer (en julio de 1979) y haba firmado un contrato de distribucin no
exclusiva para el QDOS 0.3 a finales de 1980. En abril de 1981 aparecieron las
primeras versiones de CP/M-86 de Digital, a la vez que QDOS se renombraba
a 86-DOS 1.0 aunque en principio pareca tener menos futuro que el CP/M. En
Julio, sin embargo, Microsoft adquira todos los derechos del 86-DOS.
Digital Research no ocupa actualmente el lugar de Microsoft porque en 1981
era una compaa demasiado importante como para cerrar un acuerdo con BM
sin imponer sus condiciones para cederle los derechos del sistema operativo
CP/M. As que BM opt por Bill Gates, que acababa de adquirir un sistema
operativo, el 86-DOS, que pas a denominarse PC-DOS 1.0. Las versiones de
PC-DOS no dependientes de la ROM BOS de BM se denominaran MS-DOS,
trmino que ha terminado siendo ms popular.
A continuacin se expone la evolucin hasta la versin 5.0; las versiones
siguientes no aaden ninguna caracterstica interna nueva destacable (aunque
a nivel de interfaz con el usuario y utilidades incluidas haya ms cambios). El
MS-DOS 7.0 sobre el que corre Windows 95 s tiene bastantes retoques
internos, pero no es frecuente su uso aislado o independiente de Windows 95.
Aunque PC-DOS y MS-DOS siembre han caminado paralelos, hay una nica
excepcin: la versin 7.0 (no confundir MS-DOS 7.0 con PC-DOS 7.0: este
ltimo es, realmente, el equivalente al MS-DOS 5.0 6.2).
A4o!to e 15*1. Presentacin del MS-DOS 1.0 original.
Mar6o e 15*#. MS-DOS 1.25, aadiendo soporte para disquetes de
doble cara. Las funciones del DOS (en NT 21h) slo llegaban hasta la
1Fh (la 30h no estaba implementada!).
Mar6o e 15*%. MS-DOS 2.0 introducido con el XT: reescritura del
ncleo en C; mejoras en el sistema de ficheros (FAT, subdirectorios,...);
separacin de los controladores de dispositivo del sistema.
Ma7o e 15*%. MS-DOS 2.01: soporte de juegos de caracteres
internacionales.
Oct08re e 15*%. MS-DOS 2.11: eliminacin de errores.
A4o!to e 15*/. MS-DOS 3.0: Aade soporte para disquetes de
1.2M y discos duros de 20 Mb. No sera necesaria una nueva versin del
DOS para cada nuevo formato de disco si el controlador integrado para
A:, B: y C: lo hubieran hecho flexible algn da.
Mar6o e 15*9. MS-DOS 3.1: Soporte para redes locales.
D"c"em8re e 15*9. MS-DOS 3.2: Soporte para disquetes de 720K
(3-DD).
A8r"l e 15*:. MS-DOS 3.3: Soporte para disquetes de 1.44M (3-
HD). Permite particiones secundarias en los discos duros. Soporte
internacional: pginas de cdigos.
;0l"o e 15**. MS-DOS 4.0: Soporte para discos duros de ms de
32 Mb (cambio radical interno que forz la reescritura de muchos
programas de utilidad) hasta 2 Gb. Controlador de memoria EMM386.
Precipitada salida al mercado.
No2"em8re e 15**. MS-DOS 4.01: Corrige las erratas de la 4.0.
;0n"o e 1551. MS-DOS 5.0: Soporte para memoria superior. La
competencia de Digital Research, que irrumpe en el mundo del DOS una
dcada ms tarde (con DR-DOS), obliga a Microsoft a incluir ayuda
online y a ocuparse un poco ms de los usuarios.
Digital Research trabaj arduamente para lograr una compatibilidad total
con MS-DOS, y finalmente consigui lanzar al mercado su sistema DR-DOS.
Las versiones 5.0 y 6.0 de este sistema, as como el Novell DOS 7.0 (cuando
cedi los derechos a Novell) se pueden considerar prcticamente 100%
compatibles. El efecto del DR-DOS fue positivo, al forzar a Microsoft a mejorar
la interaccin del sistema operativo con los usuarios (documentacin en lnea,
programas de utilidad, ciertos detalles...); por poner un ejemplo, hasta el MS-
DOS 6.2 ha sido necesario intercambiar tres veces el disquete origen y el
destino durante la copia de un disquete normal de 1.44M. En cierto modo, la
prepotencia de Microsoft con el MS-DOS a principios de los noventa era similar
a la de Digital Research a principios de los 80 con el CP/M.
El 30t0ro.
El resto de la historia de los sistemas operativos de PC ya la conoce el
lector, a menos que no est informado de la actualidad. Caminamos hacia la
integracin de los diversos Windows en uno slo, que esperemos que algn da
sea suficientemente abierto para que le surjan competidores. Si en el futuro
hubiera un slo sistema operativo soportado por Microsoft, no vamos por buen
camino.
En ese caso, sera de agradecer que algn juez les obligara a publicar una
especificacin completa de las funciones y protocolos del sistema, con objeto
de que algn organismo de normalizacin internacional las recogiera sin
ambigedades para permitir la libre competencia de otros fabricantes. El DOS y
el Windows actuales no son ningn invento maravilloso de Microsoft. Por poner
un ejemplo, el MS-DOS 1.0 careca de funcin para identificar la versin del
sistema. Exactamente lo mismo le ha sucedido a las primeras versiones de
Windows (hay varios chequeos distintos para detectarlas, segn el modo de
funcionamiento y la versin): el MS-DOS no lo escribi inicialmente Microsoft,
pero Windows s, y salta a la vista que sus programadores, para cometer
semejante despiste, se sentaron delante del teclado antes de hacer un anlisis
de la aplicacin a desarrollar, igual que lo hubiera hecho alguien que hubiera
aprendido a programar con unos fascculos comprados en el kiosco. Con tanto
analista en el paro...
No olvidemos que el DOS y Windows son el fruto de toda la sociedad
utilizando el mismo tipo de ordenadores y necesitando la compatibilidad con lo
anterior a c0al<0"er (rec"o. La prueba evidente son los procesadores de ntel,
construidos desde hace tiempo para dar servicio al sistema operativo del PC.
Somos prisioneros, usuarios obligados de Microsoft. Naturalmente, no tengo
nada contra Microsoft, pero opino que el poder adquirido durante una dcada,
gracias a la exclusiva de los derechos sobre un sistema operativo sin ayuda en
la lnea de comandos, o de un Windows cerrado ntimamente ligado al DOS (de
quien slo Microsoft tiene el cdigo fuente) no legitima a ninguna empresa a
tener tanto poder. No lo olvidemos: el MS-DOS ha dado un vuelco hacia la
amigabilidad con el usuario cuando Digital Research ha aparecido con el DR-
DOS. Del mismo modo que Windows seguir lento o colgndose mientras Unix
no tenga ms aplicaciones comerciales.
Si hay alguien que puede competir con Windows es Unix. Y en Unix no
dependemos de ningn fabricante concreto, ni de hardware ni de software.
Probablemente, la insuficiente normalizacin actual la corregira pronto el
propio mercado. Tiene usted Linux instalado en casa y lo utiliza al menos para
conectarse a nternet por nfova, o quiz le gustara hacerlo algn da?. O por
el contrario es de los que piensan que Bill Gates es un !enio?. Si se queda con
la segunda opcin, es que ve mucho la tele, aunque evidentemente tiene
razn: y cuantos ms como usted, ms !enio que ser...
1./ E!(ec"3"cac"one! t=cn"ca! e lo! m"cro(roce!aore! Intel


>ec?a e
(re!entac")n
Veloc"a
e relo@
Anc?o
e 80!
NAmero e
tran!"!tore!
Memor"a
"recc"ona8le
Memor"a
2"rt0al
&re2e
e!cr"(c")n
4004 15/11/71 108 KHz. 4 bits
2.300 (10
micras)
640 byte
Primer chip con
manipulacin
aritmtica
8008 1/4/72 108 KHz. 8 bits 3.500 16 KBytes
Manipulacin
Datos/texto
8080 1/4/74 2 MHz. 8 bits 6.000 64 KBytes
10 veces las (6
micras)
prestaciones del
8008
8086 8/6/78
5 MHz.
8 MHz.
10 MHz.
16 bits
29.000
(3 micras)
1 MegaByte
10 veces las
prestaciones del
8080
8088 1/6/79
5 MHz.
8 MHz.
8 bits 29.000

dntico al 8086
excepto en su bus
externo de 8 bits
80286 1/2/82
8 MHz.
10 MHz.
12 MHz.
16 Bits
134.000
(1.5 micras)
16 Megabytes
1
Gigabyte
De 3 a 6 veces las
prestaciones del
8086
Microprocesador
ntel 386 DX
17/10/85
16 MHz.
20 MHz.
25 MHz.
33 MHz.
32 Bits
275.000
(1 micra)
4 Gigabytes
64
Terabytes
Primer chip x86
capaz de manejar
juegos de datos
de 32 bits
Microprocesador
ntel 386 SX
16/6/88
16 MHz.
20 MHz.
16 Bits
275.000
(1 micra)
4 gigabytes
64
Terabytes
Bus capaz de
direccionar 16 bits
procesando 32bits
a bajo coste
Microprocesador
ntel 486 DX
10/4/89
25 MHz.
33 MHz.
50 MHz.
32 Bits
(1 micra, 0.8
micras en 50
MHz.)
4 Gigabytes
64
Terabytes
Cach de nivel 1
en el chip
Microprocesador
ntel 486 SX
22/4/91
16 MHz.
20 MHz.
25 MHz.
33 MHz.
32 Bits
1.185.000
(0.8 micras)
4 Gigabytes
64
Terabytes
dntico en diseo
al ntel 486DX,
pero sin
coprocesador
matemtico
Procesador
Pentium
22/3/93
60 MHz.
66 MHz.
75 MHz.
90 MHz.
100 MHz.
120 MHz.
133 MHz.
150 MHz.
166 MHz.
200 MHz.
32 Bits
3,1 millones
(0.8 micras)
4 Gigabytes
64
Terabytes
Arquitectura
escalable. Hasta 5
veces las
prestaciones del
486 DX a 33 MHz.
Procesador 27/3/95 150 MHz. 64 Bits 5,5 millones 4 Gigabytes 64 Arquitectura de
PentiumPro
180 MHz.
200 MHz.
(0.32 micras) Terabytes
ejecucin
dinmica con
procesador de
altas prestaciones
Procesador
Pentium
7/5/97
233 MHz.
266 MHz.
300 MHz.
64 Bits
7,5 millones
(0.32 micras)
4 Gigabytes
64
Terabytes
S.E.C., MMX,
Doble Bus ndep.,
Ejecucin
Dinmica
1.9 La le7 e Moore
El Dr. Gordon Moore, uno de los fundadores
de ntel Corporation, formul en el ao 1965
una ley que se ha venido a conocer como la
"Ley de Moore". La citada ley que est
reflejada en el grfico adjunto, nos viene a
decir que el nmero de transistores
contenidos en un microprocesador se dobla
ms o menos cada dieciocho meses. Esta
afirmacin, que en principio estaba destinada
a los dispositivos de memoria, pero tambin
los microprocesadores han cumplido la ley.
Una ley que significa para el usuario que cada dieciocho meses, de forma
continua, pueda disfrutar de una tecnologa mejor, algo que se ha venido
cumpliendo durante los ltimos 30 aos, y de lo que se espera siga vigente en
los prximos quince o veinte aos. De modo que el usuario puede disponer de
mejores equipos, aunque tambin significa la necesidad de cambiar de equipo
cada poco tiempo, algo que no todo el mundo se puede permitir. Y eso que el
precio aumenta de forma absoluta pero no relativa, puesto que la relacin
MPS/dinero est decreciendo a velocidad vertiginosa. Algo que sin embargo
no sucede con la industria del automvil por ejemplo, ya que la potencia de los
coches no se ha multiplicado de la misma forma que los precios. En cualquier
caso, queda claro que en los prximos aos nos espera una autntica
revolucin en lo que a rendimiento de los procesadores se refiere, como ya
predijera Moore hace ms de treinta aos.
M"cro(roce!aore! *+*.1**B #*.B %*.B /*. 7 $ent"0m.
#.1. - CARACTERCSTICAS DENERALES.
Los microprocesadores ntel *+*. y *+** se desarrollan a partir de un
procesador anterior, el *+*+, que, en sus diversas encarnaciones -incluyendo el
Zilog ,-*+- ha sido la CPU de 8 bits de mayor xito.
Poseen una arquitectura interna de 16 bits y pueden trabajar con operandos
de 8 y 16 bits; una capacidad de direccionamiento de 20 bits (hasta 1 Mb) y
comparten el mismo juego de instrucciones.
La filosofa de diseo de la familia del 8086 se basa en la compatibilidad y la
creacin de sistemas informticos integrados, por lo que disponen de diversos
coprocesadores como el 8089 de E/S y el 8087, coprocesador matemtico de
coma flotante. De acuerdo a esta filosofa y para permitir la compatibilidad con
los anteriores sistemas de 8 bits, el 8088 se dise con un bus de datos de 8
bits, lo cual le hace ms lento que su hermano el 8086, pues ste es capaz de
cargar una palabra ubicada en una direccin par en un solo ciclo de memoria
mientras el 8088 debe realizar dos ciclos leyendo cada vez un byte.
Disponen de 92 tipos de instrucciones, que pueden ejecutar con hasta 7
modos de direccionamiento. Tienen una capacidad de direccionamiento en
puertos de entrada y salida de hasta 64K (65536 puertos), por lo que las
mquinas construidas entorno a estos microprocesadores no suelen emplear la
entrada/salida por mapa de memoria, como veremos.
Entre esas instrucciones, las ms rpidas se ejecutan en 2 ciclos tericos de
reloj y unos 9 reales (se trata del movimiento de datos entre registros internos)
y las ms lentas en 206 (divisin entera con signo del acumulador por una
palabra extrada de la memoria). Las frecuencias internas de reloj tpicas son
4.77 MHz en la versin 8086; 8 MHz en la versin 8086-2 y 10 MHz en la 8086-
1. Recurdese que un MHz son un milln de ciclos de reloj, por lo que un PC
est"ndar a 4,77 MHz puede ejecutar de 20.000 a unos 0,5 millones de
instrucciones por segundo, segn la complejidad de las mismas (un 486 a 50
MHz, incluso sin memoria cach externa es capaz de ejecutar entre 1,8 y 30
millones de estas instrucciones por segundo).
El microprocesador ntel *+#*. se caracteriza por poseer dos modos de
funcionamiento completamente diferenciados: el moo real en el que se
encuentra nada ms ser conectado a la corriente y el moo (rote4"o en el
que adquiere capacidad de proceso multitarea y almacenamiento en memoria
virtual. El proceso multitarea consiste en realizar varios procesos de manera
aparentemente simultnea, con la ayuda del sistema operativo para conmutar
automticamente de uno a otro optimizando el uso de la CPU, ya que mientras
un proceso est esperando a que un perifrico complete una operacin, se
puede atender otro proceso diferente. La memoria virtual permite al ordenador
usar ms memoria de la que realmente tiene, almacenando parte de ella en
disco: de esta manera, los programas creen tener a su disposicin ms
memoria de la que realmente existe; cuando acceden a una parte de la
memoria lgica que no existe fsicamente, se produce una interrupcin y el
sistema operativo se encarga de acceder al disco y traerla.
Cuando la CPU est en modo protegido, los programas de usuario tienen un
acceso limitado al juego de instrucciones; slo el proceso supervisor
-normalmente el sistema operativo- est capacitado para realizar ciertas tareas.
Esto es as para evitar que los programas de usuario puedan campar a sus
anchas y entrar en conflictos unos con otros, en materia de recursos como
memoria o perifricos. Adems, de esta manera, aunque un error software
provoque el cuelgue de un proceso, los dems pueden seguir funcionando
normalmente, y el sistema operativo podra abortar el proceso col!ado. Por
desgracia, con el DOS el 286 no est en modo protegido y el cuelgue de un
solo proceso -bien el programa principal o una rutina operada por
interrupciones- significa la cada inmediata de todo el sistema.
El 8086 no posee ningn mecanismo para apoyar la multitarea ni la
memoria virtual desde el procesador, por lo que es difcil disear un sistema
multitarea para el mismo y casi imposible conseguir que sea realmente
operativo. Obviamente, el 286 en modo protegido pierde absolutamente toda la
compatibilidad con los procesadores anteriores. Por ello, en este libro slo
trataremos el modo real, nico disponible bajo DOS, aunque veremos alguna
instruccin extra que tambin se puede emplear en modo real.
Las caractersticas generales del 286 son: tiene un bus de datos de 16 bits,
un bus de direcciones de 24 bits (16 Mb); posee 25 instrucciones ms que el
8086 y admite 8 modos de direccionamiento. En modo virtual permite
direccionar hasta 1 Gigabyte. Las frecuencias de trabajo tpicas son de 12 y 16
MHz, aunque existen versiones a 20 y 25 MHz. Aqu, la instruccin ms lenta
es la misma que en el caso del 8086, solo que emplea 29 ciclos de reloj en
lugar de 206. Un 286 de categora media (16 MHz) podra ejecutar ms de
medio milln de instrucciones de estas en un segundo, casi 15 veces ms que
un 8086 medio a 8 MHz. Sin embargo, transfiriendo datos entre registros la
diferencia de un procesador a otro se reduce notablemente, aunque el 286 es
ms rpido y no slo gracias a los MHz adicionales.
Versiones mejoradas de los ntel 8086 y 8088 se encuentran tambin en los
procesadores NEC-V%+ y NEC-V#+ respectivamente. Ambos son compatibles
Hardware y Software, con la ventaja de que el procesado de instrucciones est
optimizado, llegando a superar casi en tres veces la velocidad de los originales
en algunas instrucciones aritmticas. Tambin poseen una cola de
prebsqueda mayor (cuando el microprocesador est ejecutando una
instruccin, si no hace uso de los buses externos, carga en una cola #I#$ de
unos pocos bytes las posiciones posteriores a la que est procesando, de esta
forma una vez que concluye la instruccin en curso ya tiene internamente la
que le sigue). Adems, los NEC V20 y V30 disponen de las mismas
instrucciones adicionales del 286 en modo real, al igual que el *+1*. y el
*+1**.
Por su parte, el %*. dispone de una arquitectura de registros de 32 bits, con
un bus de direcciones tambin de 32 bits (direcciona hasta 4 Gigabytes = 4096
Mb) y ms modos posibles de funcionamiento: el modo real (compatible 8086),
el modo protegido (relativamente compatible con el del 286), un modo
protegido propio que permite -por fin!- romper la barrera de los tradicionales
segmentos y el modo virtual 86, en el que puede emular el funcionamiento
simultneo de varios 8086. Una vez ms, todos los modos son incompatibles
entre s y requieren de un sistema operativo especfico: si se puede perdonar al
fabricante la prdida de compatibilidad del modo avanzados del 286 frente al
8086, debido a la lgica evolucin tecnolgica, no se puede decir lo mismo del
386 respecto al 286: no hubiera sido necesario aadir un nuevo modo
protegido si hubiera sido mejor construido el del 286 apenas un par de aos
atrs. Normalmente, los 386 suelen operar en modo real (debido al DOS) por lo
que no se aprovechan las posibilidades multitarea ni de gestin de memoria.
Por otra parte, aunque se pueden emplear los registros de 32 bits en modo
real, ello no suele hacerse -para mantener la compatibilidad con procesadores
anteriores- con lo que de entrada se est tirando a la basura un 50% de la
capacidad de proceso del chip, aunque por fortuna estos procesadores suelen
trabajar a frecuencias de 16/20 MHz (obsoletas) y normalmente de 33 y hasta
40 MHz.
El %*.!E es una variante del 386 a nivel de hardware, aunque es compatible
en software. Bsicamente, es un 386 con un bus de datos de slo 16 bits -ms
lento, al tener que dar dos pasadas para un dato de 32 bits-. De hecho, podra
haber sido diseado perfectamente para mantener una compatibilidad
hardware con el 286, aunque el fabricante lo evit probablemente por razones
comerciales.
El /*. se diferencia del 386 en la integracin en un solo chip del
coprocesador 387. Tambin se ha mejorado la velocidad de operacin: la
versin de 25 MHz dobla en trminos reales a un 386 a 25 MHz equipado con
el mismo tamao de memoria cach. La versin /*.!E no se diferencia en el
tamao del bus, tambin de 32 bits, sino en la ausencia del 387 (que puede ser
aadido externamente). Tambin existen versiones de 486 con buses de 16
bits, el primer fabricante de estos chips, denominados 486SLC, ha sido Cyrix.
Una tendencia iniciada por el 486 fue la de duplicar la velocidad del reloj interno
(pongamos por caso de 33 a 66 MHz) aunque en las comunicaciones con los
buses exteriores se respeten los 33 MHz. Ello agiliza la ejecucin de las
instrucciones ms largas: bajo DOS, el rendimiento general del sistema se
puede considerar prcticamente el doble. Son los chips DX2 (tambin hay una
variante a 50 MHz: 25 x 2). La culminacin de esta tecnologa viene de la mano
de los DX4 a 75/100 MHz (25/33 x 3).
El $ent"0m, ltimo procesador de ntel en el momento de escribirse estas
lneas, se diferencia respecto al 486 en el bus de datos (ahora de 64 bits, lo
que agiliza los accesos a memoria) y en un elevadsimo nivel de optimizacin y
segmentacin que le permite, empleando compiladores optimizados,
simultanear en muchos casos la ejecucin de dos instrucciones consecutivas.
Posee dos cachs internas, tiene capacidad para predecir el destino de los
saltos y la unidad de coma flotante experimenta elevadas mejoras. Sin
embargo, bajo DOS, un Pentium bsico slo es unas 2 veces ms rpido que
un 486 a la misma frecuencia de reloj. Comenz en 60/90 MHz hasta los
166/200/233 MHz de las ltimas versiones (Pentium Pro y MMX), que junto a
diversos clones de otros fabricantes, mejoran an ms el rendimiento. Todos
los equipos Pentium emplean las tcnicas DX, ya que las placas base tpicas
corren a 60 MHz. Para hacerse una idea, por unas 200000 pts de 1997 un
equipo Pentium MMX a 233 MHz es cerca de 2000 veces ms rpido en
aritmtica entera que el BM PC original de inicios de la dcada de los 80; en
coma flotante la diferencia aumenta incluso algunos rdenes ms de magnitud.
Y a una fraccin del coste (un milln de pts de aquel entonces que equivale a
unos 2,5 millones de hoy en da). Aunque no hay que olvidar la revolucin del
resto de los componentes: 100 veces ms memoria (central y de vdeo), 200
veces ms grande el disco duro... y que un disco duro moderno trans%iere datos
10 veces ms deprisa que la memoria de aquel BM PC original. Por desgracia,
el software no ha mejorado el rendimiento, ni remotamente, en esa proporcin:
es la factura pasada por las tcnicas de programacin cada vez a un nivel ms
alto (aunque nadie discute sus ventajas).
Una caracterstica de los microprocesadores a partir del 386 es la
disponibilidad de memorias cach de alta velocidad de acceso -muy pocos
nanosegundos- que almacenan una pequea porcin de la memoria principal.
Cuando la CPU accede a una posicin de memoria, cierta circuitera de control
se encarga de ir depositando el contenido de esa posicin y el de las
posiciones inmediatamente consecutivas en la memoria cach. Cuando sea
necesario acceder a la instruccin siguiente del programa, sta ya se encuentra
en la cach y el acceso es muy rpido. Lo ideal sera que toda la memoria del
equipo fuera cach, pero esto no es todava posible actualmente. Una cach de
tamao razonable puede doblar la velocidad efectiva de proceso de la CPU. El
8088 careca de memoria cach, pero s estaba equipado con una unidad de
lectura adelantada de instrucciones con una cola de prebsqueda de 4 bytes:
de esta manera, se agilizaba ya un tanto la velocidad de proceso al poder
ejecutar una instruccin al mismo tiempo que iba leyendo la siguiente.
#.#. - REDISTROS DEL *+*. ' DEL #*..
Estos procesadores disponen de 14 registros de 16 bits (el 286 alguno ms,
pero no se suele emplear bajo DOS). La misin de estos registros es
almacenar las posiciones de memoria que van a experimentar repetidas
manipulaciones, ya que los accesos a memoria son mucho ms lentos que los
accesos a los registros. Adems, hay ciertas operaciones que slo se pueden
realizar sobre los registros. No todos los registros sirven para almacenar datos,
algunos estn especializados en apuntar a las direcciones de memoria. La
mecnica bsica de funcionamiento de un programa consiste en cargar los
registros con datos de la memoria o de un puerto de E/S, procesar los datos y
devolver el resultado a la memoria o a otro puerto de E/S. Obviamente, si un
dato slo va a experimentar un cambio, es preferible realizar la operacin
directamente sobre la memoria, si ello es posible. A continuacin se describen
los registros del 8086.
AX SP CS P
BX BP DS flags
CX S SS
DX D ES
Registros
de datos
Registros
punteros
de pila e
ndices
Registros
de
segmento
Registro
puntero de
instrucciones y
flags
- Re4"!tro! e ato!F
AX, BX, CX, DX: pueden utilizarse bien como registros de 16 bits o como
dos registros separados de 8 bits (byte superior e inferior) cambiando la X por
H o L segn queramos referirnos a la parte alta o baja respectivamente. Por
ejemplo, AX se descompone en AH (parte alta) y AL (parte baja).
Evidentemente, cualquier cambio sobre AH o AL altera AX!: valga como
ejemplo que al incrementar AH se le estn aadiendo 256 unidades a AX.
AX = Acumulador.
Es el registro principal, es utilizado en las instrucciones de multiplicacin
y divisin y en algunas instrucciones aritmticas especializadas, as como en
ciertas operaciones de carcter especfico como entrada, salida y traduccin.
Obsrvese que el 8086 es suficientemente potente para realizar las
operaciones lgicas, la suma y la resta sobre cualquier registro de datos, no
necesariamente el acumulador.
BX = Base.
Se usa como registro base para referenciar direcciones de memoria con
direccionamiento indirecto, manteniendo la direccin de la base o comienzo de
tablas o matrices. De esta manera, no es preciso indicar una posicin de
memoria fija, sino la n&mero B' (as, haciendo avanzar de unidad en unidad a
BX, por ejemplo, se puede ir accediendo a un gran bloque de memoria en un
bucle).
CX = Contador.
Se utiliza comnmente como contador en bucles y operaciones
repetitivas de manejo de cadenas. En las instrucciones de desplazamiento y
rotacin se utiliza como contador de 8 bits.
DX = Datos.
Usado en conjuncin con AX en las operaciones de multiplicacin y
divisin que involucran o generan datos de 32 bits. En las de entrada y salida
se emplea para especificar la direccin del puerto E/S.
- Re4"!tro! e !e4mentoF
Definen reas de 64 Kb dentro del espacio de direcciones de 1 Mb del
8086. Estas reas pueden solaparse total o parcialmente. No es posible
acceder a una posicin de memoria no definida por algn segmento: si es
preciso, habr de moverse alguno.
CS = Registro de segmento de cdigo (code segment).
Contiene la direccin del segmento con las instrucciones del programa.
Los programas de ms de 64 Kb requieren cambiar CS peridicamente.
DS = Registro de segmento de datos (data segment).
Segmento del rea de datos del programa.
SS = Registro de segmento de pila (stack segment).
Segmento de pila.
ES = Registro de segmento extra (extra segment).
Segmento de ampliacin para zona de datos. Es extraordinariamente til
actuando en conjuncin con DS: con ambos se puede definir dos zonas de 64
Kb, tan alejadas como se desee en el espacio de direcciones, entre las que se
pueden intercambiar datos.
- Re4"!tro! (0ntero! e ("laF
SP = Puntero de pila (stack pointer).
Apunta a la cabeza de la pila. Utilizado en las instrucciones de manejo de
la pila.
BP = Puntero base (base pointer).
Es un puntero de base, que apunta a una zona dentro de la pila dedicada
al almacenamiento de datos (variables locales y parmetros de las funciones
en los programas compilados).
- Re4"!tro! Gn"ce!:
S = ndice fuente (source index).
Utilizado como registro de ndice en ciertos modos de direccionamiento
indirecto, tambin se emplea para guardar un valor de desplazamiento en
operaciones de cadenas.
D = ndice destino (destination index).
Se usa en determinados modos de direccionamiento indirecto y para
almacenar un desplazamiento en operaciones con cadenas.
- $0ntero e "n!tr0cc"one! o contador de programa:
P = Puntero de instruccin (instruction pointer).
Marca el desplazamiento de la instruccin en curso dentro del segmento
de cdigo. Es automticamente modificado con la lectura de una instruccin.
- Re4"!tro e e!tao o de indicadores (3la4!).
Es un registro de 16 bits de los cuales 9 son utilizados para indicar
diversas situaciones durante la ejecucin de un programa. Los bits 0, 2, 4, 6, 7
y 11 son indicadores de condicin, que reflejan los resultados de operaciones
del programa; los bits del 8 al 10 son indicadores de control y el resto no se
utilizan. Estos indicadores pueden ser comprobados por las instrucciones de
salto condicional, lo que permite variar el flujo secuencial del programa segn
el resultado de las operaciones.
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF F TF SF ZF AF PF CF
CF (Carry Flag): ndicador de acarreo. Su valor ms habitual es lo (ue
nos llevamos en una suma o resta.
OF (Overflow Flag): ndicador de desbordamiento. ndica que el
resultado de una operacin no cabe en el tamao del operando destino.
ZF (Zero Flag): ndicador de resultado 0 o comparacin igual.
SF (Sign Flag): ndicador de resultado o comparacin negativa.
PF (Parity Flag): ndicador de paridad. Se activa tras algunas
operaciones aritmtico-lgicas para indicar que el nmero de bits a uno
resultante es par.
AF (Auxiliary Flag): Para ajuste en operaciones BCD.
DF (Direction Flag): ndicador de direccin. Manipulando bloques de
memoria, indica el sentido de avance (ascendente/descendente).
F (nterrupt Flag): ndicador de interrupciones: puesto a 1 estn
permitidas.
TF (Trap Flag): ndicador de atrape (ejecucin paso a paso).
#.%. - REDISTROS DEL %*. ' $ROCESADORES SU$ERIORES.
Los 386 y superiores disponen de muchos ms registros de los que vamos a
ver ahora. Sin embargo, bajo el sistema operativo DOS slo se suelen emplear
los que veremos, que constituyen bsicamente una extensin a 32 bits de los
registros originales del 8086.
Se ampla el tamao de los registros de datos (que pueden ser accedidos
en fragmentos de 8, 16 32 bits) y se aaden dos nuevos registros de
segmento multipropsito (FS y GS). Algunos de los registros aqu mostrados
son realmente de 32 bits (como EP en vez de P), pero bajo sistema operativo
DOS no pueden ser empleados de manera directa, por lo que no les
consideraremos.
#./. - MODOS DE DIRECCIONAMIENTO.
Son los distintos modos de acceder a los datos en memoria por parte del
procesador. Antes de ver los modos de direccionamiento, echaremos un vistazo
a la sintaxis general de las instrucciones, ya que pondremos alguna en los
ejemplos:
NSTRUCCN DESTNO, FUENTE
Donde destino indica dnde se deja el resultado de la operacin en la que
pueden participar (segn casos) FUENTE e incluso el propio DESTNO. Hay
instrucciones, sin embargo, que slo tienen un operando, como la siguiente, e
incluso ninguno:
NSTRUCCN DESTNO
Como ejemplos, aunque no hemos visto an las instrucciones utilizaremos
un par de ellas: la de copia o movimiento de datos (MOV) y la de suma (ADD).
#./.1. - ORGANZACN DE DRECCONES: SEGMENTACN.
Como ya sabemos, los microprocesadores 8086 y compatibles poseen
registros de un tamao mximo de 16 bits que direccionaran hasta 64K; en
cambio, la direccin se compone de 20 bits con capacidad para 1Mb, hay por
tanto que recurrir a algn artificio para direccionar toda la memoria. Dicho
artificio consiste en la se!mentacin: se trata de dividir la memoria en grupos
de 64K. Cada grupo se asocia con un registro de segmento; el desplazamiento
(o%%set) dentro de ese segmento lo proporciona otro registro de 16 bits. La
direccin absoluta se calcula multiplicando por 16 el valor del registro de
segmento y sumando el offset, obtenindose una direccin efectiva de 20 bits.
Esto equivale a concebir el mecanismo de generacin de la direccin absoluta,
como si se tratase de que los registros de segmento tuvieran 4 bits a 0
(imaginarios) a la derecha antes de sumarles el desplazamiento:
direccin = segmento * 16 + offset
En la prctica, una direccin se indica con la notacin
SEGMENTO:OFFSET; adems, una misma direccin puede expresarse de
ms de una manera: por ejemplo, 3D00h:0300h es equivalente a 3D30:0000h.
Es importante resaltar que no se puede acceder a ms de 64 Kb en un
segmento de datos. Por ello, en los procesadores 386 y superiores no se
deben emplear registros de 32 bit para generar direcciones (bajo DOS), aunque
para los clculos pueden ser interesantes (no obstante, s sera posible
configurar estos procesadores para poder direccionar ms memoria bajo DOS
con los registros de 32 bits, aunque no resulta por lo general prctico).
#./.% - MODOS DE DRECCONAMENTO.
- Direccionamiento inmediato: El operando es una constante situada detrs
del cdigo de la instruccin. Sin embargo, como registro destino no se puede
indicar uno de segmento (habr que utilizar uno de datos como paso
intermedio).
ADD AX,0fffh
El nmero hexadecimal 0fffh es la constante numrica que en el
direccionamiento inmediato se le sumar al registro AX. Al trabajar con
ensambladores, se pueden definir smbolos con!tante! (ojo, no variables) y es
ms intuitivo:
dato EQU 0fffh ; smbolo constante
MOV AX,dato
Si se referencia a la direccin de memoria de una variable de la siguiente
forma, tambin se trata de un caso de direccionamiento inmediato:
dato DW 0fffh ; ahora es una variable
MO AX,OFFSET dato ; AX = "direccin de memoria" de dato
Porque hay que tener en cuenta que cuando traduzcamos a nmeros el
smbolo podra quedar:
17F3:0A11 DW FFF
MOV AX,0A11
- Direccionamiento de registro: Los operandos, necesariamente de igual
tamao, estn contenidos en los registros indicados en la instruccin:
MOV DX,AX
MOV AH,AL
- Direccionamiento directo o absoluto: El operando est situado en la
direccin indicada en la instruccin, relativa al segmento que se trate:
MOV AX,[57D1h]
MOV AX,ES:[429Ch]
Esta sintaxis (quitando la 'h' de hexadecimal) sera la que admite el
programa DEBUG (realmente habra que poner, en el segundo caso, ES: en
una lnea y el MOV en otra). Al trabajar con ensambladores, las 2ar"a8le! en
memoria se pueden referenciar con etiquetas simblicas:
MOV AX,dato
MOV AX,ES:dato
dato DW 1234h ; variable del programa
En el primer ejemplo se transfiere a AX el valor contenido en la
direccin apuntada por la etiqueta dato sobre el segmento de datos (DS) que
se asume por defecto; en el segundo ejemplo se indica de forma explcita el
segmento tratndose del segmento ES. La direccin efectiva se calcula de la
forma ya vista con anterioridad: Registro de
segmento * 16 + desplazamiento_de_dato (este desplazamiento depende de la
posicin al ensamblar el programa).
- Direccionamiento indirecto: El operando se encuentra en una direccin
sealada por un registro de segmento*16 ms un registro base (BX/BP) o
ndice (S/D). (Nota: BP acta por defecto con SS).
MOV AX,[BP] ; AX = [SS*16+BP]
MOV ES:[D],AX ; [ES*16+D] = AX
- ndirecto con ndice o indexado: El operando se encuentra en una
direccin determinada por la suma de un registro de segmento*16, un registro
de ndice, S o D y un desplazamiento de 8 16 bits. Ejemplos:
MOV AX,[D+DESP] MOV AX,desp[D]
ADD [S+DESP],BX ADD desp[S],BX
- ndirecto con base e ndice o indexado a base: El operando se encuentra
en una direccin especificada por la suma de un registro de segmento*16, uno
de base, uno de ndice y opcionalmente un desplazamiento de 8 16 bits:
MOV AX,ES:[BX+D+DESP] MOV AX,ES:desp[BX][D]
MOV CS:[BX+S+DESP],CX MOV CS:desp[BX][S],CX
Com8"nac"one! e re4"!tro! e !e4mento 7 e!(la6am"ento.
Como se ve en los modos de direccionamiento, hay casos en los que se
indica explcitamente el registro de segmento a usar para acceder a los datos.
Existen unos segmentos asociados por defecto a los registros de
desplazamiento (P, SP, BP, BX, D, S); slo es necesario declarar el segmento
cuando no coincide con el asignado por defecto. En ese caso, el ensamblador
genera un byte adicional (a modo de prefijo) para indicar cul es el segmento
referenciado. La siguiente tabla relaciona las posibles combinaciones de los
registros de segmento y los de desplazamiento:
CS SS DS ES
P S No No No
SP No S No No
BP con prefijo por defecto con prefijo con prefijo
BX con prefijo con prefijo por defecto con prefijo
S con prefijo con prefijo por defecto con prefijo
D con prefijo con prefijo por defecto con prefijo(1)
(1) Tambin por defecto en el manejo de cadenas.
Los 386 y superiores admiten otros modos de direccionamiento ms
sofisticados, que se vern en el prximo captulo, despus de conocer todas
las instrucciones del 8086. Por ahora, con todos estos modos se puede
considerar que hay ms que suficiente. De hecho, algunos se utilizan en muy
contadas ocasiones.
#.9. - LA $ILA.
La pila es un bloque de memoria de estructura LI>O (Last nput First Output:
ltimo en entrar, primero en salir) que se direcciona mediante desplazamientos
desde el registro SS (segmento de pila). Las posiciones individuales dentro de
la pila se calculan sumando al contenido del segmento de pila SS un
desplazamiento contenido en el registro puntero de pila SP. Todos los datos
que se almacenan en la pila son de longitud palabra, y cada vez que se
introduce algo en ella por medio de las instrucciones de manejo de pila (PUSH
y POP), el puntero se decrementa en dos; es decir, la pila avanza hacia
direcciones decrecientes. El registro BP suele utilizarse normalmente para
apuntar a una cierta posicin de la pila y acceder indexadamente a sus
elementos -generalmente en el caso de variables- sin necesidad de
desapilarlos para consultarlos.
La pila es utilizada frecuentemente al principio de una subrutina para
preservar los registros que no se desean modificar; al final de la subrutina
basta con recuperarlos en orden inverso al que fueron depositados. En estas
operaciones conviene tener cuidado, ya que la pila en los 8086 es comn al
procesador y al usuario, por lo que se almacenan en ella tambin las
direcciones de retorno de las subrutinas. Esta ltima es, de hecho, la ms
importante de sus funciones. La estructura de pila permite que unas subrutinas
llamen a otras que a su vez pueden llamar a otras y as sucesivamente: en la
pila se almacenan las direcciones de retorno, que sern las de la siguiente
instruccin que provoc la llamada a la subrutina. As, al retornar de la
subrutina se extrae de la pila la direccin a donde volver. Los compiladores de
los lenguajes de alto nivel la emplean tambin para pasar los parmetros de los
procedimientos y para generar en ella las variables autom"ticas -variables
locales que existen durante la ejecucin del subprograma y se destruyen
inmediatamente despus-. Por ello, una norma bsica es que se debe desapilar
siempre todo lo apilado para evitar una prdida de control inmediata del
ordenador.
Ejemplo de operacin sobre la pila (todos los datos son arbitrarios):
#... - UN $RODRAMA DE E;EM$LO.
Aunque las instrucciones del procesador no sern vistas hasta el prximo
captulo, con objeto de ayudar a la imaginacin del lector elaboraremos un
primer programa de ejemplo en lenguaje ensamblador. La utilidad de este
programa es dejar patente que lo nico que entiende el 8086 son nmeros,
aunque nosotros nos referiremos a ellos con unos smbolos que faciliten
entenderlos. Tambin es interesante este ejemplo para afianzar el concepto de
registro de segmento.
En este programa slo vamos a emplear las instrucciones MOV, ya
conocida, y alguna otra ms como la instruccin NC (incrementar), DEC
(disminuir una unidad) y JNZ (saltar si el resultado no es cero). Suponemos que
el programa est ubicado a partir de la direccin de memoria 14D3:7A10
(arbitrariamente elegida) y que lo que pretendemos hacer con l es limpiar la
pantalla. Como el ordenador es un PC con monitor en color, la pantalla de texto
comienza en B800:0000 (no es ms que una zona de memoria). Por cada
carcter que hay en dicha pantalla, comenzando arriba a la izquierda, a partir
de la direccin B800:0000 tenemos dos bytes: el primero, con el cdigo ASC
del carcter y el segundo con el color. Lo que vamos a hacer es rellenar los
2000 caracteres (80 columnas x 25 lneas) con espacios en blanco (cdigo
ASC 32, 20h en hexadecimal), sin modificar el color que hubiera antes. Esto
es, se trata de poner el valor 32 en la direccin B800:0000, la B800:0002, la
B800:0004... y as sucesivamente.
El programa quedara en memoria de esta manera: La primera columna
indica la direccin de memoria donde est el programa que se ejecuta
(CS=14D3h e P=7A10h al principio). La segunda columna constituye el cdigo
mquina que interpreta el 8086. Algunas instrucciones ocupan un byte de
memoria, otras dos tres (las hay de ms). La tercera columna contiene el
nombre de las instrucciones, algo mucho ms legible para los humanos que los
nmeros:
14D3:7A10 B9 D0 07 MOV CX,7D0H ; CX = 7D0h (2000 decimal = 7D0 hexadecimal)
14D3:7A13 B8 00 B8 MOV AX,0B800h ; segmento de la memoria de pantalla
14D3:7A16 8E D8 MOV DS,AX ; apuntar segmento de datos a la misma
14D3:7A18 BB 00 00 MOV BX,0 ; apuntar al primer carcter ASC de la pantalla
14D3:7A1B C6 07 20 MOV BYTE PTR [BX],32 ; se pone BYTE PTR para indicar que 32 es
de 8 bits
14D3:7A1E 43 NC BX ; BX=BX+1 -< apuntar al byte de color
14D3:7A1F 43 NC BX ; BX=BX+1 -< apuntar al siguiente carcter ASC
14D3:7A20 49 DEC CX ; CX=CX-1 -< queda un carcter menos
14D3:7A21 75 F8 JNZ -8 ; si CX no es 0, saltar 8 bytes atrs (a 14D3:7A1B)
Como se puede ver, la segunda instruccin (bytes de cdigo mquina 0B8h, 0 y 0B8h
colocados en posiciones consecutivas) est colocada a partir del desplazamiento 7A13h, ya
que la anterior que ocupaba 3 bytes comenzaba en 7A10h. En el ejemplo cargamos el valor
0B800h en DS apoyndonos en AX como intermediario. El motivo es que los registros de
segmento no admiten el direccionamiento inmediato. A medida que se van haciendo
programas, el ensamblador da mensajes de error cuando se encuentra con estos fallos y
permite ir aprendiendo con facilidad las normas, que tampoco son demasiadas. La instruccin
M$V B)*E *R +B',-./ equivale a decir: 0poner en la direccin de memoria apuntada por B'
(DS:[BX] para ser ms exactos) el b1te de valor ./2. El valor 0F8h del cdigo mquina de la
ltima instruccin es el complemento a dos (nmero negativo) del valor 8.
Normalmente, casi nunca habr que ensamblar a mano consultando unas tablas, como
hemos hecho en este ejemplo. Sin embargo, la mejor manera de aprender ensamblador es no
olvidando la estrecha relacin de cada lnea de programa con la CPU y la memoria.
;UEDO DE INSTRUCCIONES *+E*.
%.1. - DESCRI$CIHN COM$LETA DE LAS INSTRUCCIONES.
Nota: en el efecto de las instrucciones sobre el registro de estado se
utilizar la siguiente notacin:
- bit no modificado
? desconocido o indefinido
x modificado segn el resultado de la operacin
1 puesto siempre a 1
0 puesto siempre a 0
3.1.1. - NSTRUCCONES DE CARGA DE REGSTROS Y DRECCONES.

MOV (transferencia)
Sintaxis: MOV dest, origen.
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
Transfiere datos de longitud byte o palabra del operando origen al
operando destino. Pueden ser operando origen y operando destino cualquier
registro o posicin de memoria direccionada de las formas ya vistas, con la
nica condicin de que origen y destino tengan la misma dimensin. Existen
ciertas limitaciones, como que los registros de segmento no admiten el
direccionamiento inmediato: es incorrecto MOV DS,4000h; pero no lo es por
ejemplo MOV DS,AX o MOV DS,VARABLE. No es posible, as mismo, utilizar
CS como destino (es incorrecto hacer MOV CS,AX aunque pueda admitirlo
algn ensamblador). Al hacer MOV hacia un registro de segmento, las
interrupciones quedan inhibidas hasta e!(0=! de ejecutarse la siguiente
instruccin (8086/88 de 1983 y procesadores posteriores).
Ejemplos: mov ds,ax
mov bx,es:[si]
mov si,offset dato
En el ltimo ejemplo, no se coloca en S el valor de la variable dato
sino su direccin de memoria o desplazamiento respecto al segmento de datos.
En otras palabras, S es un puntero a dato pero no es dato. En el prximo
captulo se ver cmo se declaran las variables.

XCHG (intercambiar)
Sintaxis: XCHG destino, origen
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
ntercambia el contenido de los operandos origen y destino. No
pueden utilizarse registros de segmentos como operandos.
Ejemplo: xchg bl,ch
xchg mem_pal,bx

XLAT (traduccin)
Sintaxis: XLAT tabla
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
Se utiliza para traducir un byte del registro AL a un byte tomado de la
tabla de traduccin. Los datos se toman desde una direccin de la tabla
correspondiente a BX + AL, donde bx es un puntero a el comienzo de la tabla y
AL es un ndice. ndicar tabla al lado de xlat es slo una redundancia opcional.
Ejemplo: mov bx,offset tabla
mov al,4
xlat

LEA (carga direccin efectiva)
Sintaxis: LEA destino, origen
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
Transfiere el desplazamiento del operando fuente al operando destino.
Otras instrucciones pueden a continuacin utilizar el registro como
desplazamiento para acceder a los datos que constituyen el objetivo. El
operando destino no puede ser un registro de segmento. En general, esta
instruccin es equivalente a M$V destino-$##SE* %uente y de hecho los
buenos ensambladores (TASM) la codifican como MOV para economizar un
byte de memoria. Sin embargo, LEA es en algunos casos ms potente que
MOV al permitir indicar registros de ndice y desplazamiento para calcular el
offset:
lea dx,datos[si]
En el ejemplo de arriba, el valor depositado en DX es el offset de la
etiqueta datos ms el registro S. Esa sola instruccin es equivalente a estas
dos:
mov dx,offset datos
add dx,si

LDS (carga un puntero utilizando DS)
Sintaxis: LDS destino, origen
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
Traslada un puntero de 32 bits (direccin completa de memoria
compuesta por
segmento y desplazamiento), al destino indicado y a DS. A partir de la direccin
indicada por el operando origen, el procesador toma 4 bytes de la memoria:
con los dos primeros forma una palabra que deposita en destino y, con los
otros dos, otra en DS.
Ejemplo: punt dd 12345678h
lds si,punt
Como resultado de esta instruccin, en DS:S se hace referencia a la
posicin de memoria 1234h:5678h; 'dd' sirve para definir una variable larga de
4 bytes (denominada punt en el ejemplo) y ser explicado en el captulo
siguiente.

LES (carga un puntero utilizando ES)
Sintaxis: LES destino, origen
Esta instruccin es anloga a LDS, pero utilizando ES en lugar de DS.

LAHF (carga AH con los indicadores)
Sintaxis: LAHF
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
Carga los bits 7, 6, 4, 2 y 0 del registro AH con el contenido de los
indicadores SF, ZF, AF, PF Y CF respectivamente. El contenido de los dems
bits queda sin definir.

SAHF (copia AH en los indicadores)
Sintaxis: SAHF
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - x x x x x
Transfiere el contenido de los bits 7, 6, 4, 2 y 0 a los indicadores SF,
ZF, AF, PF y CF respectivamente.
3.1.2. - NSTRUCCONES DE MANPULACN DEL REGSTRO DE ESTADO.

CLC (baja el indicador de acarreo)
Sintaxis: CLC
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - 0
Borra el indicador de acarreo (CF) sin afectar a ninguno otro.

CLD (baja el indicador de direccin)
Sintaxis: CLD
ndicadores: OF DF F TF SF ZF AF PF CF
- 0 - - - - - - -
Pone a 0 el indicador de direccin DF, por lo que los registros S y/o
D se autoincrementan en las operaciones de cadenas, sin afectar al resto de
los indicadores. Es NECESARO colocarlo antes de las instrucciones de
manejo de cadenas si no se conoce con seguridad el valor de DF. Vase STD.

CL (baja indicador de interrupcin)
Sintaxis: CL
ndicadores: OF DF F TF SF ZF AF PF CF
- - 0 - - - - - -
Borra el indicador de activacin de interrupciones F, lo que desactiva
las interrupciones enmascarables. Es muy conveniente hacer esto antes de
modificar la pareja SS:SP en los 8086/88 anteriores a 1983 (vase comentario
en la instruccin MOV), o antes de cambiar un vector de interrupcin sin el
apoyo del DOS. Generalmente las interrupciones slo se inhiben por breves
instantes en momentos crticos. Vase tambin ST.

CMC (complementa el indicador de acarreo)
Sintaxis: CMC
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - x
Complementa el indicador de acarreo CF invirtiendo su estado.

STC (pone a uno el indicador de acarreo)
Sintaxis: STC
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - 1
Pone a 1 el indicador de acarreo CF sin afectar a ningn otro
indicador.

STD (pone a uno el indicador de direccin)
Sintaxis: STD
ndicadores: OF DF F TF SF ZF AF PF CF
- 1 - - - - - - -
Pone a 1 el indicador de direccin DF, por lo que los registros S y/o
D se autodecrementan en las operaciones de cadenas, sin afectar al resto de
los indicadores. Es NECESARO colocarlo antes de las instrucciones de
manejo de cadenas si no se conoce con seguridad el estado de DF. Vase
tambin CLD.

ST (pone a uno el indicador de interrupcin)
Sintaxis: ST
ndicadores: OF DF F TF SF ZF AF PF CF
- - 1 - - - - - -
Pone a 1 la bandera de desactivacin de interrupciones F y activa las
interrupciones enmascarables. Una interrupcin pendiente no es reconocida,
sin embargo, hasta despus de ejecutar la instruccin que sigue a ST. Vase
tambin CL.
3.1.3. - NSTRUCCONES DE MANEJO DE LA PLA.

POP (extraer de la pila)
Sintaxis: POP destino
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
Transfiere el elemento palabra que se encuentra en lo alto de la pila
(apuntado por SP) al operando destino que a de ser tipo palabra, e incrementa
en dos el registro SP. La instruccin POP CS, poco til, no funciona
correctamente en los 286 y superiores.
Ejemplos: pop ax
pop pepe

PUSH (introduce en la pila)
Sintaxis: PUSH origen
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
Decrementa el puntero de pila (SP) en 2 y luego transfiere la palabra
especificada en el operando origen a la cima de la pila. El registro CS aqu s
se puede especificar como origen, al contrario de lo que afirman algunas
publicaciones.
Ejemplo: push cs

POPF (extrae los indicadores de la pila)
Sintaxis: POPF
ndicadores: OF DF F TF SF ZF AF PF CF
x x x x x x x x x
Traslada al registro de los indicadores la palabra almacenada en la
cima de la pila; a continuacin el puntero de pila SP se incrementa en dos.

PUSHF (introduce los indicadores en la pila)
Sintaxis: PUSHF
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
Decrementa en dos el puntero de pila y traslada a la cima de la pila el
contenido de los indicadores.
3.1.3. - NSTRUCCONES DE TRANSFERENCA DE CONTROL.
Incon"c"onal

CALL (llamada a subrutina)
Sintaxis: CALL destino
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
Transfiere el control del programa a un procedimiento, salvando
previamente en la pila la direccin de la instruccin siguiente, para poder volver
a ella una vez ejecutado el procedimiento. El procedimiento puede estar en el
mismo segmento (tipo NEAR) o en otro segmento (tipo FAR). A su vez la
llamada puede ser directa a una etiqueta (especificando el tipo de llamada
NEAR -por defecto- o FAR) o indirecta, indicando la direccin donde se
encuentra el puntero. Segn la llamada sea cercana o lejana, se almacena en
la pila una direccin de retorno de 16 bits o dos palabras de 16 bits indicando
en este ltimo caso tanto el offset (P) como el segmento (CS) a donde volver.
Ejemplos: call proc1
dir dd 0f000e987h
call dword ptr dir
En el segundo ejemplo, la variable dir almacena la direccin a donde
saltar. De esta ltima manera -conociendo su direccin- puede llamarse
tambin a un vector de interrupcin, guardando previamente los flags en la pila
(PUSHF), porque la rutina de interrupcin retornar (con RET en vez de con
RETF) sacndolos.

JMP (salto)
Sintaxis: JMP direccin o JMP SHORT direccin
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
Transfiere el control incondicionalmente a la direccin indicada en el
operando. La bifurcacin puede ser tambin directa o indirecta como
anteriormente vimos, pero adems puede ser corta (tipo SHORT) con un
desplazamiento comprendido entre -128 y 127; o larga, con un desplazamiento
de dos bytes con signo. Si se hace un JMP SHORT y no llega el salto (porque
est demasiado alejada esa etiqueta) el ensamblador dar error. Los buenos
ensambladores (como TASM) 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. Si el salto de dos bytes, que permite
desplazamientos de 64 Kb en la memoria sigue siendo insuficiente, se puede
indicar con %ar que es largo (salto a otro segmento).
Ejemplos: jmp etiqueta
jmp far ptr etiqueta

RET / RETF (retorno de subrutina)
Sintaxis: RET [valor] o RETF [valor]
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
Retorna de un procedimiento extrayendo de la pila la direccin de la
siguiente direccin. Se extraer el registro de segmento y el desplazamiento en
un procedimiento de tipo FAR (dos palabras) y solo el desplazamiento en un
procedimiento NEAR (una palabra). si esta instruccin es colocada dentro de
un bloque PROC-ENDP (como se ver en el siguiente captulo) el ensamblador
sabe el tipo de retorno que debe hacer, segn el procedimiento sea NEAR o
FAR. En cualquier caso, se puede forzar que el retorno sea de tipo FAR con la
instruccin RETF. Valor, si es indicado permite sumar una cantidad valor en
bytes a SP antes de retornar, lo que es frecuente en el cdigo generado por los
compiladores para retornar de una funcin con parmetros. Tambin se puede
retornar de una interrupcin con RETF 2, para que devuelva el registro de
estado sin restaurarlo de la pila.
Con"c"onal
Las siguientes instrucciones son de transferencia condicional de
control a la instruccin que se encuentra en la posicin P+desplazamiento
(desplazamiento comprendido entre -128 y +127) si se cumple la condicin.
Algunas condiciones se pueden denotar de varias maneras. Todos los saltos
son cortos y si no alcan3a hay que aparselas como sea. En ne4r"ta se
realzan las condiciones ms empleadas. Donde interviene SF se consideran
con signo los operandos implicados en la ltima comparacin u operacin
aritmetico-lgica, y se indican en la tabla como '' (-128 a +127 -32768 a
+32767); en los dems casos, indicados como '+', se consideran sin signo (0 a
255 0 a 65535):
;A1;N&E
Salto !" ma7or Ia8o2eJB !" no menor o "40al Inot 8elow or e<0alJB !" C>K+
7 ,>K+.
+
;AE1;N&
Salto !" ma7or o "40al Ia8o2e or e<0alJB !" no menor Inot 8elowJB !"
C>K+.
+
;&1;NAE1;C
Salto !" menor I8elowJB !" no !0(er"or n" "40al Inot a8o2e or e<0alJB !"
acarreoB !" C>K1.
+
;&E1;NA
Salto !" menor o "40al Inot 8elow or e<0alJB !" no ma7or Inot a8o2eJB !"
C>K1 ) ,>K1.
+
;C-, Salto !" C-K+.
;E1;, Salto !" "40al Ie<0alJB !" cero I6eroJB !" ,>K1.
JG/JNLE
Salto si mayor (greater), si no menor ni igual (not less or equal), si ZF=0 y
SF=0.

JGE/JNL Salto si mayor o igual (greater or equal), si no menor (not less), si SF=0.
JL/JNGE Salto si menor (less), si no mayor ni igual (not greater or equal), si SF<>OF.
JLE/JNG
Salto si menor o igual (less or equal), si no mayor (not greater), si ZF=0 y
SF<>OF.

;NC Salto !" no acarreoB !" C>K+.


;NE1;N, Salto !" no "40alB !" no ceroB !" ,>K+.
JNO Salto si no desbordamiento, si OF=0.
JNP/JPO Salto si no paridad, si paridad impar, si PF=0.
JNS Salto si no signo, si positivo, si SF=0.
JO Salto si desbordamiento, si OF=1.
JP/JPE Salto si paridad, si paridad par, si PF=1.
JS Salto si signo, si SF=1.
De!t")n e 80cle

LOOP (bucle)
Sintaxis: LOOP desplazamiento
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
Decrementa el registro contador CX; si CX es cero, ejecuta la
siguiente instruccin, en caso contrario transfiere el control a la direccin
resultante de sumar a P + desplazamiento. El desplazamiento debe estar
comprendido entre -128 y +127. Ejemplo:
mov cx,10
bucle: .......
.......
loop bucle
Con las mismas caractersticas que la instruccin anterior:

LOOPE/LOOPZ Bucle si igual, si cero. Z=1 y CX<>0

LOOPNE/LOOPNZ Bucle si no igual, si no cero. Z=0 y CX<>0
Interr0(c"one!

NT (interrupcin)
Sintaxis: NT n (0 <= n <= 255)
ndicadores: OF DF F TF SF ZF AF PF CF
- - 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 formada por los registros CS e P y el estado de los indicadores. NT 3
es un caso especial de NT, al ensamblarla el ensamblador genera un slo byte
en vez de los dos habituales; esta interrupcin se utiliza para poner puntos de
ruptura en los programas. Vase tambin RET y el apartado 1 del captulo V.
Ejemplo: int 21h

NTO (interrupcin por desbordamiento)
Sintaxis: NTO
ndicadores: OF DF F TF SF ZF AF PF CF
- - 0 0 - - - - -
Genera una interrupcin de tipo 4 (NT 4) si existe desbordamiento
(OF=1). De lo contrario se contina con la instruccin siguiente.

RET (retorno de interrupcin)
Sintaxis: RET
ndicadores: OF DF F TF SF ZF AF PF CF
x x x x x x x x x
Devuelve el control a la direccin de retorno salvada en la pila por una
interrupcin previa y restaura los indicadores que tambin se introdujeron en la
pila. En total, se sacan las 3 palabras que fueron colocadas en la pila cuando
se produjo la interrupcin. Vase tambin NT.
3.1.5. - NSTRUCCONES DE ENTRADA SALDA (E/S).

N (entrada)
Sintaxis: N acumulador, puerto.
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
Transfiere datos desde el puerto indicado hasta el registro AL o AX,
dependiendo de la longitud byte o palabra respectivamente. El puerto puede
especificarse mediante una constante (0 a 255) o a travs del valor contenido
en DX (0 a 65535).
Ejemplo: in ax,0fh
in al,dx

OUT (salida)
Sintaxis: OUT puerto, acumulador
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
Transfiere un byte o palabra del registro AL o AX a un puerto de
salida. El puerto puede especificarse con un valor fijo entre 0 y 255 a travs
del valor contenido en el registro DX (de 0 a 65535).
Ejemplo: out 12h,ax
out dx,al
3.1.6. - NSTRUCCONES ARTMTCAS.
L L L S U M A L L L

AAA (ajuste ASC para la suma)
Sintaxis: AAA
ndicadores: OF DF F TF SF ZF AF PF CF
? - - - ? ? x ? x
Convierte el contenido del registro AL en un nmero BCD no
empaquetado. Si los cuatro bits menos significativos de AL son mayores que 9
si el indicador AF est a 1, se suma 6 a AL, 1 a AH, AF se pone a 1, CF se
iguala a AF y AL pone sus cuatro bits ms significativos a 0.
Ejemplo: add al,bl
aaa
En el ejemplo, tras la suma de dos nmeros BCD no empaquetados
colocados en AL y BL, el resultado (por medio de AAA) sigue siendo un nmero
BCD no empaquetado.

ADC (suma con acarreo)
Sintaxis: ADC destino, origen
ndicadores: OF DF F TF SF ZF AF PF CF
x - - - x x x x x
Suma los operandos origen, destino y el valor del indicador de
acarreo (0 1) y el resultado lo almacena en el operando destino. Se utiliza
normalmente para sumar nmeros grandes, de ms de 16 bits, en varios
pasos, considerando lo (ue nos llevamos (el acarreo) de la suma anterior.
Ejemplo: adc ax,bx

ADD (suma)
Sintaxis: ADD destino, origen
ndicadores: OF DF F TF SF ZF AF PF CF
x - - - x x x x x
Suma los operandos origen y destino almacenando el resultado en el
operando destino. Se activa el acarreo si se desborda el registro destino
durante la suma.
Ejemplos: add ax,bx
add cl,dh

DAA (ajuste decimal para la suma)
Sintaxis: DAA
ndicadores: OF DF F TF SF ZF AF PF CF
? - - - x x x x x
Convierte el contenido del registro AL en un par de valores BCD: si los
cuatro bits menos significativos de AL son un nmero mayor que 9, el indicador
AF se pone a 1 y se suma 6 a AL. De igual forma, si los cuatro bits ms
significativos de AL tras la operacin anterior son un nmero mayor que 9, el
indicador CF se pone a 1 y se suma 60h a AL.
Ejemplo: add al,cl
daa
En el ejemplo anterior, si AL y CL contenan dos nmeros BCD
empaquetados, DAA hace que el resultado de la suma (en AL) siga siendo
tambin un BCD empaquetado.

NC (incrementar)
Sintaxis: NC destino
ndicadores: OF DF F TF SF ZF AF PF CF
x - - - x x x x -
ncrementa el operando destino. El operando destino puede ser byte
o palabra.
Obsrvese que esta instruccin no modifica el bit de acarreo (CF) y no es
posible detectar un desbordamiento por este procedimiento (utilcese ZF).
Ejemplos: inc al
inc es:[di]
inc ss:[bp+4]
inc word ptr cs:[bx+di+7]
L L L R E S T A L L L

AAS (ajuste ASC para la resta)
Sintaxis: AAS
ndicadores: OF DF F TF SF ZF AF PF CF
? - - - ? ? x ? x
Convierte el resultado de la sustraccin de dos operandos BCD no
empaquetados para que siga siendo un nmero BCD no empaquetado. Si el
nibble inferior de AL tiene un valor mayor que 9, de AL se resta 6, se
decrementa AH, AF se pone a 1 y CF se iguala a AF. El resultado se guarda en
AL con los bits de 4 a 7 puestos a 0.
Ejemplo: sub al,bl
aas
En el ejemplo, tras la resta de dos nmeros BCD no empaquetados
colocados en AL y BL, el resultado (por medio de AAS) sigue siendo un nmero
BCD no empaquetado.

CMP (comparacin)
Sintaxis: CMP destino, origen
ndicadores: OF DF F TF SF ZF AF PF CF
x - - - x x x x x
Resta origen de destino sin retornar ningn resultado. Los operandos
quedan inalterados, paro los indicadores pueden ser consultados mediante
instrucciones de bifurcacin condicional. Los operandos pueden ser de tipo
byte o palabra pero ambos de la misma dimensin.
Ejemplo: cmp bx, mem_pal
cmp ch,cl

DAS (ajuste decimal para la resta)
Sintaxis: DAS
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - x x x x x
Corrige el resultado en AL de la resta de dos nmeros BCD
empaquetados, convirtindolo tambin en un valor BCD empaquetado. Si el
nibble inferior tiene un valor mayor que 9 o AF es 1, a AL se le resta 6, AF se
pone a 1. Si el nibble mas significativo es mayor que 9 CF est a 1, entonces
se resta 60h a AL y se activa despus CF.
Ejemplo: sub al,bl
das
En el ejemplo anterior, si AL y BL contenan dos nmeros BCD
empaquetados, DAS hace que el resultado de la resta (en AL) siga siendo
tambin un BCD empaquetado.

DEC (decrementar)
Sintaxis: DEC destino
ndicadores: OF DF F TF SF ZF AF PF CF
x - - - x x x x -
Resta una unidad del operando destino. El operando puede ser byte o
palabra. Obsrvese que esta instruccin no modifica el bit de acarreo (CF) y no
es posible detectar un desbordamiento por este procedimiento (utilcese ZF).
Ejemplo: dec ax
dec mem_byte

NEG (negacin)
Sintaxis: NEG destino
ndicadores: OF DF F TF SF ZF AF PF CF
x - - - x x x x x
Calcula el valor negativo en complemento a dos del operando y
devuelve el resultado en el mismo operando.
Ejemplo: neg al

SBB (resta con acarreo)
Sintaxis: SBB destino, origen
ndicadores: OF DF F TF SF ZF AF PF CF
x - - - x x x x x
Resta el operando origen del operando destino y el resultado lo
almacena en el operando destino. Si est a 1 el indicador de acarreo adems
resta una unidad ms. Los operandos pueden ser de tipo byte o palabra. Se
utiliza normalmente para restar nmeros grandes, de ms de 16 bits, en varios
pasos, considerando lo (ue nos llevamos (el acarreo) de la resta anterior.
Ejemplo: sbb ax,ax
sbb ch,dh

SUB (resta)
Sintaxis: SUB destino, origen
ndicadores: OF DF F TF SF ZF AF PF CF
x - - - x x x x x
Resta el operando destino al operando origen, colocando el resultado
en el operando destino. Los operandos pueden tener o no signo, siendo
necesario que sean del mismo tipo, byte o palabra.
Ejemplos: sub al,bl
sub dx,dx
L L L M U L T I $ L I C A C I O N L L L

AAM (ajuste ASC para la multiplicacin)
Sintaxis: AAM
ndicadores: OF DF F TF SF ZF AF PF CF
? - - - x x ? x ?
Corrige el resultado en AX del producto de dos nmeros BCD no
empaquetados, convirtindolo en un valor BCD tambin no empaquetado. En
AH sita el cociente de AL/10 quedando en AL el resto de dicha operacin.
Ejemplo: mul bl
aam
En el ejemplo, tras el producto de dos nmeros BCD no
empaquetados colocados en AL y BL, el resultado (por medio de AAA) sigue
siendo, en AX, un nmero BCD no empaquetado.

MUL (multiplicacin entera con signo)
Sintaxis: MUL origen (ori!en no puede ser operando inmediato en 8086,
s en 286)
ndicadores: OF DF F TF SF ZF AF PF CF
x - - - ? ? ? ? x
Multiplica un operando origen con signo de longitud byte o palabra por
AL o AX respectivamente. Si ori!en es un byte el resultado se guarda en AH
(byte ms significativo) y en AL (menos significativo), si ori!en es una palabra el
resultado es devuelto en DX (parte alta) y AX (parte baja). Si las mitades ms
significativas son distintas de cero, independientemente del signo, CF y OF son
activados.
Ejemplo: imul bx
imul ch

MUL (multiplicacin sin signo)
Sintaxis: MUL origen (ori!en no puede ser operando inmediato)
ndicadores: OF DF F TF SF ZF AF PF CF
x - - - ? ? ? ? x
Multiplica el contenido sin signo del acumulador por el operando
origen. Si el
operando destino es un byte el acumulador es AL guardando el resultado en
AH y AL, si el contenido de AH es distinto de 0 activa los indicadores CF y OF.
Cuando el operando origen es de longitud palabra el acumulador es AX
quedando el resultado sobre DX y AX, si el valor de DX es distinto de cero los
indicadores CF y OF se activan.
Ejemplo: mul byte ptr ds:[di]
mul dx
mul cl
L L L D I V I S I O N L L L

AAD (ajuste ASC para la divisin)
Sintaxis: AAD
ndicadores: OF DF F TF SF ZF AF PF CF
? - - - x x ? x ?
Convierte dos nmeros BCD no empaquetados contenidos en AH y
AL en un dividendo de un byte que queda almacenado en AL. Tras la operacin
AH queda a cero. Esta instruccin es necesaria ANTES de la operacin de
dividir, al contrario que AAM.
Ejemplo: aad
div bl
En el ejemplo, tras convertir los dos nmeros BCD no empaquetados
(en AX) en un dividendo vlido, la instruccin de dividir genera un resultado
correcto.

DV (divisin sin signo)
Sintaxis: DV origen (ori!en no puede ser operando inmediato)
ndicadores: OF DF F TF SF ZF AF PF CF
? - - - ? ? ? ? ?
Divide, sin considerar el signo, un nmero contenido en el acumulador
y su extensin (AH, AL si el operando es de tipo byte o DX, AX si el operando
es palabra) entre el operando fuente. El cociente se guarda en AL o AX y el
resto en AH o DX segn el operando sea byte o palabra respectivamente. DX o
AH deben ser cero antes de la operacin. Cuando el cociente es mayor que el
resultado mximo que puede almacenar, cociente y resto quedan indefinidos
producindose una interrupcin 0. En caso de que las partes ms significativas
del cociente tengan un valor distinto de cero se activan los indicadores CF y
OF.
Ejemplo: div bl
div mem_pal

DV (divisin entera)
Sintaxis: DV origen (ori!en no puede ser operando inmediato)
ndicadores: OF DF F TF SF ZF AF PF CF
? - - - ? ? ? ? ?
Divide, considerando el signo, un nmero contenido en el acumulador
y su extensin entre el operando fuente. El cociente se almacena en AL o AX
segn el operando sea byte o palabra y de igual manera el resto en AH o DX.
DX o AH deben ser cero antes de la operacin. Cuando el cociente es positivo
y superior al valor mximo que puede almacenarse (7fh 7fffh), o cuando el
cociente es negativo e inferior al valor mnimo que puede almacenarse (81h u
8001h) entonces cociente y resto quedan indefinidos, generndose una
interrupcin 0, lo que tambin sucede si el divisor es 0.
Ejemplo: idiv bl
idiv bx
L L L C O N V E R S I O N E S L L L

CBW (conversin de byte en palabra)
Sintaxis: CBW
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
Copia el bit 7 del registro AL en todos los bits del registro AH, es decir,
expande el signo de AL a AX como paso previo a una operacin de 16 bits.

CWD (conversin de palabra a doble palabra)
Sintaxis: CWD
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
Expande el signo del registro AX sobre el registro DX, copiando el bit
ms significativo de AH en todo DX.
3.1.7. - NSTRUCCONES DE MANPULACN DE CADENAS.

CMPS/CMPSB/CMPSW (compara cadenas)
Sintaxis: CMPS cadena_destino, cadena_origen
CMPSB (bytes)
CMPSW (palabras)
ndicadores: OF DF F TF SF ZF AF PF CF
x - - - x x x x x
Compara dos cadenas restando al origen el destino. Ninguno de los
operandos se alteran, pero los indicadores resultan afectados. La cadena
origen se direcciona con registro S sobre el segmento de datos DS y la cadena
destino se direcciona con el registro D sobre el segmento extra ES. Los
registros D y S se autoincrementan o autodecrementan segn el valor del
indicador DF (vanse CLD y STD) en una o dos unidades, dependiendo de si
se trabaja con bytes o con palabras. Cadena ori!en y cadena destino son dos
operandos redundantes que slo indican el tipo del dato (byte o palabra) a
comparar, es ms cmodo colocar CMPSB o CMPSW para indicar
bytes/palabras. Si se indica un registro de segmento, ste sustituir en la
cadena origen al DS ordinario. Ejemplo:
lea si,origen
lea di,destino
cmpsb

LODS/LODSB/LODSW (cargar cadena)
Sintaxis: LODS cadena_origen
LODSB (bytes)
LODSW (palabras)
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
Copia en AL o AX una cadena de longitud byte o palabra direccionada
sobre el segmento de datos (DS) con el registro S. Tras la transferencia, S se
incrementa o decrementa segn el indicador DF (vanse CLD y STD) en una o
dos unidades, segn se estn manejando bytes o palabras. Cadena4ori!en es
un operando redundante que slo indica el tipo del dato (byte o palabra) a
cargar, es ms cmodo colocar LODSB o LODSW para indicar bytes/palabras.
Ejemplo: cld
lea si,origen
lodsb

MOVS/MOVSB/MOVSW (mover cadena)
Sintaxis: MOVS cadena_destino, cadena_origen
MOVSB (bytes)
MOVSW (palabras)
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
Transfiere un byte o una palabra de la cadena origen direccionada por
DS:S a la cadena destino direccionada por ES:D, incrementando o
decrementando a continuacin los registros S y D segn el valor de DF
(vanse CLD y STD) en una o dos unidades, dependiendo de si se trabaja con
bytes o con palabras. Cadena ori!en y cadena destino son dos operandos
redundantes que slo indican el tipo del dato (byte o palabra) a comparar, es
ms cmodo colocar MOVSB o MOVSW para indicar bytes/palabras. Si se
indica un registro de segmento, ste sustituir en la cadena origen al DS
ordinario.
Ejemplo: lea si,origen
lea di,destino
movsw

SCAS/SCASB/SCASW (explorar cadena)
Sintaxis: SCAS cadena_destino
SCASB (bytes)
SCASW (palabras)
ndicadores: OF DF F TF SF ZF AF PF CF
x - - - x x x x x
Resta de AX o AL una cadena destino direccionada por el registro D
sobre el segmento extra. Ninguno de los valores es alterado pero los
indicadores se ven afectados. D se incrementa o decrementa segn el valor de
DF (vanse CLD y STD) en una o dos unidades -segn se est trabajando con
bytes o palabras- para apuntar al siguiente elemento de la cadena.
Cadena4destino es un operando redundante que slo indica el tipo del dato
(byte o palabra), es ms cmodo colocar SCASB o SCASW para indicar
bytes/palabras.
Ejemplo: lea di,destino
mov al,50
scasb

STOS/STOSB/STOSW (almacena cadena)
Sintaxis: STOS cadena_destino
STOSB (bytes)
STOSW (palabras)
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
Transfiere el operando origen almacenado en AX o AL, al destino
direccionado por el registro D sobre el segmento extra. Tras la operacin, D
se incrementa o decrementa segn el indicador DF (vanse CLD y STD) para
apuntar al siguiente elemento de la cadena. Cadena4destino es un operando
redundante que slo indica el tipo del dato (byte o palabra) a cargar, es ms
cmodo colocar STOSB o STOSW para indicar bytes/palabras.
Ejemplo: lea di,destino
mov ax,1991
stosw

REP/REPE/REPZ/REPNE/REPNZ (repetir)
REP repetir operacin de cadena
REPE/REPZ repetir operacin de cadena si igual/si cero
REPNE/REPNZ repetir operacin de cadena si no igual (si no 0)
Estas instrucciones se pueden colocar como prefijo de otra instruccin
de manejo de cadenas, con objeto de que la misma se repita un nmero
determinado de veces incondicionalmente o hasta que se verifique alguna
condicin. El nmero de veces se indica en CX. Por sentido comn slo deben
utilizarse las siguientes combinaciones:
Prefijo Funcin nstrucciones
----------- ------------------------------- ----------------
REP Repetir CX veces MOVS, STOS
REPE/REPZ Repetir CX veces mientras ZF=1 CMPS, SCAS
REPNE/REPNZ Repetir CX veces mientras ZF=0 CMPS, SCAS
Ejemplos:
1) Buscar el byte 69 entre las 200 primeras posiciones de tabla (se
supone tabla en el segmento ES):
LEA D,tabla
MOV CX,200
MOV AL,69
CLD
REPNE SCASB
JE encontrado
2) Rellenar de ceros 5000 bytes de una tabla colocada en datos (se
supone datos en el segmento ES):
LEA D,datos
MOV AX,0
MOV CX,2500
CLD
REP STOSW
3) Copiar la memoria de pantalla de texto (adaptador de color) de un
PC en un buffer (se supone bu%%er en el segmento ES):
MOV CX,0B800h ; segmento de pantalla
MOV DS,CX ; en DS
LEA D,buffer ; destino en ES:D
MOV S,0 ; copiar desde DS:0
MOV CX,2000 ; 2000 palabras
CLD ; hacia adelante
REP MOVSW ; copiar CX palabras
3.1.8. - NSTRUCCONES DE OPERACONES LGCAS A NVEL DE BT.

AND (y lgico)
Sintaxis: AND destino, origen
ndicadores: OF DF F TF SF ZF AF PF CF
0 - - - x x ? x 0
Realiza una operacin de Y lgico entre el operando origen y destino
quedando el resultado en el destino. Son vlidos operandos byte o palabra,
pero ambos del mismo tipo.
Ejemplos: and ax,bx
and bl,byte ptr es:[si+10h]

NOT (no lgico)
Sintaxis: NOT destino
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
Realiza el complemento a uno del operando destino, invirtiendo cada
uno de sus bits. Los indicadores no resultan afectados.
Ejemplo: not ax

OR (O lgico)
Sintaxis: OR destino, origen
ndicadores: OF DF F TF SF ZF AF PF CF
0 - - - x x ? x 0
Realiza una operacin O lgico a nivel de bits entre los dos
operandos, almacenndose despus el resultado en el operando destino.
Ejemplo: or ax,bx

TEST (comparacin lgica)
Sintaxis: TEST destino, origen
ndicadores: OF DF F TF SF ZF AF PF CF
0 - - - x x ? x 0
Realiza una operacin Y lgica entre los dos operandos pero sin
almacenar el resultado. Los indicadores son afectados con la operacin.
Ejemplo: test al,bh

XOR (O exclusivo)
Sintaxis: XOR destino, origen
ndicadores: OF DF F TF SF ZF AF PF CF
0 - - - x x ? x 0
Operacin OR exclusivo a nivel de bits entre los operandos origen y
destino almacenndose el resultado en este ltimo.
Ejemplo: xor di,ax
3.1.9. - NSTRUCCONES DE CONTROL DEL PROCESADOR.

NOP (operacin nula)
Sintaxis: NOP
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
Realiza una operacin nula, es decir, el microprocesador decodifica la
instruccin y pasa a la siguiente. Realmente se trata de la instruccin XCHG
AX,AX.

ESC (salida a un coprocesador)
Sintaxis: ESC cdigo_operacin, origen
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
Se utiliza en combinacin con procesadores externos, tales como los
coprocesadores de coma flotante o de E/S, y abre al dispositivo externo el
acceso a las direcciones y operandos requeridos. Al mnemnico ESC le siguen
los cdigos de operacin apropiados para el coprocesador as como la
instruccin y la direccin del operando necesario.
Ejemplo: esc 21,ax

HLT (parada hasta interrupcin o reset)
Sintaxis: HLT
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
El procesador se detiene hasta que se restaura el sistema o se recibe
una interrupcin. Como en los PC se producen normalmente 18,2
interrupciones de tipo 8 por segundo (del temporizador) algunos
programadores utilizan HLT para hacer pausas y bucles de retardo. Sin
embargo, el mtodo no es preciso y puede fallar con ciertos controladores de
memoria.

LOCK (bloquea los buses)
Sintaxis: LOCK
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
Es una instruccin que se utiliza en aplicaciones de recursos
compartidos para asegurar que no accede simultneamente a la memoria ms
de un procesador. Cuando una instruccin va precedida por LOCK, el
procesador bloquea inmediatamente el bus, introduciendo una seal por la
patilla LOCK.

WAT (espera)
Sintaxis: WAT
ndicadores: OF DF F TF SF ZF AF PF CF
- - - - - - - - -
Provoca la espera del procesador hasta que se detecta una seal en
la patilla TEST. Ocurre, por ejemplo, cuando el copro ha terminado una
operacin e indica su finalizacin. Suele preceder a ESC para sincronizar las
acciones del procesador y coprocesador.
3.1.10. - NSTRUCCONES DE ROTACN Y DESPLAZAMENTO.

RCL (rotacin a la izquierda con acarreo)
Sintaxis: RCL destino, contador
ndicadores: OF DF F TF SF ZF AF PF CF
x - - - - - - - x
Rotar a la izquierda los bits del operando destino junto con el
indicador de acarreo CF el nmero de bits especificado en el segundo
operando. Si el nmero de bits a desplazar es 1, se puede especificar
directamente, en caso contrario el valor debe cargarse en CL y especificar CL
como segundo operando. No es conveniente que CL sea mayor de 7, en bytes;
15, en palabras.
Ejemplos: rcl ax,1
rcl al,cl
rcl di,1

RCR (rotacin a la derecha con acarreo)
Sintaxis: RCR destino, contador
ndicadores: OF DF F TF SF ZF AF PF CF
x - - - - - - - x
Rotar a la derecha los bits del operando destino junto con el indicador
de acarreo CF el nmero de bits especificado en el segundo operando. Si el
nmero de bits es 1 se puede especificar directamente; en caso contrario su
valor debe cargarse en CL y especificar CL como segundo operando:
Ejemplos: rcr bx,cl
rcr bx,1

ROL (rotacin a la izquierda)
Sintaxis: ROL destino, contador
ndicadores: OF DF F TF SF ZF AF PF CF
x - - - - - - - x
Rota a la izquierda los bits del operando destino el nmero de bits
especificado en el segundo operando, que puede ser 1 CL previamente
cargado con el valor del nmero de veces.
Ejemplos: rol dx,cl
rol ah,1

ROR (rotacin a la derecha)
Sintaxis: ROR destino, contador
ndicadores: OF DF F TF SF ZF AF PF CF
x - - - - - - - x
Rota a la derecha los bits del operando destino el nmero de bits
especificado en el segundo operando. Si el nmero de bits es 1 se puede poner
directamente, en caso contrario debe ponerse a travs de CL.
Ejemplos: ror cl,1
ror ax,cl

SAL/SHL (desplazamiento aritmtico a la izquierda)
Sintaxis: SAL/SHL destino, contador
ndicadores: OF DF F TF SF ZF AF PF CF
x - - - x x ? x x
Desplaza a la izquierda los bits del operando el nmero de bits
especificado en el segundo operando que debe ser CL si es mayor que 1 los
bits desplazados.

SAR (desplazamiento aritmtico a la derecha)
Sintaxis: SAR destino, contador
ndicadores: OF DF F TF SF ZF AF PF CF
x - - - x x ? x x
Desplaza a la derecha los bits del operando destino el nmero de bits
especificado en el segundo operando. Los bits de la izquierda se rellenan con
el bit de signo del primer operando. Si el nmero de bits a desplazar es 1 se
puede especificar directamente, si es mayor se especifica a travs de CL.
Ejemplos: sar ax,cl
sar bp,1

SHR (desplazamiento lgico a la derecha)
Sintaxis: SHR destino, contador
ndicadores: OF DF F TF SF ZF AF PF CF
x - - - x x ? x x
Desplaza a la derecha los bits del operando destino el nmero de los
bits especificados en el segundo operando. Los bits de la izquierda se llena con
cero. Si el nmero de bits a desplazar es 1 se puede especificar directamente
en el caso en que no ocurra se pone el valor en CL:
Ejemplos: shr ax,cl
shr cl,1
%.#. - RESUMEN AL>A&MTICO DE LAS INSTRUCCIONES ' &ANDERINES.
CNDICE.
Nota: en el efecto de las instrucciones sobre el registro de estado se
utilizar la siguiente notacin:
- bit no modificado
? desconocido o indefinido
x modificado segn el resultado de la operacin
1 puesto siempre a 1
0 puesto siempre a 0
nstruccin Sintaxis Efecto sobre los flags
---------------- --------------------- --------------------------
OF DF F TF SF ZF AF PF CF
AAA AAA ? - - - ? ? x ? x
AAD AAD ? - - - x x ? x ?
AAM AAM ? - - - x x ? x ?
AAS AAS ? - - - ? ? x ? x
ADC dst,fnt ADC dst,fnt x - - - x x x x x
ADD dst,fnt ADD dst,fnt x - - - x x x x x
AND dst,fnt AND dst,fnt 0 - - - x x ? x 0
CALL dsp CALL dsp - - - - - - - - -
CBW CBW - - - - - - - - -
CLC CLC - - - - - - - - 0
CLD CLD - 0 - - - - - - -
CL CL - - 0 - - - - - -
CMC CMC - - - - - - - - x
CMP dst,fnt CMP dst,fnt x - - - x x x x x
CMPS/CMPSB
CMPSW cdst,cfnt CMPS cdst,cfnt x - - - x x x x x
CWD CWD - - - - - - - - -
DAA DAA ? - - - x x x x x
DAS DAS - - - - x x x x x
DEC dst DEC dst x - - - x x x x -
DV fnt DV dst ? - - - ? ? ? ? ?
ESC opcode,fnt ESC opcode,fnt - - - - - - - - -
HLT HLT - - - - - - - - -
DV fnt DV fnt ? - - - ? ? ? ? ?
MUL fnt MUL fnt x - - - ? ? ? ? x
N acum,port N acum,port - - - - - - - - -
NC dst NC dst x - - - x x x x -
NT interrup NT interrup - - 0 0 - - - - -
NTO NTO - - 0 0 - - - - -
RET RET x x x x x x x x x
Jcc (JA, JBE...) Jcc dsp - - - - - - - - -
JMP JMP dsp - - - - - - - - -
JCXZ dsp JCXZ dsp - - - - - - - - -
LAHF LAHF - - - - - - - - -
LDS dst,fnt LDS dst,fnt - - - - - - - - -
LEA dst,fnt LEA dst,fnt - - - - - - - - -
LES dst,fnt LES dst,fnt - - - - - - - - -
LOCK LOCK - - - - - - - - -
LODS/LODSB/
LODSW cfnt LODS mem - - - - - - - - -
LOOP LOOP dsp - - - - - - - - -
LOOPcc (LOOPE...) LOOPcc dsp - - - - - - - - -
MOV dst,fnt MOV dst,fnt - - - - - - - - -
MOVS/MOVSB/
MOVSW cdst,cfnt MOVS cdst,cfnt - - - - - - - - -
MUL fnt MUL fnt x - - - ? ? ? ? x
NEG dst NEG fnt x - - - x x x x x
NOP NOP - - - - - - - - -
NOT dst NOT dst - - - - - - - - -
OR dst,fnt OR dst,fnt 0 - - - x x ? x 0
OUT port,acum OUT port,acum - - - - - - - - -
POP dst POP dst - - - - - - - - -
POPF POPF x x x x x x x x x
PUSH dst PUSH dst - - - - - - - - -
PUSHF PUSHF - - - - - - - - -
RCL dst,cnt RCL dst,cnt x - - - - - - - x
RCR dst,cnt RCR dst,cnt x - - - - - - - x
REP/REPE/REPZ/
REPNE/REPNZ REP - - - - - - - - -
RET [val] RET [val] - - - - - - - - -
RETF [val] RETF [val] - - - - - - - - -
ROL dst,cnt ROL dst,cnt x - - - - - - - x
ROR dst,cnt ROR dst,cnt x - - - - - - - x
SAHF SAHF - - - - x x x x x
SAL/SHL dst,cnt SAL dst,cnt x - - - x x ? x x
SAR dst,cnt SAR dst,cnt x - - - x x ? x x
SBB dst,fnt SBB dst,fnt x - - - x x x x x
SCAS/SCASB/
SCASW cdst SCAS cdst x - - - x x x x x
SHR dst,cnt SHR dst,cnt x - - - x x ? x x
STC STC - - - - - - - - 1
STD STD - 1 - - - - - - -
ST ST - - 1 - - - - - -
STOS/STOSB/
STOSW cdst STOS cdst - - - - - - - - -
SUB dst,fnt SUB dst,fnt x - - - x x x x x
TEST dst,fnt TEST dst,fnt 0 - - - x x ? x 0
WAT WAT - - - - - - - - -
XCHG dst,fnt XCHG dst,fnt - - - - - - - - -
XLAT tfnt XLAT tfnt - - - - - - - - -
XOR dst,fnt XOR dst,fnt 0 - - - x x ? x 0
%.%. - INSTRUCCIONES ES$ECI>ICAS DEL #*.B %*. 7 /*. EN MODO REAL.
3.3.1. - DFERENCAS EN EL COMPORTAMENTO GLOBAL RESPECTO AL
8086.
- Excepciones de divisin:
Las excepciones NT 0, debidas a una divisin por cero o a un cociente
excesivamente grande, provocan que en la pila se almacene el valor de CS:P
para la siguiente instruccin en el 8086. En el 286 y superiores se almacena el
CS:P de la propia instruccin que causa la excepcin.
- Cdigos de operacin indefinidos.
En el 286 y superiores se produce una excepcin 6 (NT 6) o, si es una
instruccin con sentido para estos procesadores, se ejecuta. El 8086 se
estrella.
- Valor de PUSH SP.
El valor que introduce en la pila en el 286 y superiores es el de SP antes
del PUSH; en el 8086 es el de SP despus del PUSH (dos unidades menos).
- Desplazamientos y rotaciones.
El valor de desplazamiento en las operaciones de manipulacin de bits
del 8086 es una constante de 8 bits (indicada en CL); en el 286 y superiores se
toma mdulo 32 (slo se consideran los 5 bits menos significativos).
- Prefijos redundantes.
Las instrucciones tienen una longitud ilimitada en el 8086; en el 286 y
superiores no pueden exceder de 15 bytes. Por tanto, los prefijos redundantes
pueden producir excepciones de cdigo de operacin no vlido.
- Accesos al lmite del segmento.
Un acceso de 16 bits en el offset 0FFFFh en el 8086 provoca un acceso
a los bytes ubicados en las posiciones 0FFFFh y 0 (se da la vuelta alrededor
del segmento). En el 286 y superiores, se
produce una excepcin de violacin de lmites. En el 386 y superiores se
produce tambin en accesos de 32 bits en las posiciones 0FFFDh a la 0FFFFh.
Esto se cumple tanto para accesos a datos en memoria como a instrucciones
del programa en esos puntos crticos.
- LOCK.
Esta instruccin no est limitada de ninguna manera en el 8086 y en el
286. En el 386 y superiores su uso est restringido a determinadas
instrucciones.
- Ejecucin paso a paso.
La prioridad de la excepcin paso a paso en el 286 y superiores es ms
alta que la de una interrupcin externa; por tanto, las interrupciones externas
no pueden ser traceadas.
- Registro de FLAGS.
Difiere algo en los bits 12 al 15 en todos los procesadores; el 386
dispone adems de un registro de flags de 32 bits.
- nterrupcin NM.
Desde el 286 y superiores, una NM no puede interrumpir una rutina de
tratamiento NM.
- Error del coprocesador.
En el 286 y superiores se utiliza el vector 16; en el 8086 cualquier vector.
- Prefijos de las instrucciones del coprocesador.
Al producirse una excepcin de error de coprocesador, en el 8086 se
almacena un CS:P que no incluye prefijos -si los haba-, al contrario que en el
286 y superiores.
- Lmite del primer megabyte.
En el 8086 la memoria es circular; al final del primer megabyte se vuelve
a comenzar por las posiciones ms bajas de la memoria. En el 286 y
superiores, se accede a la memoria extendida (un artificio hardware en los PC
lo impide al forzar A20 a estado bajo, pero puede ser solventado).
- nstrucciones de cadena repetitivas.
El CS:P grabado en el 8086 no incluye el prefijo, si existe; en el 286 y
superiores s.
3.3.2. - NSTRUCCONES ESPECFCAS DEL 286.
A continuacin se describen las instrucciones adicionales que incorporan los
286 en modo real, que tambin pueden ser consideradas cuando trabajamos
con los microprocesadores compatibles V20 y V30, as como con los
procesadores superiores al 286. Las instrucciones del modo protegido se
dirigen especialmente a la multiprogramacin y el tiempo compartido, siendo
especficas de la conmutacin de procesos y tratamiento de la memoria virtual
y no pueden emplearse directamente bajo DOS.

BOUND r16, mem16: Comprueba si el registro de 16 bits indicado como
primer operando est dentro de los lmites de una matriz. Los lmites de la
matriz los definen dos palabras consecutivas en la memoria apuntadas por
mem16. Si est fuera de los lmites, se produce una interrupcin 5 en la que el
P apilado queda apuntando a la instruccin BOUND (no se incrementa!).

ENTER crea una estructura de pila para un procedimiento de alto nivel.

Las instrucciones PUSH permiten meter valores inmediatos a la pila: es vlido
hacer PUSH 40h.

MUL puede multiplicar cualquier registro de 16 bits por una constante
inmediata, devolviendo un resultado palabra (CF=1 si no cabe en 16 bits); por
ejemplo, es vlido MUL CX,25. Tambin se admiten tres operandos: MUL r1,
r2, imm. En este caso, se multiplica r2 por el valor inmediato
(8/16 bits) y el resultado se almacena en r1. Tanto r1 como r2 han de ser de 16
bits.

LEAVE abandona los procedimientos de alto nivel (equivale a MOV SP,BP /
POP BP).

PUSHA/POPA: ntroduce en la pila y en este orden los registros AX, CX, DX,
BX, SP, BP, S y D -o los saca en orden inverso-. deal en el manejo de
interrupciones y muy usada en las BOS de 286 y 386.

OUTS (salida de cadenas) e NS (entrada de cadenas) repetitivas
(equivalente a MOVS y LODS).

RCR/RCL, ROR/ROL, SAL/SAR y SHL/SHR admiten una constante de
rotacin distinta de 1.
3.3.3. - NSTRUCCONES PROPAS DEL 386 Y 486.

Adems de todas las posibilidades adicionales del 286, el 386 y el 486
permiten utilizar cualquier registro de 32 bits de propsito general en todos los
modos de funcionamiento, incluido el modo real, tales como EAX, EBX, ECX,
EDX, ES, ED, EBP. Sin embargo no deben intentarse direccionamientos por
encima de los 64K. En otras palabras, se pueden utilizar para acelerar las
operaciones pero no para acceder a ms memoria. Por ejemplo, si EBX >
0FFFFh, la instruccin MOV AX,[EBX] tendra un resultado impredecible.
Adems, estos procesadores cuentan con dos segmentos ms: adems de DS,
ES, CS y SS se pueden emplear tambin FS y GS. Aviso: parece ser que en
algunos 386 fallan ocasionalmente las instrucciones de multiplicar de 32 bits.
Nota: No es del todo cierto que el 386 y el 486 no permitan
acceder a ms de 64 Kb en modo real: en la seccin 3.3.6 hay un
ejemplo de ello.

Los modos de direccionamiento aumentan notablemente su flexibilidad en el
386 y superiores. Con los registros de 16 bits slo estn disponibles los modos
tradicionales. En cambio, con los de 32 se puede utilizar en el direccionamiento
indirecto cualquier registro: es vlida, por ejemplo, una instruccin del tipo MOV
AX,[ECX] o MOV EDX,[EAX]. Los desplazamientos en el direccionamiento
indexado con registros de 32 bits pueden ser de 8 y tambin de 32 bits.
Cuando dos registros deben sumarse para calcular la direccin efectiva, el
segundo puede estar multiplicado por 2, 4 u 8; por ejemplo, es vlida la
instruccin MOV AL,[EDX+EAX*8]. Por supuesto, bajo DOS hay que
asegurarse siempre que el resultado de todas las operaciones que determinan
la direccin efectiva no excede de 0FFFFh (0FFFEh si se accede a palabras y
0FFFCh en accesos a dobles palabras en memoria).

BOUND r32, mem32: Se admiten ahora operandos de 32 bits.

BSF/BSR: Exploracin de bits hacia adelante y atrs, respectivamente. La
sintaxis es:
BSF reg, reg BSF reg, [memoria]
BSR reg, reg BSR reg, [memoria]
Donde re! puede ser de 16 32 bits. Se comienza a explorar por el bit 0
(BSF) o por el ms significativo (BSR) del segundo operando: si no aparece
ningn bit activo (a 1) el indicador ZF se activa; en caso contrario se almacena
en el primer operando la posicin relativa de ese bit:
MOV AX,8
BSF BX,AX
JZ ax_es_0 ; no se saltar, adems BX = 3

BT/BTC/BTR/BTS: Operaciones sobre bits: comprobacin, comprobacin y
complementacin, comprobacin y puesta a 0, comprobacin y puesta a 1.
Sintaxis (ejemplo sobre BT):
BT reg, reg BT reg, imm8
Donde re! puede ser de 16 32 bits, el operando inmediato es
necesariamente de 8. Estas instrucciones copian el nmero de bit del primer
operando que indique el segundo operando (entre 0 y 31) en el acarreo. A
continuacin no le hacen nada a ese bit (BT), lo complementan (BTC), lo
borran (BTR) o lo activan (BTS). Ejemplo:
MOV AX,16
BTC AX,4 ; resultado: CF = 1 y AX = 0

CDQ: Similar a CWD, extiende el signo de EAX a EDX:EAX.

CMPSD: Similar a CMPSW pero empleando ES, ED, ECX y comparando
datos de 32 bits. Se puede emplear bajo DOS siempre que ES y ED
(utilizando REP tambin ECX) no excedan de 0FFFFh.

CWDE: Extiende el signo de AX a EAX.

MUL: Ahora se admite un direccionamiento a memoria en el 2 operando:
MUL CX,[dato]

NSD: Similar a NSW pero empleando ES, ED, ECX y leyendo datos de 32
bits. Se puede emplear bajo DOS siempre que ES y ED (utilizando REP
tambin ECX) no excedan de 0FFFFh.

Jcc: Los saltos condicionales ahora pueden ser de 32 bits!. Mucho cuidado
con la directiva .386 en los programas en que se desee mantener la
compatibilidad con procesadores anteriores. JECXZ se utiliza en vez de JCXZ
(mismo cdigo de operacin).

LODSD: Similar a LODSW pero empleando ES, ED y ECX y cargando datos
de 32 bits en EAX. Se puede emplear bajo DOS siempre que ES y ED
(utilizando REP tambin ECX) no excedan de 0FFFFh.

LSS, LFS, LGS: similar a LDS o LES pero con esos registros de segmento.

MOV CRx,reg / MOV DRx,reg y los recprocos: acceso a registros de control y
depuracin.

MOVSD: Similar a MOVSW pero empleando ES, ED, ECX y moviendo datos
de 32 bits. Se puede emplear bajo DOS para acelerar las transferencias
siempre que ES y ED (utilizando REP tambin ECX) no excedan de 0FFFFh.
Operando sobre la memoria de vdeo slo se obtiene ventaja si la tarjeta es
realmente de 32 bits.

MOVSX / MOVZX: carga con extensin de signo o cero. Toma el segundo
operando, le extiende adecuadamente el signo (o le pone a cero la parte alta)
hasta que sea tan grande como el primer operando y luego lo carga en el
primer operando. Si el primer operando es de 16 bits, el segundo slo puede
ser de 8; si el primero es de 32 bits el segundo puede ser de 8 16. El primer
operando debe ser un registro, el segundo puede ser un registro u operando en
memoria (nunca inmediato):
MOV EAX,0FFFFFFFFh
MOV AX,7FFFh ; resultado: EAX = 0FFFF7FFFh
MOVSX EAX,AX ; resultado: EAX = 000007FFFh

OUTSD: Similar a OUTSW pero empleando ES, ED, ECX y enviando datos
de 32 bits. Se puede emplear bajo DOS siempre que ES y ED (usando REP
tambin ECX) no rebasen 0FFFFh.

Prefijos FS: y GS: en los accesos a memoria, referenciando a esos
segmentos.

PUSHAD / POPAD: Similares a PUSHA y POPA pero con los registro de 32
bits. La instruccin POPAD falla en la mayora de los 386, incluidos los de
AMD. Para solventar el fallo (que consiste en que EAX no se restaura
correctamente) basta colocar un NOP inmediatamente detrs de POPAD.

PUSHFD/POPFD introducen y sacan de la pila los flags de 32 bits.

SCASD: Similar a SCASW pero empleando ES, ED, ECX y buscando datos
de 32 bits. Se puede emplear bajo DOS siempre que ES y ED (usando REP
tambin ECX) no rebasen 0FFFFh.

SETcc reg8 mem8: Si se cumple la condicin cc, se pone a 1 el byte de
memoria o registro de 8 bits indicado (si no, a 0). Por ejemplo, con el acarreo
activo, SETC AL pone a 1 el registro AL.

SHLD / SHRD: Desplazamiento de doble precisin a la izquierda/derecha. La
sintaxis es (ejemplo sobre SHLD):
SHLD regmem16, reg16, imm8 SHLD regmem16, reg16, C
SHLD regmem32, reg32, imm8 SHLD regmem32, reg32, CL
Donde re!mem es un registro u operando en memoria, indistintamente,
del tamao indicado. En el caso de SHLD, se desplaza el primer operando a la
izquierda tanto como indique el tercer operando (contador). Una vez
desplazado, los bits menos significativos se rellenan con los ms significativos
del segundo operando, que no resulta alterado. SHRD es anlogo pero al
revs.
MOV AX,1234h
MOV BX,5678h
SHLD AX,BX,4 ; resultado: AX=2345h, BX=5678h

STOSD: Similar a STOSW pero empleando ES, ED, ECX y almacenando
EAX. Se puede emplear bajo DOS siempre que ES y ED (utilizando REP
tambin ECX) no excedan de 0FFFFh.
3.3.3. - DETECCN DE UN SSTEMA AT O SUPEROR.
Hay casos en los que es necesario determinar si una mquina es AT o
superior: no ya de cara a emplear instrucciones propias del 286 en modo real
(tambin disponibles en los V20/V30 y 80188/80186) sino debido a la
necesidad de acceder a ciertos chips (por ejemplo, el segundo controlador de
interrupciones) que de antemano se sabe que slo equipan mquinas AT o
superiores. Es importante por tanto determinar la presencia de un AT, de cara a
evitar ciertas instrucciones que podran bloquear un PC o XT. No se debe en
estos casos comprobar los bytes de la ROM que identifican el equipo: a veces
no son correctos y, adems, la evolucin futura que tengan es impredecible. Lo
ideal es verificar directamente si est instalado un 286 o superior.
PUSHF
POP AX ; AX = flags
AND AH,0Fh ; borrar nibble ms significativo
PUSH AX
POPF ; intentar poner a 0 los 4 bits ms significativos de los flags
PUSHF
POP AX
AND AH,0F0h ; seguirn valiendo 1 excepto en un 80286 o superior
CMP AH,0F0h
JE no_es_AT
JMP si_es_AT ; es 286 o superior
3.3.5. - EVALUACN EXACTA DEL MCROPROCESADOR NSTALADO.
Sobra decir que las instrucciones avanzadas deben ser utilizadas con la
previa comprobacin del tipo de procesador, aunque slo sea para decir al
usuario que se compre una mquina ms potente antes de abortar la ejecucin
del programa. Para averiguar el procesador de un ordenador puede emplearse
el siguiente programa de utilidad, basado en el procedimiento (roce!aorN
que devuelve en AX un cdigo numrico entro 0 y 8 distinguiendo entre los 9
procesadores ms difciles de identificar de los ordenadores compatibles. Nota:
el 486 no tiene que tener coprocesador necesariamente (el 486sx carece de
l).
Algunas versiones de procesador 486 y todos los procesadores posteriores
soportan la instruccin CPUD que permite identificar la CPU. Basta comprobar
un bit del registro de estado para saber si est soportada y, en ese caso, poder
emplear dicha instruccin. De este modo, resulta trivial detectar el Pentium o
cualquier procesador posterior que aparezca. Esta instruccin est
documentada, por ejemplo en alguno de los ficheros que acompaan al
nterrupt List. Para los propsitos de este libro no es preciso en general
detectar ms all del 386.
Es normal que el lector recin iniciado en el ensamblador no entienda
absolutamente nada de este programa, ya que hasta los siguientes captulos
no ser explicada la sintaxis del lenguaje. En ese caso, puede saltarse este
ejemplo y continuar en el captulo siguiente, mxime si no tiene previsto
trabajar con otras instrucciones que no sean las del 8086. Por ltimo, recordar
que las instrucciones especficas del 286 en modo real tambin estn
disponibles en los V20/V30 de NEC y la serie 80188/80186 de ntel.
; ********************************************************************
; * *
; * CPU v2.2 (c) Septiembre 1992 CiriSOFT *
; * (c) Grupo Universitario de nformtica - Valladolid *
; * *
; * Este programa determina el tipo de microprocesador del equipo *
; * y devuelve un cdigo ERRORLEVEL indicndolo: *
; * *
; * 0-8088, 1-8086, 2-NEC V20, 3-NEC V30, *
; * 4-80188, 5-80186, 6-286, 7-386, 8-486 *
; * *
; * Aviso: Utilizar TASM 2.0 o compatible exclusivamente. *
; * *
; ********************************************************************
cpu SEGMENT
ASSUME CS:cpu, DS:cpu
.386
ORG 100h
inicio:
LEA DX,texto_ini ; texto de saludo
MOV AH,9
NT 21h ; imprimirlo
CALL procesador? ; tipo de procesador en AX
PUSH AX ; guardarlo para el final
LEA BX,cpus_indice-2 ; tabla de nombres-2
MOV CX,0FFFFh ; nmero de iteracin-1
otro_proc: NC CX
ADD BX,2
MOV DX,[BX] ; nombre del primer procesador
CALL print
CMP CX,AX ; procesador del equipo?
JNE no_es_este
LEA DX,apuntador_txt ; s lo es: indicarlo
CALL print
no_es_este: LEA DX,separador_txt
CALL print
CMP CX,7 ; nmero de CPUs tratadas-1
JBE otro_proc
LEA DX,texto_fin ; ltimos caracteres
CALL print
MOV AH,4Ch ; retornar cdigo errorlevel AL
NT 21h ; fin de programa
procesador? PROC ; devolver el tipo de microprocesador en AX
PUSHF
PUSH DS
PUSH ES
PUSH CX
PUSH DX
PUSH D
PUSH S
MOV AX,CS
MOV DS,AX ; durante la rutina se guardar
MOV ES,AX ; el tipo de procesador en DL:
MOV DL,6 ; supuesto un 286 (DL=6) ...
PUSHF
POP AX ; AX = flags
AND AX,0FFFh ; borrar nibble ms significativo
PUSH AX
POPF ; intentar poner a 0 los 4 bits ms
PUSHF ; significativos de los flags
POP AX
AND AX,0F000h ; seguirn valiendo 1 excepto en
CMP AX,0F000h ; un 80286 o superior
JE ni286ni_super
PUSHF ; es 286 o superior
POP AX
OR AX,7000h ; intentar activar bit 12, 13 14
PUSH AX
POPF
PUSHF
POP AX
AND AX,7000h ; 286 pone bits 12, 13 y 14 a cero
JZ cpu_hallada ; es un 286 (DL=6)
NC DL ; es un 386 (DL=7) ... de momento
PUSH DX
CL ; momento crtico
MOV EDX,ESP ; preservar ESP en EDX
AND ESP,0FFFFh ; borrar parte alta de ESP
AND ESP,0FFFCh ; forzar ESP a mltiplo de 4
PUSHFD ; guardar flags en pila (32 bits)
POP EAX ; recuperar flags en EAX
MOV ECX,EAX
XOR EAX,40000h ; conmutar bit 18
PUSH EAX
POPFD ; intentar cambiar este bit
PUSHFD
POP EAX ; ECX conserva el bit inicial
XOR EAX,ECX ; bit 18 de EAX a 1 si cambi
SHR EAX,12h ; mover bit 18 a bit 0
AND EAX,1 ; dejar slo ese bit
PUSH ECX
POPFD ; restaurar bit 18 de los flags
MOV ESP,EDX ; restaurar ESP
ST ; permitir interrupciones de nuevo
POP DX ; recuperar tipo de CPU en DL
CMP AX,0
JE cpu_hallada ; es 386: DL=7 (bit 18 no cambi)
NC DL ; es 486: DL=8 (bit 18 cambi)
JMP cpu_hallada
ni286ni_super: MOV DL,4 ; supuesto un 80188 ...
MOV AX,0FFFFh
MOV CL,33
SHL AX,CL ; (80188/80186 toman CL mod 32)
JNZ tipo_bus_proc ; ... lo es, calcular bus (188/186)
MOV DL,2 ; no lo es, supuesto un V20 ...
MOV CX,0FFFFh
ST
DB 0F3h,26h,0ACh ; opcode de REPZ LODSB ES:
JCXZ tipo_bus_proc ; ... lo es, calcular bus (V20/V30)
XOR DL,DL ; ya slo puede ser un 8088/8086
tipo_bus_proc: STD ; transferencias hacia arriba
LEA D,tipo_bus_dest
MOV AL,BYTE PTR DS:tipo_bus_byte ; opcode de ST
MOV CX,3
CL
REP STOSB ; transferir tres bytes
CLD
NOP ; el NC CX (1 byte) ser machacado
NOP ; con STOSB pero an se ejecutar
NOP ; en un 8086/80186/V30 (y no en un
NC CX ; 8088/80188/V20) porque est en la
tipo_bus_byte: ST ; cola de lectura adelantada.
tipo_bus_dest: ST
JCXZ cpu_hallada ; el bus ya era supuesto de 8 bits
NC DL ; resulta que es de 16
cpu_hallada: MOV AL,DL
XOR AH,AH
POP S
POP D
POP DX
POP CX
POP ES
POP DS
POPF
RET ; AX = CPU: 0/1-8088/86, 2/3-NEC V20/V30
procesador? ENDP ; 4/5-80188/186, 6-286, 7-386, 8-486
print PROC
PUSH AX
PUSH BX
PUSH CX
MOV AH,9
NT 21h
POP CX
POP BX
POP AX
RET
print ENDP
cpus_indice DW i88,i86,v20,v30,i188,i186,i286,i386,i486
i88 DB "ntel 8088 $"
i86 DB "ntel 8086 $"
v20 DB " NEC V20 $"
v30 DB " NEC V30 $"
i188 DB "ntel 80188$"
i186 DB "ntel 80186$"
i286 DB "ntel 80286$"
i386 DB "ntel 80386$"
i486 DB "ntel 80486$"
apuntador_txt DB " <---$"
texto_ini LABEL BYTE
DB 13,10,"CPU Test v2.2 "
DB "(c) Septiembre 1992 Ciriaco Garca de Celis."
DB 13,10," El microprocesador de este "
DB "equipo es compatible:",10
separador_txt DB 13,10,9,9,9,"$"
texto_fin DB 13,10,"$"
cpu ENDS
END inicio
3.3.6. - MODO PLANO (#LA*) DEL 386 Y SUPERORES.
Como ya se coment, no es estrictamente cierto que no se pueda rebasar el
lmite de 64 Kb en los segmentos en modo real. El problema es que al
encender el ordenador, el 386 tiene definidos por defecto dichos lmites de 64
Kb. Sin embargo, se puede pasar un momento a modo protegido, ampliar el
lmite y volver a modo real. Entonces se consigue el llamado modo %lat o plano.
No solo es factible de este modo saltar la restriccin de 64 Kb, sino que
adems se puede acceder directamente, desde el modo real, a toda la
memoria por encima del primer megabyte.
El problema es que pasar a modo protegido no es sencillo cuando la
mquina ya est en modo protegido emulando al modo real (el conocido como
modo virtual 86). Por tanto, el siguiente programa de ejemplo no funciona si
est cargado un controlador de memoria expandida (EMM386, QEMM) o
dentro de Windows 3.x. Arrancando sin controlador de memoria (excepto
HMEM) no habr problema alguno. El programa de ejemplo se limita a llenar la
pantalla de texto (empleando ahora la direccin absoluta 0B8000h a travs de
EBX) de letras 'A'.
Otra restriccin de este programa de ejemplo es que no activa la lnea A20
de direcciones; dicho de otro modo, el bit 21 (de los 32 bits de la direccin de
memoria) suele estar forzado a 0 por defecto al arrancar. Para acceder a la
memoria de vdeo esto no es problema, pero por encima del primer megabyte
podra haber problemas segn a qu direccin se pretenda acceder. De todos
modos, sera relativamente sencillo habilitar la lnea A20 directamente o a
travs de una funcin del controlador XMS.
Naturalmente, se sale de los objetivos de este libro describir el modo
protegido o explicar los pasos que realiza esta rutina de demostracin.
Consltese al efecto la bibligrafa recomendada del apndice.
; +------------------------------------------------------------------+
; | Rutina para activar el modo flat del 386 y superiores (acceso |
; | a 4 Gb en modo real). |
; | |
; | TASM flat386 /m5 |
; | TLNK flat386 /t /32 |
; +------------------------------------------------------------------+
.386p ; slo para 386 o superior
segmento SEGMENT USE16
ASSUME CS:segmento, DS:segmento
ORG 100h
prueba:
CALL flat386 ; activar modo flat
XOR AX,AX
MOV DS,AX
MOV EBX,0B8000h ; direccin de vdeo absoluta
MOV CX,2000
llena_pant: MOV BYTE PTR [EBX],'A'
NC EBX
MOV BYTE PTR [EBX],15
NC EBX
LOOP llena_pant
NT 20h ; fin de programa
; ------------ Esta rutina pasa momentneamente a modo protegido de
; manera directa (necesita la CPU en modo real). No se
; activa la lnea A20 (necesario hacerlo directamente
; o a travs de algn servicio XMS antes de acceder a
; las reas de memoria extendida afectadas).
flat386 PROC
PUSH DS
PUSH ES
PUSH EAX
PUSH BX
PUSH CX
MOV CX,SS
XOR EAX,EAX
MOV AX,CS
SHL EAX,4 ; direccin lineal de segmento CS
ADD EAX,OFFSET gdt ; desplazamiento de GDT
MOV CS:[gd2],EAX ; guardar direccin lineal de GDT
CL
LGDT CS:[gdtr] ; cargar tabla global de descriptores
MOV EAX,CR0
OR AL,1 ; bit de modo protegido
MOV CR0,EAX ; pasar a modo protegido
JMP SHORT $+2 ; borrar cola de prebsqueda
MOV BX,gcodl ; ndice de descriptor en BX
MOV DS,BX ; cargar registro de segmento DS
MOV ES,BX ; ES
MOV SS,BX ; SS
MOV FS,BX ; FS
MOV GS,BX ; GS
AND AL,11111110b
MOV CR0,EAX ; volver a modo real
JMP SHORT $+2 ; borrar cola de prebsqueda
MOV SS,CX
ST
POP CX
POP BX
POP EAX
POP ES
POP DS
RET
gdtr LABEL QWORD ; datos para cargar en GDTR
gd1 DW gdtl-1
gd2 DD ?
gdt DB 0,0,0,0,0,0,0,0 ; GDT
gcod DB 0ffh,0ffh,0,0,0,9fh,0cfh,0
gcodl EQU $-OFFSET gdt
gdat DB 0ffh,0ffh,0,0,0,93h,0cfh,0
gdtl EQU $-OFFSET gdt
flat386 ENDP
segmento ENDS
END prueba
EL HARDWARE DE A$O'O AL MICRO$ROCESADOR
En este captulo se mostrar detenidamente el funcionamiento de todos los
chips importantes que lleva el ordenador en la placa base y alguno de los
colocados en las tarjetas de expansin.
NotaF $or l"m"tac"one! t=cn"ca!B al e!cr"8"r lo! c"rc0"to! "nte4rao!
la! !eOale! <0e !on act"2a! a n"2el 8a@o no tenrPn la tra"c"onal 8arra
ne4aora enc"maQ en !0 l04ar a(arecerPn (rece"a! el !"4no meno!F
-CSB -WRB -MEMRB ...
En algunos casos, acceder directamente a los chips no es necesario: en
general, es mejor dejar el trabajo al DOS, o en su defecto a la BOS. Sin
embargo, hay casos en que es estrictamente necesario hacerlo: por ejemplo,
para programar temporizaciones, hacer sonidos, comunicaciones serie por
interrupciones, acceso a discos de formato no estndar, etc. Algunas veces
bastar con la informacin que aparece en el apartado donde se describe la
relacin del chip con los PC; sin embargo, a menudo ser necesario consultar
la informacin tcnica del apartado ubicado inmediatamente antes, para lo que
bastan unos conocimientos razonables de los sistemas digitales. Los
ordenadores modernos normalmente no llevan los integrados explicados en
este captulo; sin embargo, poseen circuitos equivalentes que los emulan por
completo.
/.1. - LAS CONE-IONES DEL *+**.
Resulta interesante tener una idea global de las conexiones del 8086 con el
exterior de cara a entender mejor la manera en que interacciona con el resto de
los elementos del ordenador. Se ha elegido el 8088 por ser el primer
procesador que tuvo el PC; a efectos de entender el resto del captulo es
suficiente con el 8088.
El 8088 puede trabajar en dos modos: mnimo (pequeas aplicaciones) y
mximo (sistemas multiprocesador). Los requerimientos de conexin con el
exterior cambian en funcin del modo que se decida emplear, aunque una parte
de las seales es comn en ambos.
LCNEAS COMUNES AL MODO MR-IMO ' MCNIMO DEL
*+**.
AD7..0:
Address Data Bus. Son lneas multiplexadas, que pueden actuar como bus de
datos o de direcciones, evidentemente en tiempos distintos.
A15..8:
Address Bus. En todo momento almacenan la parte media del bus de
direcciones.
A19..16/S6..3:
Address/Status. Parte alta del bus de direcciones, multiplexada: cuando no salen
direcciones, la lnea S5 indica el estado del bandern de interrupciones; las
lneas S4:S3 informan del registro de segmento empleado para realizar el
acceso a memoria: 00-ES, 01-SS, 10-CS, 11-DS; S6 no se usa.
-RD: Read. ndica una lectura de memoria o de un dispositivo de entrada/salida.
READY: Ready. Lnea de entrada que indica el final de la operacin de memoria o E/S.
NTR:
nterrupt Request. Lnea de peticin de interrupciones enmascarables; el 8088 la
observa peridicamente.
-TEST:
Test. En respuesta a la instruccin mquina 5AI* (no TEST!), el 8088 se para a
comprobar esta lnea hasta que se ponga a 0.
NM:
Non-maskable nterrupt. Lnea de peticin de la interrupcin de tipo 2, que no
puede ser enmascarada.
RESET: Provoca una inicializacin interna que culmina saltando a FFFF:0.
MN/-MX: Esta lnea indica si se trata de un sistema mnimo o mximo.
LCNEAS E-CLUSIVAS DEL MODO MCNIMO DEL *+**.
O/-M:
Status Line. ndica si se trata de un acceso a memoria o a un puerto de entrada/salida.
No es vlida todo el tiempo (solo a ratos).
-wr:
Write. ndica una escritura en memoria o en un dispositivo de entrada/salida (segn el
estado de O/-M).
-NTA:
nterrupt Acknowledge. Es la seal de reconocimiento de interrupcin (solicitada a travs
de NTR o NM).
ALE:
Address Latch Enable. ndica al exterior que las lneas de direccin contienen una
direccin vlida, con objeto de que la circuitera externa la almacene en una pequea
memoria (latch). Seal necesaria slo por culpa de la multiplexacin.
DT/-R: Data Transmit/Receive. Seal necesaria para emplear un transceiver 8286/8287 en el
bus, con objeto de controlar el flujo de datos a travs del mismo (si se recibe/transmite).
-DEN:
Data Enable. Necesario tambin para emplear el transceiver: sirve como entrada de
habilitacin para el mismo.
HOLD:
Hold. Lnea de entrada para solicitar al 8088 que se desconecte de los buses. Empleada
por los controladores de DMA.
HLDA:
Hold Acknowledge. Lnea complementaria de HOLD: el 8088 enva una seal de
reconocimiento cuando se desconecta del bus.
-SS0:
Status Line. Lnea de apoyo que, junto con O/-M y DT/-R, permite determinar con
precisin el estado del bus:
O/-M DT/-R -SS0 Estado del bus
------- ------- ------- ------------------------------
1 0 0 Reconocimiento de interrupcin
1 0 1 Lectura de puerto E/S
1 1 0 Escritura en puerto E/S
1 1 1 Estado 6alt
0 0 0 Acceso a cdigo
0 0 1 Lectura de memoria
0 1 0 Escritura en memoria
0 1 1 nactivo
LCNEAS E-CLUSIVAS DEL MODO MR-IMO DEL *+**.
-S0/-S1/-S2: Status. Estas lneas indican el estado del bus:
-S2 -S1 -S0 Estado del bus
------- ------- ------- ------------------------------
0 0 0 Reconocimiento de interrupcin
0 0 1 Lectura de puerto E/S
0 1 0 Escritura en puerto E/S
0 1 1 Estado 6alt
1 0 0 Acceso a cdigo
1 0 1 Lectura de memoria
1 1 0 Escritura en memoria
1 1 1 nactivo

-RQ/-
GT0..1:
Request/Grant. Estas patillas bidireccionales permiten a los dems procesadores
conectados al bus forzar al 8088 a que libere el bus al final del ciclo en curso.
-LOCK:
Lock. Lnea que sirve al 8088 para prohibir el acceso al bus a otros procesadores
(se activa tras la instruccin mquina LOCK y dura mientras se ejecuta la siguiente
instruccin -la que sigue a LOCK, que es realmente un prefijo-). Tambin se activa
automticamente en los momentos crticos de un ciclo de interrupcin.
QS1/QS0: Queue Status. Permite determinar el estado de la cola de instrucciones del 8088.
DI>ERENCIAS IM$ORTANTES CON EL *+*..
El 8086 cambia el patillaje sensiblemente, aunque la mayora de las seales son similares.
En lugar de 8 lneas de datos y direcciones multiplexadas (AD0..7) el 8086 posee 16, ya que el
bus de datos es de 16 bits. Existe una lnea especialmente importante en el 8086, -BHE/S7
(Bus High Enables/Status), que normalmente indica si se accede a la parte alta del bus de
datos o no (operaciones 8/16 bits). El 8086 posee una cola de instrucciones de 6 bytes, en
lugar de 4.
>ORMATO DE LAS INSTRUCCIONES DEL *+*..
Resulta absurdo estudiar la composicin binaria de las instrucciones mquina de ningn
procesador; en los casos en que sea necesario se pueden ver los cdigos con alguna utilidad
de depuracin. Sin embargo, a ttulo de curiosidad, se expone a continuacin el formato
general de las instrucciones (aunque hay algunas excepciones y casos especiales).
El cdigo de operacin ocupa 6 bits; el bit D indica si es el operando fuente (=0) el
que est en el campo registro (REG) o si lo es el operando destino (=1): la ra!n es que
el "0"6 s!lo admite un operando a memoria# como muc$o (o el fuente# o el destino# no
los dos a la %e)& El bit W indica el tama'o de la operaci!n (b(te)palabra)& MOD indica
el modo de direccionamiento: 00*sin desplaamiento (no e+iste campo de
desplaamiento)# 01*desplaamiento de " bits# 10*desplaamiento de 16 bits ( 11*
registro (tanto fuente como destino estn en registro)& El campo REG indica el registro
in%olucrado en la instrucci!n# que puede ser de " ! 16 bits (seg,n indique -): 0*
./).0# 1*1/)10# 2*3/)30# 4*5/)50# 6*78).9# :*58)19# 6*7;)39# <*3;)59; en el
caso de registros de segmento s!lo son significati%os los dos bits de menor peso: 00*E7#
01*17# 10*77# 11*37& El campo R/M# en el caso de modo registro (=>3=11) se
codifica igual que el campo REG; en caso contrario se indica la forma en que se
direcciona la memoria: 0: ?5/@7;@despA# 1: ?5/@3;@despA# 2: ?58@7;@despA# 4:
?58@3;@despA# 6: ?7;@despA# :: ?3;@despA# 6: ?58@despA# <: ?5/@despA&

También podría gustarte