Вы находитесь на странице: 1из 53

ASSEMBLER

DESDE CERO
e
, , ~

INTERRUPCIONES -i.. .
. ....

,~- '

. ~
" . . ,.:.
.. r .
MARI O CARLOS GINZBURG
INGENIERO ELECTRONICO (UBA) '
\

DIRECTOR DE LA CATEDRA DE "ESTRUCTURA


DEL COMPUTADOR" E INVESTIGAD OR EN LA
FACULTAD DE INGENIERIA DE LA
UNIVERSIDAD DE BUENOS AIRES
A Piyi, Jernimo y Rafael

A mis alumnos

- ...ll~i ::: . .

/NTRODUCCION GENERAL A LA INFORMATICA:


3 ASSEMBLER DESDE CERO

M.C.Ginzburg

Es propiedad - Queda hecho el depsito que marca la ley


Impreso en la Argentina - Printed In Argentina

DERECHOS RESERVADOS 2000

I.S.B.N. 987-43-2203-9

Impreso en talleres prensa & acabado, Concepcin Arenal 4866, Capital Federal
en el mes de agosto de 2000

No se permite la reproduccin total o parcial de esta obra, ni el almacenamiento en un sistema de informtica,


ni transmisin en cualquier forma o por cualquier medio electrnico, mecnico, fotocopia, registro u otros
medios, sin el permiso previo y la autorizacin escrita del autor.
INDICE

UTILIZACION DEL LENGUAJE ASSEMBLER .. . .. . ...... . ............................ 1

--REGISTROS DE LA UCP A UTILIZAR .. -..... . ...... .. .................... .....- ~- ~ . . .. . . 1


. i . ~- . ~ .. .. . ... ). .
EJERCICIOS .......... ........ ... . . . .................. .... ....... . .. ... ..... . 2
EJERCICIOS DONDE SE DEFINEN INSTRUCCIONES DE SALTO......... ...... ...... 4 a 8
EJERCICIO CON UNA LISTA (VECTOR) .. . ...... . ... . .... , ....... . ........ . .... 9
EJERCICIO DONDE SE DEFINE LA INSTRUCCIN DE COMPARACIN Y DOS LISTAS 1O
EJERCICIOS CON NUEVAS INSTRUCCIONES DE SALTO ........ . . ................ 12 a 15
EJERCICIOS CON SUMA DE NUMEROS NATURALES Y ENTEROS DE UNA LISTA .. ... 16 a 17
EJERCICIO CON TRES LISTAS........ .... ..... .. ........... .. ........ ....... . 17
EJERCICIO PARA VERIFICAR MEMORIA Y EXTENDER SIGNO.......... . ..... . .. . 19
EJERCICIO CON MODO INDIRECTO POR REGISTRO CON DESPLAZAMIENTO
MEDIANTE REGISTRO Y EJERCICIO CON DIVISIONES . . . . . . . . . . . . . . . . . . . . . . . . . 20
EJERCICIO CON USO DE INSTRUCCIONES AND, ROL ~ OR . . . . . . . . . . . . . . . . . . . . . . . 22
EJERCICIOS CON REORDENAMIENTO DE LISTAS . ...... . . ... .. .. .... .. ...... .. 23 a 26 .
EJERCICIOS DE MULTIPLICACION Y DE SUMA EN BCD ............. . .. .. ....... 25
EJERCICIO PARA OBTENER RAIZ CUADRADA .. . ... . ...... . ... . ..... . ... . ... . 27.
EJERCICIOS .P ARA MULTIPLICAR ENTEROS ... .. . ... . .... .. . .. . . . ....... . .... 28 .. ...
~ ;

DIRECCIONES EFECTIVAS Y REGISTROS DE SEGMENTO ... . ... .. .... ... . ...... 29 a 30


LLAMADOS A SUBRUTINAS Y USO DE LA PILA .......... ............... ....... 31 a 38
PASAJE DE PARAMETROS .. .. . ............ . .. .. ..... ... . .. . .. .. . ... . . .... . 36 a 37
INTERRUPCIONES POR SOFTWARE (INSTRUCCIN INT) .. .. .. . . . . ............. 39 a 41
INTERRUPCIONES POR HARDWARE .. ... ... . . . . ......... . . . . . ...... . ... . ... 41
MNEMONICOS DE LAS INSTRUCCIONES MAS USADAS . . ..... . ... .. ... . ... . .... 43

CUSPIDE


Av. Gral. Paz 57
PROLOGO

Esta corta edicin previa sali a pedido de los alumnos, dada la inexistencia de textos que expliquen
en forma progresiva la enseanza del Assembler.
Se trata en realidad de la mitad del texto final de la Unidad 3, que usa el programa _Debug del DOS
para ensamblar los programas escritos en Assembler. El objetivo de esta mitad es que el alumno incorpore las
estructuras bsicas de programacin en Assembler, conozca las instrucciones ms comunes, maneje los flags
y se vincule con el hardware. Se trata de aportarle las "7 notas musicales", para que pueda combinarlas en.
estructuras cada vez ms complejas. Esto es, se definen los modos de direccionamiento bsicos que
combinados permiten operar cualquier estructura de datos.
Tambin se ha tratado que los ejercicios vayan progresando en complejidad.
No poda faltar el llamado a subrutinas con el consiguiente uso de la pila, instrucciones PUSH y
POP, y el pasaje de parmetros. Dado que tanto las interrupciones por hardware (mediante las lneas IRQ),
como las interrupciones por software (mediante la instruccin L.~ xx) son formas de llamado a subrutinas
(del BIOS o del sistema operativo), por extensin se tratan stas, indicando su proceso en detalle.
Si bien el Assembler est dedicado a procesadores de Intel (dada la facilidad de acceder al DOS
desde cualquier PC para practicarlo) los conceptos desarrollados pueden aplicarse a otros microprocesadores
y microcontroladores.

La otra mitad (en preparacin), a cargo del Ing. Carlos Robello, trata en esencia los nusmos
ejercicios desarrollados en la primer mitad, pero realizados con directivas para programas ensambladores ms
poderosos, como el T ASM y el MASM. Esta mitad se incorporar a la primera en una prxima edicin
completa.
De esta forma, el alumno primero se concentra en lo fundamental del lenguaje, para luego manejar
un Assembler de ms alto nivel, con mayores posibilidades y flexibilidad de programacin. Asimismo est
planeado agregar nuevos ejercicios ms complejos.
U3-1

UTILIZACION DEL LENGUAJE ASSEMBLER

Conviene aclarar que en nuestro pas se habla de programar en "assernbler'', siendo que en realidad el lenguaje se
denomina assembly. Assembler ("ensamblador"} es el programa traductor de assembly a cdigo de mquina, por Jo que
lenguaje assembly puede traducirse corno lenguaje "ensamblable" o lenguaje para ensamblador. Siguiendo la costumbre,
seguiremos llamando assembler al lenguaje simblico de mquina, y ensamblador al programa traductor citado.
Recordemos (Historia de la Computacin, unidad l) que el assembler fue el primer lenguaje simblico creado. Permiti
escribir programas desde el teclado de un computador (salida cdigo ASCII), Jo cual supona la existencia de un
programa ensamblador, para pasar los smbolos en ASCII a cdigo de mquina.
Cada modelo de procesador tiene su correspondiente lenguaje assernbler, y su ensamblador. Por lo gen<;.i:al. los nuevos
modelos de un mismo fabricanTu"conservan instrucciones en assernbler de modelos anteriores. As, un Pentium tiene, en
su repertorio de instrucciones en assembler. instrucciones del 80286, por razones de compatibilidad.
Si bien cada fabricante de microprocesadores define notaciones y aspectos parti culares para simbolizar in.strucciones en
assembler, con un poco de prctica no resulta difcil para quien sabe programar un determinado assembler;pasar a otro.
Dado que la mayora de las PC usa procesadores de Intel o sus clones, y que desde una PC se puede programar
cmodamente en assembler, desarrollaremos el assembler de lntel como lenguaje representativo.
En el presente, se programa en Assembler para distintas aplicaciones. Lo ms corriente quizs sea programar porciones
de un programa que necesitan ser ejecutadas en corto tiempo, siendo que la mayor parte del programa se desarrolla con
un lenguaje de alto nivel (C, Pascal, Basic, etc). Esto se debe a que un Compilador para CISC (unidad 1), al pasar de alto
nivel a cdigo de mquina genera cdigo en exceso, en comparacin con el obtenido a partir de assembler, lo cual
redunda en mayores tiempos de ejecucin de porciones de programa cuyo tiempo de ejecucin es crtico. Como
contrapartida, en general lleva ms tiempo programar en assembler que en alto nivel.
Tambin suele usarse el assembler para desarrollar manejadores de perifricos, y para controlar directamente el hardware,
dada la flexibilidad de este lenguaje. ..
El lenguaje assembler, por otra parte, es una herramienta imprescindible para dominaar a fondo el funcionamiento de un
computador, de modo de sacarle el mximo provecho.
.. , ' ~ , I
,l (t .

_ft~
. ~ .....
.... '"'-..t ~ .
~

. ,_
-:;.!". :
1

- ,..
i'.,.
, ....
- .-

... ,. .
.
UCP
...
r
16 bits 16 bits
~-------------- --- --------~--+

a bits a bits
AXI AH AL SI

sxl BH BL I, DI

\
cxl CH CL . IP
.,
l 1
.
r - - - - - .

oxl OH DL

Figura 3.1

En las unidades 1 y 2 se trataron distintos ejemplos que empleaban el registro AX, de 16 bits, de la UCP como
a~~rnulaci()r, y para operaciones d e entrada y salida. Este registro tambin e~. iri.disp~nsable usarlo cuando se
multipl_ica o div ic!e" segn se ve~~ Pero en la UCP existen otros registros de 16 bits que pueden elegirse
ingistintamente como acumuladores, como BX, CX y ,P~. {figura 3.1), que sern empleados en assembler a
partir .del ejercicio 3.
Tambin se dis pone en la UCP de l()S registros SI y DI para guardar exclusivamentt: direcciones que apunten
a p_gsic;;ipnes .de memoria (registros- p't.mt-erosfcorno se eje~plifica a partir del ejercicio 6
BX. es el nico acurnufad'or que tambin puede utilizarse como registro puntero (ejercicio 16).
- -- -:.>..: El registro IP (instruction pointer) es afectado por las instrucciones de salto (jurnp).
Si se n ecesita operar datos de 8 bits, los registros de 16 bits: AX, BX, CX o D X (o sea Jos terminados en X), pueden
dividirse en dos registros de 8 bits. Por ejemplo, AX se descompone en AH y AL ; BX en BH y BL, etc.
~. 'J ;:. Las. let~a~ H (de "high"), y!:-.(de '.'low") hace11 ref~xenc:i~ .C! ~- par.te .<\lt!\ y b9ja de.un registro. de .16.bits.
U3-2

Entonces, en assembler, ~~ando se necesita definir un registro para datos o resultados de 16 bits, el mismo tendr
s_I:!- segunda letra terminada en X; y en caso de ser necesario em_plear un registro para datos o resultados de _8 bits,
se usar una mitad del mismo, la cual se identificar por ser su segunda letra una H o una L, segn se elija.
\J l En los procesadores 386, 486 y Pentium, los registros citados pueden tener 32 bits, indicndose EAX, EBX, . .. ,
~.... ! EDI, ESI, EIP. La letra E hace referencia a "extended". Did-.os registros tambin pueden elegirse para guardar 16
. u 8 bits, mediante la simbologa antes definida. El Debug slo permite definir registros de 16 11 8 bits.

EJERCICIO 1
Es-cr-ii'.)ir.e assembler las instruccigug_~nec.;esaria.s para codificar la operacin ,~_=:: P + P - Q
Suponer que, como en la pgina 31 de la ~dad I, las variables R; P y Q estn en las direcciones 5010, 5000 y
5006, respectivamente, y que son magnitudes.

Razonando de igual forma que en la Unidad I, se debe tambin tener siempre presente en assembler el
esquema del calculador de bolsillo, en el cual los datos estn en su memoria, y los clculos se efectan usando
c-qn:io acumulador el visor. Segn se explic, en un computador tambin por un lado_se tiene los datos en
memoria, y por otro lado se tiene el procesador (supuesto de Intel en esta obra). Como se describi, en este
ltimo, se encuentran distintos registros que pueden ser usados a eleccin como acumuladores, designados
AX, BX, ex y DX.
Usando el programa Debug para codificar en assembler, es necesario partir siempre de una asignacin de
direcciones de las variables (datos) en memoria, o sea suponer : que previamente estn escritas en
determinadas direcciones de memoria, pues dichas direcciones (en general arbitrarias) son las que usaremos
directamente en assembler para identificar variables en las instrucciones que escribiremos.
En este caso se asume que las variables se encuentran en las direcciones 5010, 5000 y 5006, segn se enunci.
Mediante el comando A del Debug se pueden escribir programas en assembler. Al lado de la letra A se debe
colocar la direccin (en general arbitraria) a partir de la cual se quiere escribir el programa. A Jos fines de
continuidad con la Unidad I, usaremos la misma direccin (0200) para comienzo del programa. En otros
ejercicios posteriores hemos elegido arbitrariamente la direccin 0100.
Escribiremos a continuacin en assembler, para el Debug, las 4 instrucciones que se corresponden con 1, a I, de
la pgina 31 citada.

A 0200 .J i .
xxxx:0200 MOV AX, [5000] .J Llevar a AX una copia del dato (P) que est-en 5000 y 5001 de la memoria
1
xxxx:0203 ADD AX, [5000) .J Sumar a AX una copia del dato (P) que est en 5000 y 5001 de la memoria.
xxxx:0207 SUB AX, [5006] .J Restar a AX una copia del dato (Q) que est en 5006 y 5007 de la memoria
xxxx:020B
xxxx:020E
MOV [5010], AX .J
.J
Transferir a 5010_y 5011 de memoria una copia del contenido de AX
(Se vuelve a pulsar .J para salir del comando A)
i
1
(El guin ind ica que el Debug espera otro comando)

-.,,, Con xxxx se han querido indicar 4 smbolos hexadecimales, cuyo valor puede ser distinto en cada PC.
.. ;::~.:,;. Lo.s corchetes que aparecen en las instrucciones del assembler de Intel, indican posiciones de memoria.
..' Cuando una instruccin tiene un nmero entre corchetes Sl! dice qu~ est n. ~;iiiodo diTecto;',)_ermodo de
e : direccionamiento directo, siendo que directamente as se d_a la d.i!:.c~j?n_'f>ar.a 105 _a lizar en memoria el dato a
procesa( -- ---- ,.. -- - -- -
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

En Ja figura 3.2 aparece un diagrama lgico, que es conveniente


~-AX--
_-.-
[5_
0_00_l_0_1]~ AX= 1020 realizar antes de codificar en assembler. El mismo tambin
muestra los valores que ira tomando AX durante el proceso. Con
AX- AX+ [5000 /01] AX= [5000 /01 ] se quiere indicar los valores contenidos en las
2040
posiciones de memoria 5000 y 5001 (dos bytes de informacin).
A la derecha de cada rectngulo aparece el valor que tendra el
AX ~--- AX - [5006 /07] AX=OOOO registro o posicin si se ejecutara la instruccin.
Luego de tipear una instruccin en assembler, y de pulsar
[5010 /11] .._ AX [SOlO/ll]=OOOO "Enter" (.J), el programa traductor Ensamblador (que viene con
el Debug) traduce los caracteres de la instruccin en assembler
Figura 3.2 (que estn en ASCII), en el correspondiente cdigo de mquina.
As, a partir de la direccin 0200 la instruccin MOV AX, [5000]
queda codificada como A10050, segn aparece en la pgina 31 de la Unidad I. Puesto que el Debug ahora sabe
q--dicha instruccin ocupa 3 bytes, luego del. Enter escribir automticamente xxxx:0203. Esto m ismo se
repite con cada instruccin.
03-3
En definitiva, despus de tipear las 4 ins trucciones, en memoria quedar la secuencia de cdigos de mquina
indicada en dicha pgina 31, no quedando rastro alguno de lo tipeado en assembler. De esta forma, se evita
tener que escribir con el comando E todos los cdigos de instruccin, como se hizo en la Unidad I, p gina 34.
Debe notarse que en lugar del registro AX podramos haber usado BX, CX o DX; slo hubiesen cambiado los
cdigos de mquina de las instrucciones.
! Si se quiere ejecutar las instrucciones . de la secuencia anterior escrita en assembler, primero Sl' debe dar
valores a las variables en las direcciones, mediante el comando E, como se hi zo en la pgina 33 de la Unidad l.
i , Lt1ego se debe proceder conforme a Jo rea lizado de la pgina 36 a 39 de la Unidad l.
\ \ En cualquier momento que se quiere verificar si la secuencia a ejecutar o en ejecucin es la correcta se usa el
-:..;_
comando u seguido por la direccin donde comienza la secuencia: ~ "'!'
n 0200 ..J.
( xxxx:0200 Al0050 MOV AX, [5000]
xxxx:0203 03060050 ADD AX, [5000]
xxxx:0207 28060650 SUB AX, [5006]
1
1
xxxx:020B A31050 MOV [5010], AX

Los puntos suspensivos indican otras instrucciones que arroja el comando U, pero que no interesan .a nuestro
problema. Son "basura". Este comando realiza lo que se d enomina "disassembler" o " un assembler". Esto es,
a partir de la dirccin dada (0200 en este caso) interpreta los cdigos de mquina de un programa en sus
correspondientes instrucciones en assembler, efectuando el proceso contrario al que realiza el programa
traductor Ensamblador.
Los conceptos hasta ac vertidos sirven para todos los ejercicios planteados.
.

. i.,~. . . ..l
EJERCICIO 2 .!;1- \ . . 'J.,; .
. " ..
Escribir una secuencia para realizar la suma R = M + N de dos nmeros enteros qe :f2 bits ("J ~.-,~.,,
~ "
~ . \l _... ..,... ,.. ~ ... ~ _... "' ' -,. ,,
integers"), d ado que mediante ADD.AX, [xxxx] slo puden sumrse dos nmeros ae 16 bits
1


Los valores de M y Nen decimal son: ~ =- 2.650.000
. .
y ~ 3.250.876
,1
! _:~ ~~-. 'F ~
o\ \.. ...

A continua cin se indican los valores de. las var"iables c~n bit de signo, como los dejara e~ memori a un
programa traductor. Con fines didcticos ~an sido sumados y expresados en hexa.
C=l ..w
M = 11111111110101111001000001110000 = FFD790 7 O
N = 00000000001100011001io1010111100 = 00 319ABC
R =M+N = 100000000000010010010101100101100 10009 2B2C
.J, .J,
szvc szvc
0001 0011
~

2000 70
o---
1 90 ~-AX - _0_0_0_I0_1_] _~
_ _---._[2 AX= SO?O
. 2002 07
3 FF AX - - AX + [2008 /09] AX=2B2C
szvc
2008 BC .___
[2__
1
0_/~1 _
1
]_ __- AX
_ _ _, (2010/1 1]=2B2C
9 9A
200A 31
B 00
~-AX
__-_ _ [2_
0_02_1_0_3]_~1 A X=FFD?
AX--- AX + [200A/OB] + C AX=OOOS
zvc
2010
1
2012
3
} .__[_2_
1_2_1_1_31__-__AX
_ ___, [2012113]=0009

Figura 3.3
U3-4

Los nmero M y N de 32 bits sern los datos para el programa a desarrollar. Separados en dos grupos de 16
bits se sumarn en forma fraccionada, habindose indicado en negrita los que se sumarn primero.
..Se supone una UAL como la del 80286, que slo puede puede sumar hasta dos nmeros de 16 bits cada uno.
E_sto es, el programa sumar primero los 16 bits menos significativos de M (arbitrariamente escritos en las
direcciones 2000 y 2001 como se indica en Ja figura .3 ..3 con los de N (en las direcciones 2008 y 2009), y
almacenar los 16 bits del resultado parcial obtenido en las direcciones 2010 y 2011 (que despus de ejecutarse
el programa debern contener 2C y 2B, respectivamente, como se deduce de la suma anticipada realizada con
fines didcticos)
Luego se sumarn los 16 bits superiores de M (localizados en 2002 y 2003) con los correspondientes de N (en 200!
y 2008), a los cuales se les adicionar el valor O 1 con que resulta el carry C generado de Ja suma de los 16 bits
de la mitad inferior (en nuestro ejempo result C=l, como se indica en laStt'~~'idctica). t:I i~ultado dela
sma de la mitad superior (que en hexa deber ser 0009) se guardar en 2012 y 2013, a continuacin de donde
estarn los 16 bits de la suma de la mitad inferior. Estos pasos se indican en el diagrama lgico de la figura 3.3
Arhitraria~ente escribiremos en assembler la secuencia a partir de la direccin 0100, existiendo corresponden-
cia entre los 6 pasos del diagrama lgico y las 6 instrucciones siguientes:
AlOO
xxxx:OlOO MOV AX, [2000] Llevar a AX una copia del dato que est en memoria en 2000 y 2001
xxxx:0103 ADD AX, [2008] Sumar a AX una copia del dato que est en memori en 2008 y 2009
xxxx:0107 MOV [2010], AX Transferir a 2010 y 2011 de memoria una copia del contenido de AX
xxxx:OlOA MOV AX, [2002] Llevar a AX una copia del dato que est en memoria en 2002 y 2003
xxxx:OlOD ADC AX, [200A] Sumar a AX copia del dato que est en 200A y 200B ms Carry anterior
xxxx:Olll MOV [2012], AX Transferir a 2012 y 2013 de memoria una copia del contenido de AX

La instruccin ADC ("Add with Carry") es distinta de ADD, pues ordena sumar a AX el contenido de dos.
posiciones consecutivas de memoria (200A y200B) ms el valor que tena el flag C de carry antes de ejecutar
la instruccin. Puesto que una instruccin tipo MOV, corno MOV [2010], AX, no cambia ningn flag. el valor
de C es el proveniente de realizar ADD AX,(2008].
Podemos decir que la secuencia anterior duplica por software el formato con que opera una UAL de 16 bits
(hardware) en una suma rnultibyte.

EJERCICIO
. -. ....... - ... . . . 3: .. uso de
'" . - " .
una- i nstruccin
' . .
de salto
. .
condicional
. - ..
(conditional
.. . ..
jtlmp)
. . .. ... . .
~-

Emplearemos un_a h1strucdn de salto condicional para repetir la ejecucin de una secuencia ..
Esta_estructura ser u_sada repetidamente_en la mayora los ejercicio~. de

La usaremos para . realizar el pro~uct() R -= M x N, repitiendo..:r.:( veces un procedimiento que
consiste en una s_urn.a. Lo hacemos por razones didcticas, dado que en el presente los micro-
procesadores poseen instrucciones para multiplicar y dividir mediante una sola instruccin.
Efectuaremos R = M x N = O + M + M + . . . . + M sea mediante N sumas con sumando M.
E-i.m ac. muladgr; qu_e pifmero.se pone en O, iremos registrando los resultados de las sumas sucesivas.
1
A fin de que resulte una secuencia sencilla, supondremos: que M y N son nmeros enteros positivos de dos
byte~, ql1e i,j'; O, y q~e es el ~esultado R $ 32767. L~ego se ver como detectar si se supera este mximo
2

Ej~~pJifiqu~~;-s _e l p~og~~~--ad.e.s.~~Y0Ilar:,a.~1a:?peraciri...M: xN ~3 x 4 = (11x100)~, a efectua~~~ -~omo


R = M .x N = O + 11 + 11_+. 11 + 11 (N = 4 sumas con el sumando M = 11 5 )

Asignaremos (figura 3.4) a Ja variable M (con valor 0003 H) las direcciones de memoria B300 y B301; y a la
variable N (con valor 0004 H) las direcciones B310 y B31 l. Se ha reservado para el resultado R la B320 y B321.

Los nmeros enteros se tratan en la Unidad 4 de esta obra.


Otras limitaciones que tendr la secuencia a desarrollar, es que si M=O, si bien el resultado ser P=O, se repetir el lazo N veces.
Surge as la necesidad de un programa ms genrico, capaz de detectar desde su inicio si M 6 N valen cero. se asigne inmediatamente a
Iavariable R el valor O. Esto podr concretarse luego de que definamos la instruccin comparar. En este ejemplo se ha buscado la
simplicidad didctica en lugar de la rigurosidad.
U3-5

8300 Conforme a las instrucciones conocida_s, una_secuen~ia_p3:ra _r~aliz~_r. l\!..~~~~~~tidas seria:


1 MOV BX, [B300] Llevar a BX una copia de M que est en 8300 y 8301
SUB AX, AX _Poner acurnula_d or AX en
cero, restnc!9lo des{ ~f!\O_
[~pti_\X,_ B~ . Sumar a AX una copia del. valor de BX = M
8310 04 N veces ADp A~t.-~2' Idem
1 00 ADD ADD AX, BX Idem

LADD AX, BX En AX est el resultado


. ,l R. ,.. > MOV [B320J, AX s:.:~:gn elr""ul~ado a R, que est en 8320 y 8321 -~f'
. La nica instruccin nueva es SUB AX, AXusada para llevar_el_ ~~~s~~,A.X a c_~r,o po z;i~srnC?____ ~ $ .,,,
Figura 3.4 pliei nacerse
'
para limpiar
.. _. ,_ ...
cualquier
. ....
registro).
..
Tambin existen otra~ formas
de hacerlo.
. , _ . . . . . . . . . -- -- ----- " -- --- ~--- -- l
. 1
,..--------------------------------------------, . ;~-- ,_,
<;,~do_ .!:!.l d!!:t~ a _9perar_no,,~!~.~~~~~~?~..~i~o __!:?,!l,~. r!:!g~_tr.9. de __la~_Y\=~'.-~L~C?.99.. de~cfu:~Ssi.Q..Il~.!!!ien..!_9...!:
g~nqqi.in~ "modo registre;(

~ fin d~. ~y_i_ta,r es_~i:~J,i!_ r:-J vec_e_s ADD AX, BX se construir (ver secuencia siguiente en a::;sembler) un lazo
~.E'.P~ti.~!V?_.con~rolable, g~e obligue ~ ej:c~t~r !-J v~ce5- _dicha instrucci.n _esc_i:i~a u_11_~. ~~la_ vez, ~on la ayuda de ;
fio~_instr~c;ciones ~i:~vas~ D~<; CX .Y JN~ .Gump if not cero), qui:_ aparece~ en la _s_ecuen~ia. ~,s:_tjta. P!eYi!'lp:le..~t~,
m~qia~t~. MQV C)(~ W3~Qj-~_e_~~a-rg~ra.. ~-~.X. un~ c.OP-!a _d l\J, para co_ntar las N veces que se eje:l.!tar_ el l~zo,
\'.!llo.r que disminuir cada vez que se_ejecute DEC CX, instruccin en modo registro, que ordena decrementar
'.:.J. (di.~rni11uir ~n uno} ~l valoi:.c:l..e .f.)$.:_
~[E[~'!n..! ~,1!!~s.e !t~a el reg_istro ac~1.m_11La.d.9_r._f~ .P~r.~-~P.'!:f_!:_o}'}!.lll:~_!!!c_e_~. q!_!!!.s~r.cJ_eb,_e_ r_~p~_ti!.. ~!.UJ.~Aq_: ~----------
En definitiva, una secuencia en assernbler puede ser: ' C)/~- ,. .
.. - - '~~~;>;r
AlOO. .: t ,( "
xxxx:OlOO MOV ex, [B310] Ll!'!YaS.-.CXur:ia copia de N q'l,le est en B310 y B311 .
~J.<;xx:QlO~.. N.cqv"Bx, tli3001 Llevar_a BX una copia de M. q':1e est_ en B300 y B301
xxxx:0108 SUB AX,AX Poner acumulador AX en cero, restndolo de s mismo
xxxx:OlOA AD_DAX,BX Sumar a AX el valor. de M que est en BX ..-~ . . . . " _, ..
X))f<X.:O!QC . o~_c f:X Rf'.star uno -~ex (con lo cual pueden cambiar los fla~ SZVC) . .....<;_;?-,;
xxxx:OlOD JNZOl~~ S_i l~go de.la-ffistiucc:l_r\ ariterfor 09. (~X ri~~~~o) satf" ~JHQ_~ . ' '
xxxx:OlOF MOV [}J3201. AX Llevar
.. a B320
.
y B321
.. - , de....memoria,
. . ... . .una
..... copia
..... del'
--~-.. ,valor
.......de AX
- ~

xxxx:Oll2 INT20 Instruccin de final .


, '2.
Como se observa en el diagrama lgico de la figura 35,
ex ..- [83101111
el _procedimiento bsico que se debe repetir N veces
consiste en este caso en la instruccin ADD AX~ Bx:
~8_X_..._- --.....[8_3_0_0_I0_1_)_, BX=0003 (~.~a..v~z _ qe s realiza e~ta ' ~'r!ia, la, _~pera~ci!1~sigw~nte
des:uenta uno aJ cont~nido del registro _ ex .(que
inicialr:nente es N); y la _operacin subsiguiente determina
si el nmero contenido en ex alcanz o no el valor cero." ..
fyfientras ("while") este nmero en ex no sea cero (not
AX - - AX+ zero = NZ), o sea mientras l rsulfado -de "resfa-i O..a
ex
-
le .corresponda
2 .
la indicacin'
Z=O (condicin
, ..
de salto - ~
de JNZ) , se salta a ejecutar nuevamente la instruccin
~DD AX, BX de comienzo de la secuencia que se debe
repetir. La -~irec:_cin de esta instruccin a la qu!! _s,~
! V quiere saltar es el n__mero que aco~P.!~l~~
En definitiva, lH,__.t.r,s,~!"i!,.SSJ9!1-._c?~~aJ!!,L.~.LresulE,do
IF anterior no es cero, que en assembler se escribe JNZ
~[_B_32__1_2 1~l_..-_ _AX_~I [83201211=0012 hhhh, ordmcisaltar-a fa- ; 51;.CCi611 dedireCTilhhh
~i~ . ~i z~o -(~~~~--~o); ., cas; -~;;;~;~-- ('z.~1) -- ~~de1;;
1
o tr -i'i-oii' la fiisticcili..q1i'"s'igfrcra1Nz~ --- --- - ---~

-- _
(cierto)
...-... _._.,.que
8
____Z=O, y que si es falso que Z=O ordena
.,.____ ....... ---- ...____ . .. . -- -- - .. . - ,.. . . .. .....
...:; . ...
t~mbin. puede .decirse~ qe-JNZ-'hnfi0rdena saltar
Figura 35 a a 'instruccin de direccin hhhh si es verdadero
continuar. con....la instruccin
.. - . . .
que ...sigue a . JNZ
' - .

j;_$ta... inst~c:.cin noconv!ene ejecutarle rneqi:n:ite e[ 9.9.m~nl9 J.del Debug, pues pu e.de. hacer pe~der el programa tipea!Q,
N9 q>nfundirel hecho de. que un resultado no sea cero (NZ), con la indicacin del flago para ese caso: Z=O que significa Zero no
Tene~ presente que cuando un resultado .si s cero, .eiflag es Z,;, l .(z~ro si), como se expli.c a en la ~ni dad 4 de'es.ta obra. .... . - . . . . .
---- -- --- .. .... - -- ---- ..... . - . . - ..... ... -- ... . . . .. - . - .. -- .. - . .... . ., - ...
U3-6

Al _!~9_<.>_ ci~--c~~Aa rectng~o ~e_l diagr~ma lgic_C?Jf!g~~(l ~:~)se in~i~a _e l co_i:t~n.~~-~~e! _lugar ~e destino para la
EE~-~.e:~ .t;jecu~!?~ d_~ lil:~ instru:ci~nes del lazo.
~C?SP.l!s de realizar N veces el lazo, el contenido de CX, que era N, se le habr restado N veces uno. La
!tima resta que efectuar la UAL con el vaior de CX ser 1-i' =O, con
lo cual ser Z=l , en correspondencia
con G.X.~9..:... . - -
En consonancia se habrn realizado N sumas.
A.estaitilla-deTproceso; el__si"giente salt on la condicin que sea Z=O no se realizar, por no ver ificarse esa
co_f!9.t~i_9n, _ y)a Sf?C~encia continuar cm~__MOVJB320], AX _escrH~ a_con~in:i~~j!1-. -
En este ejemplo, con N=4 se ejecutar 4 veces el lazo, realizndose en cada oportunidad las siguientes
operaciones-qi:1!:!0.rdenarn las instrucciones- dadas, con lo"s iescrltados eri hexadeci mal que se indican.
ADDAX, BX DEeex JNZOlOA
Ira vez: AX rO +3 AX=3 ex r 4-1 (Z=O) eX=3 Salta a OlOA pues L:.=O
2da vez: AXr3+3 AX=6 eXr3-1 (Z=O) eX=2 Salta a 010A pues Z-=O
3ra vez: AXr6+3 AX=9 ex(--'- 2 - 1 (Z=O) eX=l Salta a OlOA pues Z::O
4ta vez: AXr9+3 AX=e ex r 1-1 (Z=l) eX=O No salta, sigue, pue :.:=-i
Esto puede verificarse paso a paso, ejecutando la secuencia dada, mediante el comando T del Debug.
. . . . . . . - .. . ... ..... - ..-- '. . . ... .,. .- ... ..
~ ~ ~, -
-~ . . .... . .. - . .
--~-

EJERCICIO 4: Mejora del ejercicio 3 usando JO (Jump if overflow), manejo de constantes, empleo de la .
___... -----..- -..Jn$.tll~foJMr., ~Y.-~4~.~!!Ci.~:t~_s _ ...- - - -- ---
, En la seccin N.3 de la Unidad 4 se define el overflow para nmeros enteros. Para un formato de 16 bits, como
.., .., / el que tienen los registros AX, BX, ex, ox; 'exls.te overflow si por ejemplo, una suma de enteros positivos
, " s~pera el valor 32767. En ese caso la UAL genera la.indicacin V=l de existencia de overflow.
Modificaremos la s_e_c uencia del ejercicio anterior para que si por los valores M y N alguna suma parcial o total
excede 32767, con lo cual la UAL genera indicacin de overflow, se indique esto escribiendo.:FFFF en B320 y
_B321. Para tal fin, ~n la secuencia anterior luego de la instruccin de suma agregamos la instruccin JO como
s~ jndica a continuacin.

A 100
xxxx:OlOO MOV ex, [B310] Llevar a ex una copia de N que est en B310 y B311
xxxx:0104 I\'fOV BX, [B300] Llevar a BX una copia de M que est en B300 y B301
xxxx:0108 SUB AX, AX Poner acumulador AX en cero, restndolo de s rnisrnQ
xxxx:OlOA ADDAX, BX_ Si:i'mar a AJ:.. el valor de M que est en BX
xxxx:OlOC J_Q_9_~~- Si de la instruccin anterior resulta V=l, saltar a 0130
xxxx:OlOE DEeex
....... .
~- -~~ -.....
Resta~ uno a ex (con lo cual pueden cambiar los flags SZVC)
xxxx:OlOF JNZOlOA_ Si luego de la instruccin anterior Z=O (eX no zero) saltar a OlQA
xxxx:Ol11 ~()V [J?3.~]! !:-~ Llevar a B320 y B321 de memoria, una copia dt:!l valor de AX
xxxx:0114 INT20 Instruccin de final

A0130
xxxx:0130 MOYAX.1 _f...fff_ Llevar a AX una copia de Ja constante FFFF "'
xxxx:0133 MOV (8320], ~ Llevar a B320 y 8321 de memoria, una copia del valor de AX
xxxx:Ol36 INT20 Ins tr~ccin de finai
~
Figura 3.6
'
. .: :t ' En~9nc~s la secuencia que e:npieza e~ 0100 es la del ejercicio anteri()r con ~l agregado de JO. La instrucci~ de
. sajtar s1 el resultado antenor genero ove_r~_lo~ que en assembler se escnbe JO hhhh, orde11a saltar 11 la ms-
'. trnccin
.
de direccin hhhh slo si V=l; caso coi1trario
. . . -- - .. ------ ----... .... _.__ - .. - ..... . . .... .. .
~ .
(V=O),
..
ordena co11ti11uar con la i11strncci11 que sigue a JO.
En definitiva, si lue~ de una suma es V=O se ejecuta la secuencia del ejercicio anterior, y si V=1 se pasa a
e}~c-~t~~ ~-s-~cue~d~ q-,:~- ~mpieza en-130 y termina en 136. Esto puede verse en el diagrama de la figura 3.7
L~ .instr uccin JO 01:30 ordena saltar (si V,;,1) a una instruccin que no forma parte de ll -;ecunicia. Por tal
m~ti"vo, m~diante A 0130 hubo qu~ escribir la otra secuencia, que empieza con MOV AX, FFFF. .
Esta ltima ordena pasar a AX una copia de la cons tante FFFF, la cual ser luego eser.ita en memori.1 medi<1nte
la_ejecucin d e MOV [83: ;, AX. La d ireccin 130 fue (:eg_~~~-~~~t~aria'.!l~n.!e
U3-7

ex - [B3101111
CX=0004

BX - [8300 /01]
BX=0003

AX - AX - AX
AX==OOOO
szvc
AX- AX+ BX
AX=0003
szvc
V

AX-- FFFF
'--------.----~ AX::::FFFF

V
_ / 2-...1_] -_ _AX_~ [8320/21]=FFFF
[ 8_3_2 0
.____

(8320 /21] ---- AX


1

8 Figura 3.7

No existe una instruccin como MOV [B320], fFFF que ordene pasar diredamente ua o~tante_ a memoria .
. sea. que p~ra !?lo .se.
q~b~ p-asar primer~ a.u;, registro (en ~st~. ~a~~? .A.X), y _ll}~g9 .c!e..~s!~ -ffi.~rp9ri.~ '
,j
-~as instrucciones qu~... ord~nan pa.sa~ . una. ~a.ns tan te a .un r~gistro estn en modo de direccionamiento
" inmediato".
.... ... ~ .
' .
Obsrvese la diferencia entre MOV _AX, FFFF en modo inmediato, y MOV~!0 [_FFFF] ~~odo directo. La
1

pr_ime_ra orden~ cargar_en .AX el.n'llT!ero FFFF, mientras qu_e l~ segunda -~~~e!}! sargar e~A,X. el nmero que-''.' .,,
.est en l.~ dirE!cci<?n d~ m~moria_FFf.f. . . . .. y.;.' '1- , ~ .' t ..... ~.
L-..9~.!l.O..!!nacin "in.m~gi~!.Q~.P-l}_g_qe exp_lic:ar~~-- partir ciel .cpqigo de m,q~ma de una instruccin en est(! : .-
J!lOciQ..c:i~ 9..iT~c:cj()_fl..?.!11.!en._to. Mi:diante el comando lJ del Debug hallaremos el cdigo de MOV AX, FFFF (lueg?
d~ -~aber escrito la secuencia en assembler)
u 013.P
xxxx:0130 B8FFFF MOV AX, FFFF
xxxx:0133 A320B3 MOV [B320], AX
xxxx:0136 CD20 INT20
Se observa que en memc)ria, luego del cdigo de operacin B8 inmediatamente le sigue la constante FFFF, <:e
donde proviene el nombre "inmediato" de este modo. En el mismo el dato (constante) en lugar de estar en urn1
?;9_12!-l .g e d~~qs _e encuel\tra formando parte de la instruccin. Es el nico caso que un dato se halla en la zona
gg instrucciones.
lJ.fLc!.d~j_n_struc~i_n J:MP _(jump)__
El programa de la figura 3.6 puede escribirse con menos instrucciones, como en la figura 3.8 dado que las
secuencias_que empiezan en.100 y en 130 terminan con las mismas dos ins.trucciones. En el diagrama lgico de
la figura 3.7 se indica una lnea en punteado que luego de la orden de pasar FFFF a AX sigue con la orden de
p!lS?J" qe AX a I~~.fO] . De esta manera, luego de ejecutar la primer instruccin que est en 0130 se saltara sin
condicin alguna a ejecutar las. dos ltimas ins trucciones de la secuencia que empieza en 0100, que son
tambin las dos ltimas de la secuencia iniciada en 0130. La instruccin JMP 0111 de salto Gump) cumplir
~~te cometido. No es necesario ind.icar con un rectngulo la existencia de la instruccin JMP.

En general una instruccin JMP hhhh ordena saltar incondic:ie>nalmeryte (".~i9 s() a la instruccin que est en
la direccin hhhh, sin p9sibilidad de seguir con la instruccin que sigue a JMP en memoria. Es equivalente a
, .!!n.'.'GO.TO" en @ l~ngu.aje de alto niv~L
Csmforme al uso de JMP, las secuencias de la figura 3.6 quedaran corno indica la figura 3.8
U3-8

A 100
xxxx:OlOO MOV ex, [B310] MOV ex, [B310]
xxxx:0104 tv10V BX, [B300) MOV BX, (B300]
xxxx:0108 SUB AX, AX SUB AX, AX
xxxx:OIOA ADDAX, BX OTRA ADD AX, BX
xxxx:OlOC JO 0130 JO ALFA
xxxx:OlOE DECCX DECCX
xxxx:OlOF JNZOlOA JNZ OTRA
xxxx:0111 MOV [B320], AX BETA MOV [B320], AX
xxxx:0114 INT20 INT20
. .. ~ ._u.:_.; . -- .,.----.;: ,1'-..,'"-fl'_ - -- - -
A0130
xxxx:0130 MOVAX,FFFF ALFA MOV AX, FFFF
xxxx:0133 JMPOlp JMPBETA

Figura 3.8 Figura 3.9

La figura 3.9 repite la secuencia de la figura 3.8 pero sin las direcciones. En lugar de ~stas aparec~n las
etic~~t~;--e;i~bel?); c:0-rn0 ;,o-tra": "beta;,~ ;;alfa'~ qe"sn-
aamiffdasporotr~~ t~aductores, pero que no son
i?i~~id~~-;-r-ei t;~41;~t.r q:~rL.Pi9.Y~~: -.~rJJ.ebug. . Est~ .-~!~:-ciue dichas .-~tiquetas s~ usan para indicar
direcciones simblicas .a las que apuntan las instrucciones de salto. En la presente etapa usaremos etiquetas .
p~-i~ ~~~~ibi_~ se<:ue~~i~s e~ . a~~t:~~fri_.~~~~p~p:~(iJ~P.Ji.~P~~~-- n~ J?<IE~. eJ pebug. De esta forma nos.
i!l.~.~pendizamos del Debug_ y de _!~~ ~~~.~-~~-~0-~..:

EJERC.lCIQ.f..s9.mo..~am1Ji!!i:fa. el.~j_e_~f1 S~ 3 si .s e usara JZ en vez de JNZ.


El lector puede preguntarse qu ocurrir~ sre~-[~g~r d~ poner fa condicin.que Z=O se hubiese puesto que Z=l
- . . - -- - .. __ , ____ __ _ __ _ _,,,_,....,,.., . , --
~ ---- - --- "----- ----~--~ - - - .. ..--- -- - .. . ..
- - ~---- ---- -- . .. . . ..
-~- - -- - - - - ~ y

En ese caso (diagrama lgico de la figura 3.10), se


ex - [83101111
CX=0004 Sf.ltara .cuando sea ex = O,
pues recin entonces
s~f~__?;=1_y_~e _psa~a . a ejecutar la secuencia que
BX 4- [8300 /01] erripieza. c_or,t _~l e~vo . del valor de .AX a la direc- .
BX=0003
,s.!9!1 B320, a la que sigue ~l fin de la secuencia.
AX -- AX AX
AX=OOOO
Pero mientras tanto, cada vez que se le resta uno a
ex
no se slta, sino que se contina (por el no,
~dado que es Z=O)) con la instruccin siguiente (en
AX 4- 1
punteado en la figura 3.10 ) a la del salto
AX=0003
coi}gi_c_i_qn,al, ql1~ d~l:J~ s~t rt]MP. J?~t~_!nstr~ccin
ex- ex CX=0003
ordena. saltar incondicionalmente a la instrucciI}
. que indica sumar AX con BX. As se vuelve a
ar.mar un ciclo com en la figura 3.5)
V Es!o. es, puesto que el rombo que repr.esenta una
instruccin de salto condicional slamente permite
S~!a_r por uno slo de sus vrtices-Taferaies, siend
que su vrtice inferior est ligado la continuacin a
de una secuencia, sta se contina - una con
i~st~{icci"n 'ql"l ordena salta_r . incondidonfrnnte,
"si o si", a otra instruccin.
[8320 /21] - AX 1
Obsrvese (figura 3.10) que el salto condicional no
1 [8320/21 ]=0012 se realiza sobre la misma secuencia, como en 1a
figura 3.5, sino qu"e" se""salta . a otra . secuencia,
Figura 3.10 8 s?mp~s!a "por dos ins_trucciones: &j))i- e(; que .
en la figra 3.11 esta secuencia se escribe aparte.
" -- . -. . ' . - , .

~1: el f!elmg fue nec~sarioi_n?~c_ar _~ 1.~?' ha?.indos~ elegido la direccin 130 en forma arbitraria:

Si bien, como se dijo ms arriba, no es necesario representar mediante un rectngulo esta instruccin. esta vez lo haremos por
razones didcticas, para mostrar que cuando no se cumple la condi cin en una instruccin de salto incondicional, la secuencia contina
con otra instrn ccin, que en este caso particular es de salto incondicional.
U3-9

A 100
xxxx:OlOO MOV CX, [B310] _____ _!:._l_~~ar_ a..C:~.~-~~Pi~-~~-t-9.~~~st en_ l?~l.Q y.JP.\L.
xxxx:0104 MOV BX, [B300] ..
. Ll~var. a ~X: ~i:i~ copia de,_~ que ~~.~~ .el'. 8300 y 830.1
xxx.x:0108 SUB AX, AX . _ Poner acumulador AX en cero, restndolo de s mismo
xxxx:OlOA .ADD AX, BX Sllinar a AX el valor de M que est ~n BX
-x-~-Xx:oi'c--otccx - - - .. - Restar un9 ex (con.lo CU'll pued.en cambiar.los flags SZVC} -
xxxx:OlOD rz:,i:~o ___ Si Juego de la instruccin anterior Z=l (CX zero) saltar a 0130
;;;;~OOF JMP lOA Saitar incondiciorialmente a lOA - - - -

Al30
;..,__ _ . xx~x:Ol30
' ~ - ~.. - - xxxx:0133
MOV [B320], AX
INT20
... Llevar a 8320 y B321 de memoria, una copia del valor.de AX
Instruccin de final - - - .. -
.. -

Figura 3.11

EJERCICIO
-- .. , . .. .
6: manejo
~ - ~ ~.
- -
de un listaJo
. ... ,,. - _.... .
de datos consecutivos
~. ~ ~
...... .... -
en memoria
.. ......: .......,,,..,___
(lista o . vector)
~ -,;1:... :J..--'-"---~.-r- - _. --- ~ ,1 . .. - ... - .......

Se supone (figura 3.14) que a partir de la .q~~l:?S~in_ 1000 de memoria, y en posiciones consecutivas,
se.. ene lli1a lista de nmeros enteros de dos bytes ca~a -~_C>'. .. ~ 1 , N 2, N 3 Nn . La cantidad n de_
nlimeros de la lista (long~~d). se da en la direccin 1500_. Todos los. nmeros de la lista deben ser
s~mados~ y -el resultado total de la suma debe ser asignad.o a vaiiable R que -~st~ .en 1~~- _ una
<:!_~~ec~i~s}O~oy 2Q01. L~posibilidad d.e overflow se considera en otro eje~cicio posterior.
'"-
De tener q_~e cod!ficar~e J_a_ .~ec~~ncia solic:ita4a co~ lq~ modos .. 9~ .:aire<;d_~it:niento dfi!finidos hasta .el
p;esente, y ~o considerando el overflow, habra. que .escribJr (figura . 3.p) tant~s instrucciones para sumar.
como sumandos conforman la lista. " ..
..,\': .....
SUB AX,AX MOV SI, 1000 Cargar en modo inmediato SI con el valor 1000
ADD AX, [10001 ~~~- J.0_~A>! Llevar AX a cero . . ' . . .
ADD AX, [1002) ~P.-~J.C, rs.n ... S~i:nar .AX e~ c_o ntenido de. las ~!re,coc:ll{es 1000 y 100L(AX:::N1) ,...
ADD AX, [1004) ADD SI, 2
......--~--"'~ ~~~~ .i11rn.e.4~.~t!?-~~~t.2iiLS~l!t~..li.Q.2,.9~ .~LC~hlO.Q.~
ADD AX, [1006] ~DJ:?..M~ .lH $!-!rnL AX .~! !=Ol}t~!M.:~~.J.s: cii~e<i~_nesJOQ.2,_y.J.003 (AX=:=N2)
~.O!?.~~!~: En modo inmediato sumar 2 al contenido de SI (SI=1004l
1:.I>~-~X.d~Il s~~ar..a--AX ~1~~nte;~~~~~.i~~:.cirr~~~i~~ ~~-i'w~ .;_fioS.{AX:::N,)
MOV [2000], AX ADD SI,2 En roo.do inmedi_ato sma~ 2 al.contenido de S! (~~-=:=_lgQ~)
ADD AX, [SI] s~~-~r a AX el contenido de l~s dir_~:ci()p~s 10.Q_6_y)QOZ .(A.0.=:=1'J.J_
Figura_ ~:g etc ... hasta que SI contenga Ja _d!reccin del ltimo ~_ato Nn cie_l_a li~ta
Figura 3.13
SI --~

~1
1000
]Nt E~_ el
corchete de cada instruccin ADD AX, [hhhh) hay un nmero de valor fijo_
Q:hhh), que es la direccin de una celda de memoria, D~cho nmero aum,e~ta en
\1 00~ ] N2 dos de una instruccin a la siguiente. Una instruccin com o ADD AX, [SI]
.. presenta el valor del registro SI como direccin de una celda de memo;ia, dado
] N3 q~e._ lp que ,e~t~ ~ritr.e corchet~..e?_sj~npr~. :ypJ!._ffirg~q9.n,~S-~.mmP-rende._que. el
1004
5 y~~gr_ci.~ esJ dir,eq:jm ?~ra . ~! valpr_que .tenga.~l r~g:i~Q:.o.SJ . ..
1006 Pi!:.rn .. f.\_t,l.~trq,_p:g.~J~!n~Jla_b~.. _qe_s?r.g?r_$}con .e! _yalor inic.i al 1900,.x l11~g9 ,_
] N4
7 cac!_a ve~ irJ~~~I}Q2,,_~ p_~r_.q!:!,.~_ ?LY~Y .JC>r.nim.dc?. sy~esiva_m!!I\t~ _19~ ,Y!l.IC>r.~s.
1008 ] N5 1002, 1004, 1006, . .. ~~-~!. ?.e ~?.c:l.c:> _ql}e;_~Dp .A.X,_(?I.l_Ey_mP,!e..t~ !!l!~m-~J~gpp
9 !:!,.eJ_g_q~,Ua.!.!!11.~D:!.~!9!1-~S AD.Q...~L..lli.J:i.hJ1Ld~ .l~. s~cuencia.. ~~ la figy.ra 3.13 La .
i.<!t!- '.'. ~!1 QT\JkL. p,e~sada c~!l:l:~. u.Jl~ . S!'!C):l.t:?ncia .lineal de. i11s.truccioi;.es,. sin lazo
d~_!_epetic:in, !?~.r~.a. la de la .fig41'. _3.13. Mediante un lazo (figuras 3.15 y 3.16) se
e':I!~.!.eP.~~!}~_!~-~.tr~.c:cione~J'\DP..AX, [SI] .Y_ADO SJ, 2 ..
~ .f La_i!'_St~uc:in .AP:O t.,X., [SI].oi:c;iena C!lrgar en AX el contenid_ o de d.os. celda.? .
1500 05
J; C<:>_l)~e_c~!!?!iS ,9~--!l'~rn.or::ia, si.e_ndo que la direccin de) primer de _ellas est
4
dada por el registr9 _SI.: Una instruccin de este tipo corr~~ponde al modo de_.
Figura 3.14 \ ~i_r~c~iot:iaJTI.i~nt~'_in~ir~c~~ po~ registr~). -Es.t o:e s,. crecin)e na <;~Ida. 9~ _ ia
I)J.emoria se~- i11directamente a travs de un registro, como SI, DI, o ax.
LJ!s. i,1.1.~t!11cc~o1!e.~. ~~!-.t!l..~q_!!.!f!}_~~~-~,. _f?_!..-!'.~~-~.r.~_Y.~!!1!!.tf!l.!E.!~E~.13.~!. el pr,o,~!~_n,ia . d..~ !e~.~'!C ..~'!.~.o.. t,r~_s__ ._
tro qa_tos ._..
coE.~.e.!!.~_oj.!!_~P..'!..~.i.cig_1.i~~~-!!E.~}.!.7l!!.~le.~'!.~~n_??E!!!.:. .
U3-10

A 100
xxx~:OlOO MOV CL, [1500]
Carga.en CL (mitad infe.riqr de CX) l_a_l.Q_T\gi~d__de la lista que _e_st .enJSOO
X2<_~~..:9104_ _MOV SI, 1000 SI apunta al comienzo de la lista de datos
xxxx:Ol07 SUB AX, AX Pone AX en cero .
xx.xx:o109 Ano -~x;, r_?IJ Su~'! :a A.X un nmero de la lista apuntada_por SI .
xxxx:OlOB ADD SI, 2 Suma 2 a SI
xxxx:OlOE DEC CL Decrementa CL
x~~)( :Opo JNZ 109_. Jv1j~n_t~as. ~- ~:!-~ 9_,_yoly~r . ~- 199
xxxx:Oll2 MOV [2000], AX Carga en
_pl _ [1500] 2b00 y 2001 el resultado de la suma
'------~-----'CL=,OS. xxxx:OllS INT 20 -fn

~_S_
I --
-~10_o_o_ ___, S l=1000 Figura 3.15
Obsrvese en el diagrama o en la secuencia,
que al registro puntero SI (o cualquiera que
sea) p rimero es necesario darle un valor inicial
AX-AX+ conforme a la direccin donde comienza la lis-
ta (mediante la i'nstruccin en mdo inri:iediato
MOV SI, lobo). Luego en el lazo es-~e'c~~sario
SI - SI +2
srvc
Sl=1002
incre.m entar seglin corresponda (en este caso
;edfate Db SI;" 2) el valor d SI a fin de
CL ~- CL - 1 ~_arrer tuda ia
lista. Es . ixi-iportante n_o tar que
CL=04 esto no se hace automticamente, sino que debe
srvc estar a cargo del programador.
V En el ejercicio 13 se ampla esta secuencia
(Z=O) considerando la posibilidad de overflow.
F (Z=1)
[2000 /01] - - AX
[2000 /01]=N1 +N2+ ...

8 Figura 3.16

EJJ.filf!f.IS'-2.:..~~-~A!:.1~.s instrucciones de comparacin y JZ (Jump if Z=l); y escritura en una lista


. . . .. ' ' . ... .., . . .. . . .. ... . ' ..... ' ... ~ .,. . .. ' . . ' . . . .. . . .. ' .. -~ .
A partir de la direccin 2000 se tiene una lista de caracteres codificados en ASCII (figura 3.17), siendo
'l~...~Y)!lg~~cf st-~~--~ dlr.~cdon- i.500. Encontrar ei nffierode veces que ~n la sta se enc~_~tra la_
letra E (cdigo 45), y dicho nmero guardarlo en la direccin 1600. Asirrsmo, q1da vez que se
'encuentra una E, indicar en una segunda lista que empieza en 6000, la direccin donde se encon~P
E_(!!itir~:?:.~ff)-.-----. - .... - -- .. . ... . . .
Q~5'l1i _ . ..
1500 06 Como indica el diagrama lgico (figura 3.19), primero se
-i-nicializan los regis tros. El registro CL con la longitud
de_l.)~s_t~;-~i r_e gistro SI con la direccin inicial de la.lista
Sl-2000 (4) DI ---- 6000 .c:J.e caracteres A_s c; el registro DI con la dlreccfn
~ 2001'
~ 600~
(A) inicial de la segunda lista, que guarda las direcciones
2002 (E) donde se encontro una A; y el registro BL (mitad
2003 (O) 3 inferior de BX) se p one a cero, pues va a !;er usado como
-fcjtador de las veces-que se encontr una A
2004 (E)
Luego, cada elemento de la lista es llevado en modo
2005 (G) indirecto por registro hacia AL (mitad inferior de AX,
pues AX tiene 16 bits y cada dato es de 8 bits).
A continuacin se compara el elemento cargado en AX
Figura 3.17 Figura 3.18 con el valor 45 (valor en hexa del cdigo ASCII de la
letra E). Para tal fin se resta en la instruccin de
C?:X:P_racin AX - 45, a fin de que la UAL genere valores de los flags SZVC.
U3- l l

Po_~_ si eLv_alor delflag Z ~s 1, se pregunta en la instruccin de salto siguiente JZ. Si es Z=l implica que AX= 45,
esto es, que el elemento cargado en AX es la letra E. Entonces se salta a la instruccin que incrementa a BL
(contador); y se escribe en la lista que comienza en 6000 la direccin donde se ence>"ntr "iina E, median te la
instruccin MOV [DI], SI. Luego se debe aumentar en dos al puntero DI (pues cada direccin ocupa 2 bytes) y
sa1tar (mediante JMP) la sec"uecia principaL En sta se incrementa el puntero SI a fin de apuntar al siguiente
elemento de la lista, y se decrementa CL, para determinar con JNZ si no se termin con la lista de datos.
Si .e]j"a0r ~~ -;z'._e~~implica ql.ie .enA)_(_n_()_~t la_l~tra E, por)~ qu~ d~~ern realizarse las a_ccion~s indicadas
en la frase anterior.
;- -- - -- - -- ,
1 CL --- 1 soo1 lc1..=os j CL - [1500) icL=-0 6
- -~i_ __

____ ___
1
-- ; --:_ 2000
'----~---~'81=2000
[.

~--2,-0_00
1
!
i Sl=.2000

1 DI - 6000
._[_D_
t_ _ 6~--___,01=6000
[j_~ - ~L BL_J BL=OOOO

_!'L - (SI) __ AL= j


1
AL - 45 [ AL 45 j
i S"Z>/C szvc
----,_ V
-=-----'---.....:
~--------1
V
Z=O (AL/~.>-(Z=O)
-..=:::::::._ ____

~S+171
F j (Z=1)

1 SI -
SZVC
151=1002
:
l
,
BL -

BL + 1 J
S"Z>/C
BW.1 [ sL -- BL + 1 j BL=l
-.-- l. ' :
i S"Z>/C .
[ ---~:-==- CL ~-----J CL=OS.
... J ,. [DIJ SI i[6000/01]=2002
!
i [DI] - SI '
\..
~
l . . ....
szvc i _,- - -- --- - -
-
J[6000/01l=-2002
' . ,
~-(
CXI~ ~D-1-- I_
--D- +_2_,_I
V
(Z=O) ---
FI (Z=1)

,
L _______ szvc
01=6002 I>DI -- Df +
~
2. J
szvc' Dl=6002 .
ic ,

[1600] - BL J [1600]= ~s_1_ __~,s


_1_+_1~~c 51=1002

~ ., j CL -

CL - 1 . 1CL=OS
szvc
v'
Figura3.19
~'
(Z=o~_
. - - ~=1L~--
1soo1 - BL !
, 16001=

-~~ .ciiagrama lgico de _la fig:ir~ 3) 9 resultan_l~s. sec.ue_n~i_as escrita~ a cor:t~nu.'.i~i?,n.__


e Figura 3.20

A 100
xxxx:OlOO MOV CL, [1500] Carga en CL (mitad infer ior de CX) la longitud de la lista que est en 1500
xxxx:0104 MOV SI, 2000 SI apunta al comienzo de la lista de datos . . .
x;xx:i07 . MOV DC6oocr DI apunta al coffiien zo de la otra lista
xxxx:OlbA.. SlJifBi.,BL Pone AL en cero . - - --
.. xxxx:oiOc- rvi'ov xc lSI1 Lle~~ ~ f\.L un."cara-~ter de la lista_ apunta.da _por SI
xxxx:OlOE CMP AL, 41 Compara el valor de AL con 41
-~~;cx:;o~ to_:.
J~)~p - Si son igiiles (Z=l) salfi .. 130 a
1;;:;effiet:"sc .. - - - -
xxxx:Oll2 INC SI
xxxx:OI13""''DEC. 'CL Decrementa cL
- ~~x:Ol 15 _J~_?:__}-~ M[enfx:a~~z: ~e-~_o.!.Y.1y~_i:~_10_c:
xxxx:Ol 17 MOV [1600], BL Carga en 1600 el valor del contador
-X-i<xx-Ofif-tNi' 20 - Fin . .. . .

A 130
xxxx:l30 INC BL Incrementa BL
xxxx:Ol32 MOV [DI],SI Escribe el valor de SI en la lista apuntada por DI
xxxx:Ol34 .A DD DI, 2 Suma 2 al puntero DI -
xxxx.0137 JMP 112 Saltar a la instruccin que est en, 1_12
U3-12

\Yl:>.~ryes~ que u!.'~ :ist~~c~~~n COI!:'. Jv!:O.Y. Al, (.SI)_ ordeI1a I~.~r_ u!: elemento ?e_ tma. !ist~,. Y cargarlo _en AL. ..
E!}. car11bio MOV [DIJ, SI ordena escribir un elemento de una lista cuyo valor est por SI.
L~~ dos .s ecuencias anteriores pueden escribirse en
una sola, -evitantando la instrucdn JMP, cambiando JZ
por JNZ, conforme a las figura 3.20 y a la secuencia siguiente: .. . - - . -. . .. . .. . . . .

A 109
~~~~Q.109 ___M_QV S::.L, (1:500}. C~_rga en CL (mitad inferior de CX) la longitud de la lista que est en 1500.
xxxx:Ol04 MOV SI, 2000 SI apunta al comienzo de la lista de datos
xxxx:Ol07 MOV DI, 6000 Di apunta al comienzo de la otra iista ...
xxxx:OlOA SUB BL, BL . - Pone AL en cero
xxxx:OlOC Mov',~.L> [SI] Lleva a AL un caracter de la lista apuntada por SI
1 ... .;._
., 1 ~ . lQ~l.i~
xxxx:OlOE CMP AL, 41 Compara el valor de AL con 41
xxxx:OllO JNZ 119 Si no son iguales (Z=O) saltar 19
-xxxx:0112 . INC BL . Incrementa BL
-~~~;:oii4 .. MV [DI], SI Escribe el valor de SI en la lista apuntada por DI _
-xxxx:0116 ADD DI, 2 Suma 2 al puntero DI
--xxxx:0119 . INC SI Incrementa SI
xxxx:il DEC CL Decrementa CL
xxxx:Oll C JNZ . 10C Mientras Z sea O, volver a lOC
~xxx:OllE MOV [16001, B_L Carga en 1600 el valor del contador
xxxx:Ol22 INT 20 Fin

~ara l_!._~str~~~i~~~Z)_l?, nos encontramos con un problema nuevo: se debe saltar hacia _l~ ~s~ruq:jn
INC SI, pero er el momento de. escdl:ifr.jNZ~.-n"c) coocemsr-dfr-cion 1T9. Para-sfdoar esto primero
escribimos JNZ 100 (elegimos 100 por ser una direccin prxima; podda haber sid-cualquier otra cercana), y
Uando.t enfriam()S 4e. ~~~~~b~r. !()da !a secuencia, entonces conoceremos que 119 ~~_l!i_ c:ifr_eccin. dt: ~s;: SL
Luego corregimos como sigue la instruccin JNZ i"oo-{.Seai conod<liisu- dfrecd 10):
- -"- ~--- - ... ---- -- - --.. -~- - - - -- -- - - - - - - . .... -- - ....... .. ..

. AUQ
X.)(XX: 0110 JNZ 119
Este procedimiento
.
debe
'
hacerse
. .
siempre
.
que haya .que. saltar
..
"hacia
.
adelante"
. - - ...... " ' ,,

EJERCICIO 8: uso de la instruccin JA <Jump if above = saltar si est por arriba) para nmeros natu ral~~~ y
-- .. -- -----(!~T _.~o~~~ffr_ec~-por regis.tr~:cori-de~p!a~.n.:1-iento . - . .. . ..

Se tiene una lista de nmeros naturales de un byte cada uno, que empieza en la direccin 2000,
s~n_cl~--qti~-. ~i!J?~_gif~~:~5-tf e~)-~~~~~ir.i. i,s_~p~_ ~nc~~~:.0:~.:1...~~Y.-~-~~ ~-;,__ni,n~r-~~--~-~-1 ~st~ y
g~_rciar.19 ep_)a di1:'.~~~~~- ~QQQ_.
AlOO
xxxx~lOOMOV CL, (1500] Carga en CL Ja longitud de la lista que est en 1500
~~xx:0104MOV SI, 2000 SI apunta al comienzo de Ja lista de datos .
xxx~9!97 MOVAt, [Sij eva el primer.nliffiero. de la lis taa -AL, suponiendo que es el mayor
~:9109_jN~_ ~i ~ ---- .. Iniementa ei punter SI para tomar el segundo elemento de la lista ,
xxxx:OlOA DEC Decrementa-CL,pesya5e fom el primer n mero de la lista ....
-------- -- -CL- -
~~)(:_0_!9<;: ___<;;~~AL,~~_Il c?.~P~~~~I~r~~~~p_uesto:~~y~r-.~.ll~~I:-:-~~-.t:r<:i_~~-_P_1:1?t_~~..P?! ~.!.-
xxxx:OlOE _Jb. 112 __ _ Saltar a 112 si el nro que est en AL est por arriba del apuntado por SI
xxxx:QlJ_Q__.MQ.Y A_L, l?~l Carg~~ AL ~ ~uv.iimei-o may.o r apuntado por SI .
~XXJ<:.l_g_ IN<;:~I Incrementa SI preparndose para apuntar al prximo elemento
xxxx:0113 DEC CL Decrmenta CL - -- -
__
x:xxx:1~ Jt~rz iQ~-= __ -------Mi"enfrasZ-seao; volver a lOC
xxxx:o117 MOV [3000], AL Carga en 3000 el nmero mayor -
-~-xxx:OllA iNT-io- ----- ---- Fin - . . .. .

La instruccin] A 112 que sigue a CMP AL, (SI), ordena saltar a la instruccin que est en 112 si al hacer la resta
o si
AL - (S1je-nliicomp-aradri anterior;resltaC=o; sea .el nmero na tural que est en AL est por arriba (es
mayorfdeCniimro natural apuntado por SI; caso contrario contirur coii. la .i nstruccin que sigue a JA 1n_si
e!__~~~!~il.~~es~~--~~:~Ie-s-igal_arpnt.ado_~~-1.~_!jj!~.P..~::~~-5?rn nos~ cumpl la.condicin, la secuencia
!g~~-P-~!.J.!'::!~-$~~ O.~._h<J.be.!.s~ r~~l!'.:~~~- ~.~~s_:~;:_i}~~o, en el rombo correspondiente a la . condicin de
sIJ P,a_l:!r<l.. qu~ e_scr!~ir C:::=O.):::n.la Unidad 4 (p~g 88~ Sf! t:_~!~-.en .detlle el uso del flag e - . . -.. .
03-13
~~E'.<:i~~-~~i_!>i_r _la secu(!nci_a anterior de la manera siguiente, donde las instrucciones INC SI y CMP AL, [SI]
~~-~<:ln r~emplazado por la insfruccfn c:MP AL;-[SC-t-- 1r BSfo-es, -eri. una-ffiisrri i.r\s trcdn-se frici-ementa sr, y
se compa~a ~1-~-~~a. -~~-r:_?i:ii~~-~E~.mt~~-P~E}.(~-:}_:-'fambin se-peC:i~-esci-ib_fr Clv!P A).., _[SIJ 7: l. - . -
Esta forma de direccionar el operando se conoce como "Based ~~~1:~~sing Mode"
A 100
~?95?.C.:9J.Q.O _ .MQYSI:-! r1sooJ Carga en CL la longitud de la lista que est en_1500
xxxx:0104 MOV SI, 2000 SI ap unta al comienzo de la lista de datos
- XXxx:o107 MOV"AL,-[SI] Lleva el primer nmero de la lista a AL, suponiendo que es el rn<lYr
xxxx:Ol09 - bEC . CL - Dec~-~~e0.t~--C.~; pues y_a_se:trri el primer nmero de la lista
~-~~~~foa crVlrA.i;~[Sr + 11 Cor.11par_~__el nro supuest~ mayor .E'.n .tbS9..!1-..tro_I,1rn lPuntaqo por SI + 1
- --------------
~--

xxxx:OlOE JA 113 Saltar a 113 s i el nro que est en AL est por arriba del apuntado por SI
xxxx:OO - MV.AL, [SI + 1] Carga en AL el nuevo nimero mayor apuntad.o por SI+ i - - - - --
xxXX:on~rTN'c-sT ___ ---
Incrementa SI preparndose para apuntar aiprximo ele~ento
xxxx:0114 DEC CL Decrementa CL
xxxx:Ol i6 JNZ lOB - MientrasZsea O, volver a lOB
xxxx:0118 MV"r:foooJ, AL Carga en 3000 el nmero m ayor
xxxx~l f BTr\Jt_fo_______ --- Fl~ -

~J~~CI<;;IQ_ 9_'. us_o _de _la i~s_t~~~}?_~ J.<:; (Jum:p if Greate~-= Saltar si _es mayor~ l'~ ~~~-~-~~~~~~ero~-
Se tiene una lista de nmeros enteros de dos bytes cada no, que empieza en la direccin 2000,
sendo qe -su-longfoa-estf
ri fa -dfr-cdn 15bo: E"ncoritrar .l mayor de los la lista; -.meros d.e y
g:l.~~-~~r.1_~-~n ~~---~~-~~c~~~n 3~?. ~ - - ' - ~.:~.- .
Este ejercicio es similar al anterior; con la diferencia que'se trata de l)meros enteros que ocupan dos bytes.
P-~r_-un lad _e l_ Pl1!1~i:.r~_.?!~11br~ _q1:1~Jrc:.r.e_flie_iifa_r10_!::~ .do$., y ~sr_-~_x _e~ ~ve-~4~.hr,:: p-;: ()fr~;- Y-~~<!r-l~Jii~Jrit2.: __
ci~~~:.~~~?. _:.~~~-~~~~~~do JG__p~r.~ ~-~m:r~s ent.~~~~-~~)~g_ar de~J~~ p~op!~~-~~ .~~l!"eros n.a~~al~~.. '&.

A 100 ~ .
JQStc_~;Q_QQ__ J\1QY_ ~~tl~SQ_QJ C~rg~ ~f!fL_!a _l~ngi~u(de la lista que est en 1500
xx~~=9_Hl4 _ .M QY.._SJ!. 29---q SI apunta al comienzo de la lista de datos
xxxx_:0107 MOV ~dS_Il Llev~- eTpri.mer-n~mro..c:fe.i ~t a AL, suponiendo que ~sel mayor
xxxx:Ol09 DEC CL Decrementa CL; pues ya se tom el primer-nmero de la list --- --
xxxx:lOB -CMP-X~ [SI + 2] Compara el nro supuesto mayor ef.l AL cori. otio nro apntado por SI+ 2
. -
xxxx:OlOE JG 113 Saii:ar a lsi el nro g_~-e est{e~-AL ~s mayor q~e el .api:i-~tad~ po-~ SI. .
xx~x~fTo--MOV-Ax, [SI+ 2] Carg"ien.A.Cel nuevo timero mayot apuntad__por SI + 2 .- -
xxxx:b.if3--.ADtna;-r- - -- Ii-icrementa s rp-r eparndose para apunta r al prximo elemento
-xxxx'.OiT6 _b_E"t- cc-- Decrementa CL - -- - -
~xxx :o1 3 -JN"z 10B Mienfraii zse-a: O, volver a lOB
x;-xx.:OA MOV [3000], AX Carga en 3000 y .3 001 eI nu me-ro mayor
xxxx:OTflfiNT 2____ __ _ - -- Firi- . -- .. - .

La instruccin JG 113 que sigue a CMP AX., [SI+2], ordena saltar a la instruccin que est en 113 si al hacer la
r~~t~ bX.:.::J~I.fl~~r~-~~mpariidn~anterior, resulta s =v-(s : o yV=ff s:::1 yv::::1,-es t es; resilltadO-positivo)
y Z=O; o sea si el nmero entero que est en Ax es mayor (,;greathe?;) que el n \Jm.e ro-enteroapuhida por--
s+2i:;iso~c.9.n.trario :se debe co~ti"u": en h.instruccin que Sigue a)LT13. Vfe decir, en n.diagrma lgico,
y
en el rombo correspondiente a JG habra que escribir S=V z;;() en ft.incln .de los flags (unidad 4, pg. 88) .
- --..- -- ---- --- --------.- ---- - - ---- ........... - -. ---- ... - - .. .. - -- - --
-

Es_ imp_o_~~~!.1..!.<:.__sa~:_:__!!_~.f!!_P~~-3.'!!1. cl:i_s~-~!:..!."!.''!!!~e!_o_s Centeros o naturales) Ja i11st~11c.c._i~~1__~e sa!.!_~_q!!.~E~~!:~p_~1_13_~_:_


s~ando s~- ~~!!~_n_~-~~lt~a.~--~_i YI1 P..Eir:n~r. ~~-!.l:-~.1:. ..~~-~_'.1yor _que _c:tro_~egi:r.ido, se d~b.~ _ usar JA pa~a.. nat\lrales,
y JG para enteros. Se su p one que la instruccin an terior a la de salto es una comparacin (resta del
primero menos-er seguti.do) .' ..,. -~ . -- . .. . - . .

EJE~CICIO 10: us_~~~--~as i[1S lf\l ~~it?n.~~J.l!__(j_~~p__i_~ 1'_~1.c:>~l__par~--~~~~~-1~~'. y_J~ _ (j_u~p _i.f. le_s.~> p~a e,~te.r~s

M9_c:lifi_~a~ -~~~ secueJ:lci~~.c:l.f'._ l~~-ej~~c~~-i(lS_.?__y ?. pa_r_a _e!1-c9ntr~~~l--~~!l'?.E...~-~ -~~)ist~_cl._~_n.)J~_er~s,


En el ej~si5i~ ~~E..!!P.E.:.~~~~i.~r._l~- t~t:r.us9911. JA 11~. por JB l'.l._3, y _eI\ el ej~rcic~() 9 .!~_emplazar JG 11.:Z_p_o!J1 .J1:3
La in~.!_!:ucci9~)B__~~~ _g_u_t:: ?~-~!~~~- <;MP J\h.J.?~J~ _9_rd_e11a_;Sal~lr lJ.'.1_i!:_lstruccin__ que _est en 113 si a_l hac~rla__
!~Sta AL__ --:J~I] ~~ --~ c:ompar_ac_in -~11teri_()r, r~~~_lt.~ C=:!-, o _sea si_el _I1_~rnero natural que est en AL est p.or
c!._ebajQJ~~ m~_i:1._or)_c:!~I nm~_ro_ naf:l.J!_aJ Ptlf.l~a..d_o pcir..S.I; caso. contrario conlin_uar con la instrccin que sigue a JB 113_,
U3-14

1'~.J11strti~~-i.z::tJL,_!P . que seguira a CMP AX, [SI+2], ordena saltar a la instruccin que est en 113 si al hacer la
r~~ta.,_A.X_::J~!~L~r:i.l~-C<;?!TIP.~!?..~!.<s.!!....a.n.t~~.iC:!!.r~~1:1lt~ S_"#-V_(S=::l y V=O 5_
;.o y"V;l,-estc>"es; resultado negativo) y
Z=O, o sea si el nmero entero que est en AX es menor ("less") que el nmero entero apuntado por Sl+2; caso
contr:_!._rjQ__g~_q~b.e c_ol}ti11~a.r .~c.>!!J~- ~t;:.\-!~9.~1! que _s\g1:1e a JG 113. De lo a~terior, resulta que en un diagrama
lgicp_ha bra que escribir .la_co~d_i~~n_ $;tv..y_?:=O..en el ro~b_C? _q~e c:_or.i:espoi:.~~ ~ ]L

~JPRCICIO 11: uso de JBE (Jump if below or equal)


Se_ti~D.~__._tl~~ If;_ta _..d~ co11ll?,inaci0ries bmaris de un byte que corr~sponde cada una a dgitos
h~?5.aci_~c~_a!~s aislados (O, 1, 2, ... F), la cual empieza en la dire.ccior\'iObr, siendo que su longitud
a
es~ _e.r:i la .direccin 2000. Convertir cada dgito. hexadecimal su correspondiente carcter ASCII
segn se ejemplifica a contir\uacin. Los caracteres ASCII obtenidos guardarlos en otra lista que
comienza en 3001

Binario Hexa ASCII


2001 00000000 (00) 3001 00110000 (30)
2002 00000100 (04) 3002 00110100 (34)
2003 00001001 (09) ==> 3003 00111001 (39)
2004 00001010 (OA) 3004 01000001 (41)
2005 00001101 (OD) 3005 01000100 (44)
2006 00001111 (OF) 3006 01000110 (46)

$j_~ato < 9 es en ASC_


II igual a dicho dato + 30
Si dato > 9 es en ASCII igual a dicho dato+ 7 + 30
rreJemp10: -
Dato = 06"001010 = A
+7 =+ 111
00010001
+30 = 00110000
~' ..
01000001=41 en ASCII

. A 100
_ ::<~::<~:0100 MOV CL, [200~] Carga en CL la longitud de la lista
xxxx:0104 MOV SI, 2001 SI apunta al comienzo de ia lista de datos
xxxx:ior-M:ov Di, 3001 DI_?punta al comienzo de la li~ta de resultados _
-xxxx:o10A I\.1ov At, csii <;_arga en AL un dato de la lista apuntada por_?J
xxxx~10cc:M::r. AL; 9 Co~~~~~~9~t~-en_~L .contra 9 .
x"X"x-~-~ibE .. )iiE.. i . Si es menor o igual que 9 salta a 112 ..
X-XXX:o- Ario .A i, 7 stiii7aAL..
-- -

xxxx:Oi"- KonAL;"3o
--- - - ~ ----

Suma 30 a AL
xxxx:Ol 14--MOV- [DI(AL Gi'.ia"rl.a-~n-restiltado en la lista apuntada por DI
xxxi off6..-1ci n ... - - Increin~nta o( - - - -
xxxx~O"7 i"c -s1 incrementa SI
xxxx:Ol18 DEC CL Decrementa CL
xxxx:OllA JNZ io Mientras z sea o, volver a lOA
""xxxx:ilc INT io Fin

( La instr~!?!=.~~~.J.B_E}~2 gue sigue a CMP AL, 9, ordena saltar a la i11struccin que est en 112 si al hacer la resta
.
/>: 1' .. J\L - 9__en la comparacin ant~rior, re_sulta C=l 6 Z=l, o sea si .el nmero n atural que est en AL est: por.
debajo (es menor) o es igual al nmero 9; caso contrario continuar con la instruccin que sigue a JBE 112.
, O_se~_3e~~~n a~{~~I:i:~ :1og!co:enel rombO correspondiente a-JBE habra que escribir C=l 6 Z=l.
\

EJERCICIO 12:
Este ejerddo-es contrario al anterior. Esto es, s~__tiene una l.i sta c:l!7 .~~ril:.<;t~_r:e~_f>.S_qJ q-e ewpieza en
2001, y cuya longitud est en 2000. Se la quiere convertir en otra lista que empiece en 3001 con Jos
n~m~rgs h.~~.~e_sif~J~$JenJ:>iri~ro) cofrespcind1~0tes~d.Tcho~-~~racteres -en.:Ascn: -_- -
U3-15

A 100
xxxx:OlOO MOV CL, [2000] Carga en CL la longitud de la lista
xxxx:0104 MOV SI, 20001 SI apunta al comienzo de la lista de d-atos
xxxx~owi- M:av--6( 3001 DI apunta al comienzo de la lista de resultados
xxxx:OlOA MOVAL, [SI} Carga en AL un dato de la lista apuntada por SI
xxxx:OlOC SUB AL, 30 Resta 30 a AL
xxxx:OlOE CMP AL, 9 Compara el contenido de AL con 9 .
xxxx:OllO JBE 114 Si es menor o igual salta a 114 (S AL< 9 es un smbolo del O al 9)
xxxx:0112 SUB AL, 7 Resta 7 a AL (Si AL > 9 es un smbolo de A a F, que se halla restando
37, 'siendo que antes ya se restaron 30) 1
-~
xxxx:0114 MOV [DI], AL
.....
Guarda el resultado en.l-HS'rrtapuntada por DI -~ \ l~ ~1i
-x-x:xx:ni16 1Nc Df' Incrementa DI ... ...
x-x.x:x-:0117 1Nc si ini::rementa SI
xxxx:Ol 18. - .DEC CL.. Decrementa CL < i
. ...
_xxxx:OllA JNZ lOA .. Mientras Z sea o; volver a lOA
xxxx:OllC INT 20 Fin

EJ~RCICIO 13: uso de la instruccin JPE (Jump if parity is even =Saltar si la paridad es par)

Se tiene una lista de caracteres ASCII _1: p_a~t!:_~-~-1-~ -~-ir.~~c~~!2 ?.qQ_~!. ~!':f.lcl<?_ q~t::5U. ~-~J:lg!~~ _est~_t:::nJa
dire-cCin 26(i. S'laparldad de nos .de. cada uno de los caracteres es p~r, escri}Jir oo en !a _direc_~i~n
3oo~ si ~P~-~~~~ct~~ pr~~=!.1~~--P.!1:~~~d- ~E~: de ~-C:~~-~~~=~~~-f~~-~~ -~~ d!-t'~ccin 3000
AlOO . , t '-e

xxxx:OlOO MOV CL, [2000] Carga en CL la longitud_d_~j~ J~ta


xxxx:0103 MOV SI, 2001 .. Registro SI apunta al comienzo de l?- lista de datos : -.
xxxx:0107 MOV DL, 00 . Carga 00 en DL suponiendo que_todq ~~t P.ien - . " . . ~'-> . . . .
xxxx:o109 - sulfA:L,-A:i- Hace cero el registro AL
\, - - -
"' - tI{-'' 1' ,,..... -
(, ; 1

xx:xx:blOB ADD AL, [Sij Suma contra AL para que pueda cambiar el indicador de paridad Pt )..,..
xxxx:OlOD JPE 111 Si paridad :n AL~ p~r, salta~ a 11_1. ~ .~J~F ::: i(._ -.... .

xxxx:OlOF MOV DL, FF J~~icacin de u_n_(;!lefr'.~1:1to cc:n_paridad errada ~~u~( :.<


xxxx:Olll INC SI Inc::rementa SI . ' . ~ ". ~~- (
xxxx:Ol 12 DEC CL Decrementa CL . _, ' "~.;"
xxxx:0114 JNZ 109 Mienfrs Z='O, volver a i? . . ;;_-r.
; x:xx:0116 MOV [3000], DL q~~rda indic_a cin de paridad
..
xxxx:OllA INT 20 Fin

~- instruccin JPE 111 que __s.igue _?._ADD _AL, [SI], ordena s_alta! ~l__a_jn_s?"u.~i-~~_q':!~ es.~ __~n _1'.J9_si al hci,cer l
Sl;lE)~_ AL.f. [SI] eI1 la suma anterior, ~~sl1lta _PE (paridad even, o sea paridad par); caso contrario (paridad
impar) continuar con la instruccin que sigue a JPE 111. .
L?..!~5-~r.u57_cin ADD AL, [SI] debe insertarse a los fines de sumar AL= O ms el nmero apuntado por SI, para
q\de_de acuerdo con est.e nmero p~eda detectarse la paridad del mismo. - '

Sistematizacin: INSTRUCCIONES DE SALTO CONDICIONAL t::.- --- ---- ------~ --.... ,, .. -


. L~-~ue b-..?-~~1? .Pr.imer. in.struc~~n _d~_s.alto ondi_ci()nar UJZ-~i~!llplific~~~' _si~e __de f!l()delo .Pf. cof!lpren_d er
c~~l !!_~~!_O.!~a instru_ c;cin d_~ salto.

Ur;a_i_i:.Str.i.:~ci?_n d_~ sa,~! ~on~_con~l sl_o ~f~~r.:_ ~-~.9~~--~~}~_ c~~-~i_ci_n _~~~ab,l~~ida para ~altar.
Si bien Ct1I1cf.se_'eje~l1t~yn.a i~tr.~cc~[l cie_s~l!<J..<:9.I'l<I~~I1'-:.U~ ~~- .det:rffiina. el_v~lor de uno o varios flags
combinados (realizando en este ltimo caso operaciones lgicas entre los mismos), en assembler la condicin
r~ede establecerse er1 foncn ~:~ sr unnilrr-tera
es--!i1~x~y;_Jg~ti~I~'~i11-~-~:~r- que-c1tri, debie~do existir siemp;e
una instruccin de compara"c:,n (r~sta) anterio.r ;i__la de !)aj to.
Esto hace que-CiertasTii.struccione~ d.e salto puedan escribir~~ d_ed_o_s_q !l!~ I11?Xl~n~s.
P~~-ejemplo,-la_' tnstruccin j~((J,;~p if Z=l) . ~s-~d~- ~~ el ejercicio6_es equivalente a JE (Jump if equal), dado
que la instruccin de comparacin anterio_r resta dos nmeros. Si elresultado de esta restq es cero (Z=1) impli-
ca_que los nmeros son iguales. Usar JE en yg~. c:i~JZ, p~rmite que el programador se desentienda de los flags.
~~~~i5-~':1 m?~~' :m_ed~ us_arse J~E (Jumpif not egua!) en vez de JNZ (Jump if Z=O).
.,., U3-16
~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

$ ( L~~. ill.~~~'-!.cciones J_~/JE y JN~[JNE se usan tanto para nmeros naturales como para enteros, puesto que _el
nn:i~J9_c::~ro. ti~ne. igual r~PX:E!S!i!~ta.cit?n.si1!11J?~i.c.a e11. J:!)P!iS das_es_d~ nn\er~s. __
Segn 1se ha visto
l
en ejercicios anteriores, las instrucciones de salto condicional para
- - - - - - -- - .. , ........ ------- - . .
nmeros
. .. . .. .
enteros,
. .
tales.co-
~o JL. y JG..' np utili~a~-~1!-. .~J~ le,_t_!,~~--~l1:1~.~~~~}9.~.f!!l-gs int~i:-yin~-~~tes, da_d~. que s_tos estn relacionados
::r.edia~_~e.~.E~~-<;:jcme~, l~gi~~s g~~ .i:!.E.!:..~g~a_f!.l~do~ .i:o__!l.E!S:~i_ta. I}ece~ariamE!nte conocer.~i re_ c ordar. Esto. es, en
ErinciEio si al restar A - B el resultado es negativo (S=l) y no cero (Z=O) implicara que A < B. Pero er, un
c(;~p~tad0,r (U?idad 4, P._gina_.B8) el~o n~ es.suficiente; dado que adems no debe haber overflow (V=O), pues
significara que el signo es incorrecto, o sea por un lado para que A < B, debe ser: S=l, V=O y Z=O. Por otra
parte si "e l resultado es positivo (S=O), pero si hay overflow CV:==l) implica que en realidad_es 5=1, por lo que
<
ta~bi~ 5~TA (si. S=O,_V=l y Z=O. Las dos situaciones.se pueden resumir as: A< B si S:t:.V y Z=O.
Tamjii~ par_a enteros se pueden_~jar_!~~-condi_~!~~es de sal_to JLE (Jump if less or equal) 3, y JGE (Jump if greater or
_equa~( L~ _co_ndicin_ J~E- ~uede -~esu~!se ~s en funcin de lo_s flags: ~ ~ B si S-:tN Z= 1.

Resum.Le.~~-..:!~.P.~.?~~pi?.. pa_r~-1~~ -~-~~~~-~-=~- imp~r.t~~te_t~i:i_~r pr_~~~t~ _l~~--~-~~~~~t-~ i~~t~~c_i_o~es de_~alt() c<;>_n_~lcl?_na~:


~( Para enteros: JL, JLE, JG, JGE, JZ, JNZ, JO, JNO
" l Par'!.l!?.~,_r_~l~~-: .. 1?_, JB_E, ~t\. ~AE , JZ, Jt';!Z
5 6

\
\ CQ.r.no y_a_se 9.b.s~ry,J.9sJ1~g~_!lQ2.QDJ.n.disQ~Jl.~a.i?l~s d~E]_~n~j_aq~~!:~.E~c_!:!_!:>_!_r en_i:s1~~!?.l!!!.:..

EJERCICIO 14
s~. tie~~ -~-. Estc:1 <i~. 11~1!1e!_s__~1:1.t_~_r?~..(~_~yte_~. c_~d.l . ~o) g,u.e ernrieza en 2001, siendo. qll:~ en 2000
~s_t.~. ~1:1.. ~~!1:git_l1? S_l!:m.ar <l:lgebraicamente dichos nmeros, y el resultado guardarlo en 15_0~ ..Y 150}.
~i aLs~rp.at.~~ nmero se produce -ov~r~~~,- -gi-dr-e- rsooy1501-rasuma- parcjal anterior_
cor!_~c:.t.~, }'._g~~~~:l.r en ~-?_Q_x)601)a. ~~~cciE d~ dicho J:lmero que prociujo oyerflow. Asimismo,
~i):iay over~l~w, escribir Ff_en_la direccin 1502; y si_no lo hay, escribir 00 en dicha direq::in.

.-6.100
~g:.Q1QP_l\JOY C~,J~QOOL Carga_e_n.CI.. la)ongitud de la lista
x~-~-~O.W_4_ _~_ov ~~~}00_!__ SI ~l!_nta al_~orr.iie!\Zo cie la_li~t~ ~~_da~?S
__ _SUB
xxxx:0107_ AX, AX
--
... ____,.....

xxxx:Ol09
MOV DX, AX..
.... ...._. _...... . Pone AX en cero
Guarda una copia de AX en DX
xxxx:OlOB ADD AX, [SIJ Su~a contra AX un nmero d~ la llsta apuntado por SI
xxxx:OlOD JO 130 Si overflow (V=l) saltar a 130
xxxx:OlOF ADD SI, 2 Incrementa SI en 2, pues cada dato ocupa 2 bytes.
xxxx:Ol 12 DEC CL Decrementa CL
xxxx:Ol14 JNZ 109 Mientras Z sea O, volver a 109
xxxx:Ol 16 MOV [1500], AX Guarda en 1500 y 1501 la suma total
xxxx:Oll9 MOV AL, 00 Carga 00 en AL
xxxx:OllC MOV [1502], AL Guarda 00 de AL en 1502
xxxx:OllF INT 20 Fin

A 130
xxxx:0130 MOV [1500], DX Guarda la suma parcial en 1501 y 1502
xxxx:Ol34 MOV AL, FF Carga FF en AL
xxxx:0137 MOV [1502], AL Guarda FF de AL en 1502
xxxx:013A MOV [1600], SI Guarda en 1600 la direccin apuntada por SI
\ xxxx:013E INT 20 Fin

~ ( ET\,.t:~l~ej~rcic!Q,_q_~J:l-9J.1q uier...9gn~~-e__<:.9.!!~!g~S..?..f&'.!~QQJ.a )Q~gj-~~!! .c:J~- ~.Jj?J.C!,. s~_p_pgr_c~, _Il'.l~ciiant~---


~. \ ~?;J~~7~~~~~~i~~~fi~f~~~~~~~~~~~~:=~ha~longitud. e~ _::_~C::..~~~-:~_t_e. .:.a_:~,-~~~~~=~~:ci~I_l-~:..~~lto

1
1 JL (Jurnp if Less) tambin es equivalente a Jump if Not Greater than or Equal (JNGE)
1
2
JG (Jurnp if Greater) tambin es eq~ivalente a Jump if Not Lss than or Equl (JNLE)
3
/ JLE tambin es equivalente a Jump if Not Greater (JNG)
4
JGE tambin es equivalente a Jump if Not Less (JNL)
5
JB es equivalente a Jump if Not Above or Equal (JNAE) y tambin a Jurnp if Carry (JC)
6
JAE (Jump if above or Equal) es equivalen te a Jurnp if Not Below (JNB) y tambin a Jump if Not Carry (JNC)
03-17
EJ!!f:lCiq_( )___l_~
Se -~~~~--~~~.l .~~ . n.~-~~i:()_S _nl t_u_r~~~~ -~~-? _Ex_!~~~~da uno, q~~~~Ei_e~~-e_!!_~90!d~!end~ __ql;l_~J>!:!.
loJ:!gitu9-.~J~J~ -~-~ec~~~n -~9Q: Smarlos( y .el resu1tlc!Q.,(4~.b_t_?.t}.?. !?.~.t~)_ .P.19.i~_gr}Q_ .e nJfls_dir_ecciones
l?QOl, )5Q1,
AlOO
x~;zOlOO MOV CL, [2000) C~rg~~__CI:_l~_l?ngi_!~~-d!':}'-1 l_i~ta
~~~~x:q1_4 .M'y:_stiqooi ~egistro SI apunta al co.J:!lie~9-f!~_l~J~st?- de datos
x~~~OLOJ __S'GIJ.AX,_.t\X f.~ne -~ en cero
xxxx:Ol09 SUB DX, DX Pone DX en cero .i:.
xx><~~o10B A,onH~~, Ysfi Suma contra AX un dato de la lista
xxxx:OlOD ADC DX, 00 i1eya ~n DX la suma de acarre()S qu~ ocurrep cu_a_f!.49J~ SJ,!~-s sup~r.ln
el for:_~a._t() de J\~ _(}J~_c~__!?_0 ~ I?)(_+ 00 ~ S:a_rry =DX + Carry)
xxxx:Ol 10 ADD SI, 2 Inc_rementa SI en 2, pues cada dato ocupa 2 bytes._
xxxx_:OlP. _J)EC: ~-!- Decrementa CL
xxxx:OllS JNZ lOB Mientras Z sea O, volver a lOB
xxxx:Ol17 Mby'[isoo], AX (;_~arda en y
1500 lSi iO-:S-J.~i~~i~f~ricir.g?._<l~ 1,suma .; .
~-~~x :OA MV [1502], ri_
x _____ _ _~ua_rda_ e.111502 y 1503 l_QS 16 b_its superiore.$__ c;ie_la_suma
xxxx:OlOE INT ~~ Fip_.
'\
La instruccin ADC DX, 00 es n~~saria,....Qp_c!_g_que l<! suma de dos niilllern.Uliltur.a~~~-c:l~l.~ .b.~ts-~~de _Q_ar
c9~~ r:_e~~!~-~.<:> ~--n!!_le!~. 9-_e_}_~i-~ _ ~i-~~Y-~~~rY:.Ett_ ese ca_so,_c_ada vez_que ellp _ocu~ra hay que ir sumapdo eL
\
.
).
~ u
)'
l

bit ~.':.5~~ry__~_l_!_:gistro_!?X, e!~gi,9:~ .E~_r~JE.'.1-_c_l!?:t~l~_n.d() !o_c;~s,)()~ _ C!l;q:y _qe; -~e_ pr9q._~i;an .. D!;!__ _g?ta.J9Jffi$l,__la ~ ~
.,
suma _R~!ciaJ_y_l~~!~L~:_~Q~E~~n._de}? l:>it s.! ?.~..J~s,,cu~les l()~- -~6 ,;nenas significa~iY.Q~~.S-~~-E-~!1:.M,_.~Le_ng_o,. i
que los 16 ms ~Jg!!ifac;.a:_t~y~ se_g~!l.I9:~1'!:-~n..I?.~-, j
/
_. - ,
EJERCICIO 16 . . ""- :: . - . , .... . 1

Se.tiee \i!iTtiis~~-<!t:__~~.P:!eros ente!._o~__ql::l,e__~C?..!n.~~!l~~-e-~_la tj!t:~~c;_c_!n .?Q_q~zx..~~Y-~}.~1.1.S.!~.d.-.!.s~~ -~!a .. .~


direccin 1500. C~!ltE _0lnt9~ ne_g~-!~Y-?...Y.PO.~~tjyg~ Zi.a.YJlQ?. _c;_~~Qs.)}q,..?.~ f!!~:nfon):__y_s_ep;:ai:los...en..
~Lf>Ja.__qe ~mpi~~~!1...~~-__3_QQO _y_:4_Q_q9,__ ~~sp~-~~2-.Il1J~t~.:..~~--c_u~n~~.:.9-C: . n~g~~~~-~.. Y.E.~S~~~<?_S
gyardarla en la?_q_g:~-~Si~nes 1600 y 1700, respectivamente. . -
-- ~- -h -- - ---------- - -~ ---------~~ --i::--
' .. : 1 -_,' :~-"~~J'~ ,. ~

,.
A 100 ... _;.. ;., .
xxxx:OlOO MOV CL, [1500] C.a.rga ~.~- ~_L}t longi~d-~l~_!i~!_~
x.'.l'.is~:o~_9r-M:9.Y ~~J~~~~tj~ El_ regi~_ti:~..S.! _ap~_n!a. a_!.~<?!"0..i.~~~9_e}~_li~t.~.?~e~!!:~".!~.
xxxx:0107 ~Q_~_!)!,_ 3.~9..0.. _ DI _~pun~a al_~o.J1lieri~<?__d~,la _li!'t_a ~-E'.n:~ga~ygs :.:> .
xxxx:OlOA MOV BX, 4000 BX apunta al comienzo de la lista de positivos ~.
_)(xxx:orntr~sy~ J?~,):JK .. DX se lleva a cero . . . . .. . .
xxxx:OlOF MOV AX, [SI] c~~g~ ~~~ -i\~--~~"~~o ~~ -~..!i.~!_~_eP.~l}t_a_d_a,_pgr s1
xxxx:j ff--~Mf AX:( --- ~9!XlP<!ra eJ. dato en A2<.<;:Qnh~_O
xxxx:Ol14 JL 130 ?! .i:s__negatiy? sa~ta. .a:J30 . ~-
x-xxx:Ol 16 .. JG-40 Si es positivo salta a 140
xxxx:Oi18--A[)j... SI, 2 Suma 2 a SI
. x-;~~:OlB.. DEC .CL Decrementa CL
xxxx:OD JNZ lOF. Mientras z,;:,0,~olver a lOF
xxxx:OllF MOV [1600], DL Guarda la cantidad de negatiyos_e~JOO
xxxx:0123 MOV [1700}, DH Guarda la cantidad de_ po?itivos en _1 700
xx;X:O27-- -it,Vi io .. Fin
------.- -
A 130
xX'x;(~llB INC DL I_ncrem~_nta P1....
xxxx:011F MOV [DIJ, AX Guarda nmero negativo en lista, _apuntada po~ DI
xxxx:os ADb DI, 2 Suma 2 a D I
x~~-x:Q:JJ~)MP1j8 - saTfaaTfs -- ----- -
A 140
i2ci('x:Qll.B.. JNC PH I!l~rementa._ Q!i _.
xxxx:Oll F MOV [BX], AX Guarda el nmero positivo en lis ta._apuntad_a por B.X
xxx-x:Ol 18 ADD BX, 2 Suma 2 a BX
-'.'~~Q~!f! ..1MR ns Salta a 118
--- -----
De__ ~.a:b.~Es':.!~.a.l!!!.~ '::1'.1..9iagrama lgico, existiran dos rombos consecutivos, uno para JL y otro para JG.
, - ---- -- -~- .. - -- ----- ... . - - . . . - .. - . - " .. . . .- ..... .,...... _ ...;..
U3-18

EJERCICIO 17

Existen dos listas de igual longitud de nmeros enteros (2 bytes cada uno), que empiezan en las
d_irecciones 2000 y 3000 respectivamente. La longitud -est e .. Ia d ireccn lSOCf Comparar los
r._...meros Correspondientes, y _dejar todos Jos elemeJ!t_OS m_e n9_res en una lista, y los mayores en otra.

AlOO
xxxx:OlOO MOV CL, [1500] Carga en CL la longitud de las listas
xx.xx:0104 . MO.V SI, 200~ _ Registro SI apunta al comienzo de una lista
. .~ ~,xxxx:0107 MOV DI, 3000 Registro DI apunta. ~J .comienzo d~_l~._2tra li.s ta
. t''..
xxxx:OlOA MOV AX, [SI] Carga en AX un nmero de la lista apuntada por SI
. :
xJQ<x:OlOC MOV. BX, [DIJ Carga en BX un nmero de la lista apuntada PC?r DI
~xxx :OlOE CMP AX, BX Compara los nmeros correspondientes de ambas listas
xxxx:Ol 10 JL 116 Si AX< BX saltar a 116
xxxx:Ol 12 MOV [DI], AX Ll_eva a la lista apuntada por DI el nmero mayor
xxxx:Ol14 MOV [SI], BX Lleva a la lista apuntada por SI el nmero menor
xxxx:Ol16 ADD DI,2 Incrementa DI en 2
XX~>::Ol 19. .t\_DlJ. ~1,2 Incrementa SI en 2
xxxx:OllC DEC CL Decrementa et
xxxx:Ol lE JNZ l _OA Mietras z;o; volver a lOA
xxxx:0120 INT 20 Fin

S..e_t.i~n~JJJLDY._~~ro.. de.c4nLc;:_o_9iij_c_~q_o__e~ _AS~.II, co~parte entera y parte fraccionaria separadas


por un punto (codificacin 2E en ASCII). El nmero, como se indica, ocupa n posiciones
co~~~c-~~-va:~:-d~~~~-i.9.'#~~-:~~-P..~f~if ..~e )a _ ~irecdn 200~,_ ~iendo que en 2000 se indica cuntas
P.OsiciQ!l~~-~-t1P ~D c.~_s9__qu_e_.~- tr~te <:le un nm~! entero, sin parte fraccionaria, no lleva punto.
Re~JJJ.plizar lo_s qgitos. _fr~fi.onar._iqs q\le ~stn a .ia derecha del punto, por el cdigo ASCil del
espacio (SP = 20)._
Ejemplo:

2000 05 2000 05 2000 03 2000 03


2001 34 (4) 2001 34 2001 39 (9) 2001 39
2002 33 (3) 2002 33 2002 36 (6) ===> 2002 36
2003 2E (.) ===> 2003 2E 2003 38 (8) 2003 38
2004 35 (5) 2004 20 (SP)
2005 30 (O) 2005 20 (SP)
Antes Despus Antes Despus

AlOO
xxxx:OlOO MOV CL, [2000] Carga en CL la longitud de la lista
xxxx:Ol04 . MOV st2001 Registro SI apunta al corrlienzode ia lista de datos
x~xx~0107 MOV AL, 2E Car-g a 2E en AL -
xxxx:0109 MOV BL, 20 . Carga 20 en BL
xxxx:OlOB CMP ~~!JSIL_ . Comp_ara AL con el nmero apuntado por SI
xxxx:OlOD JNZ 114 Si no son iguales (no ~ay un punto) saltar a 114.
xxxx:OlOF DEC _" <:J. Decrementa CL
xxxx:Olll INC SI Incrementa SI
xxxx:Ol 12 MOV [SI], BL El c~ntenido de BL (20) se guarda donde apunta SI
xxxx:Ol14 _INC SJ Incrementa SI
xxxx:Ol15 DEC CL. Decrementa CL
xxxx:l17 JNZ _lOB Mientras Z=O, volver a lOB
xxxx:Oll9 INT 20 Fin
U3-19

EJERCICIO 19
La siguiente secuencia puede ser p_~~te de un programa para verificar el estado de la memoria de
U!!_computador. Se tra_ta de _escribir ocho "~~s:' en_ cada una de las posiciones de memoria que_van_
de la direccin 4000 a la 5000. Luego se debe verificar que realmente existan ocho "unos" en cada
Zi~a: --de la~ posic-i ones escritas. i.a direccin de las posiciones que no pr0senten ocho "lli1os"
(p_~sisi~!l~~~~fe.~_t_tl<_:>Si~)_ 4e.b~n guardarse en una lista que comien_za en la direccin 2oqo.

A 100
xxxx:-OiOO MOV S_I, 4000
xxxx:b103 MOV DI, 2000
xxxx:Oi06. MOV -AL,--FF ..
xxxx:o108M:ovlsfAL
xx_x;x::Ql1A IN~ -~H . .
El r_e gistro SI apunta a la direccin 4000
DI apunta al comienzo de la lista de direcciones
AL se carga con 8 "unos"

Incrementa
. - .... - SI .

E(co-ntenido""de ACpasa a la posicin ap~~t;da por SI_..
1
('. : , .: ' :~~ :_\ t' (\.
-: -~. -~ .
'
t ,,
.
xxxx:Oll B CMP _SI, 5Q01 . C~IEP.~~a SI con _5000 + 1
xxxx:OllF JNZ}~_B _
xxxx:Oll l MOV SI, 4000
xxxx:0114 MOV.-AL, ts
Mientras SI no sea 5001volvera108
El registro SI apunta nuevamente a la direccin 4000
El contenido de la posicin apuntada por SI pasa a AL
!
-
xxxx:Ol 16 CMP AL, FF Compara el contenido de AL con FF
x~xx:Ol 18 JZ llA Si Z=l, ir a llA
xx~:OllA MV[DI], SI Guarda en la lista apuntada por DI la direccin (de 16 bits de_~!)_9_i;:_tl_~!l
posicin que no contenga 8 "unos"
xxxx:OllC ADD DI, 2 Sma 2 a DI (las direc:iories ocupan 2 bytes)
xxxx:OllF INC s1-_ ---- Icrement sr --- -- --
r
xxxx:0120 CMP SI, 5001 C~mpara SI con 5000 + 1
xxxx:Ol24 JNZ 4 Mientras SI no sea 5001volvera114
xxxx:Ol26 INT 2o'
l.

, .,. .,
. ..
~
~
.
'"e'!"
'
. "
<," "1

. '
,
' .
- .
--...... .
-:\p ..
,.

S~l~I}~ ,_w_}~Jitl de nmeros enteros de un ~y~e :c~da,u~o, . que_~mpieza _e_~ Ja d~~cdn 2000,
siendo que su longitud est en la direccin 1500. Pasar. los nmeros a otra lista, donde cada nmero
Q.<;~pe 1_6 bit_s, de modo que a' los nmeros con bit-de' sigo o
se le-agreguen 8 -c~~s a la G:qi:iierda, y
a los nmeros con bit de signo 1 se le agreguen 8 nos_ ra.izqi~rd'" (prop_
ag-ci" de signoy: -
A 100
~~X)(_:O!O_Q !Yf9V CL, [1500] C:arga en CL la l()~git:i_g_c;!e}~ !i~~!i
xxxx:0104 MOV SI, 2000 El registro SI apunta al comienzo de la lista de datos
xxxx:O67 "- MdV DC.3000 DI apunta al coriUeiio de la-lista. -de i.esult_~~~S. -
xxxx-:blOA MOV A( [sir - "'Carga en
AL' un dafo de la lista apuntada por SI
xxxx:iac c"Mr Ai, o --- Compara el dato en AC contra a -. .
xxxx:OlOE . JGE 130 - o
~C~s mayor igual que O (positivo) s_alt0: a BO
xxxx:ono JL -140 Si es menor que O_(negativo)__salti -~ 1_49
xxxx~Oii2" INC SI Incrementa SI
xxxx:0113 ADD Dl,2 Suma 2 a DI (los nmeros resultantes _c:>cupan 2 byt~s)
xxxx:Oti'6--DEC CL . Decrementa CL
xxxx:Ol 18 JNZ lOA Mientras Z=O, volver a lOA
xxxx:OllA INT 20 Fin

A 130
. :::'~_x:Ol04 MOV AH,_90 <;:arga 8 ceros en AH para propagar sign()
~~~x:_OlOA MOV [DI] 1_AX ~!irga en la lista apuntada por DI el nmero de 16 bi_ts
-~xxx:OlOA JMP 112 Salta a 112

A 140
x_~-~~-:Q19:4___ MOV AH, F_!._ S,arga 8 unos en AH para propagar signo
?_<xxx:OlOA MOV [DI], AX ~arga en la lista apuntada por DI el nmero de 16 bits
x~xx:010A . JMP 1~~ Salta a 112
U3-20

~JE~~IS_I.~ _21_
Se tjene dos listas L1 y L2 de caracteres ASCII de igual longitud, que empiezan en las direcciones
20Q.Q~y-~@. .r~~R~ct~v}ftE;,~t.~ :- ~aiOgtucfde 'cbas est en
la diieccin-iSd:D"etermmarerorden .
al~~!:>~tico_ de una respecto de la-otra, de
forrr;a tal que Li sea si primera
en orden alfabtico, o tiene
~g:ia~ ?.:~~11: ~1.!~?~.~~-. q~e..~2!._ p~n:r 00 en la direccin 1600. Si L2 va primero, colocar FF en 1600.

: 2000 ~1 (A) . 3000 ~1 (A)


2001 42 (B) 3001 44 (D)
2002 41 (A) 3002 41 (A) .

A 100
xxxx:OlOO MOV CL, [1500] Carga en CL la longitud de las listas .~.:~..
xxxx:i01rMav s1;2000-- Registro SI a punta al "c omienzo d U!l_li~t~
xxxx1>ii... Mov 01, 3oi bI apunta al comienzo de la otra lista .
xxxx:OlO MOV AL, [SI( Carga en Al. un dato de una lista
~xx.x:oioc cMP AL [ol c~~.P~i~-:~_r~ato ~n:-At con el correspondiente dato de la o~a lista
xxxx:Tof-Js120 " Si es menor salta a 120
x:XxX:ono JA" 130 Si es m ayor salta a 130
xxxx.:0112 INC . ~l. Incrementa Si
xxxx:0113 INC DI Incrementa DI
xxxx:Oll4 . DEC CL Dcrementa CL
xxxx:Oli6" JNZ io. Mie~tras Z=O, volver a lOA
xxxx:Oll8 MOV BL, 00 Pone BL en cero
Xxx~:OllA MOV [1600], B.J. -Guardaresitado
.. en BL
- ... . -- . - .
"

xxxx:OllE INT 20 Fin

Al20
xxxX:0120 MOV BL, 00 Pone
.. . BL en.....
cero.
-. - - 4 t.~ . ~
X_'.'XX'.9.1??. ..~{)~ . (iifooJ;)L__ Guarda resultado en BL
" xxxx:0.126 .Ifl:lT . 21_) .B.!.!. .\~

A130
xxxx:Ol30 MOV BL, FF Pone BLen FF
xxxx:Ol32 MOV [i6oo],'BL Guarda resultado en BL
xxxx:1~~ . INT 20 . Fin

EJERq<;_I~ . .~.2.'.. uso del modo indirecto por registro con desplazamiento mediante valor de registro
De las direccion~~- de. ~e~~;~ 2o-o~ .zoo9--~~- -tiene ~~ lf~t~ -~on os-~~~-drados de los nmeros
b~a~is-"dei'Oaf9~ Eri ra.-5..dirccines 3oooy 3001 se tiene dos ntim~r-os .Ni y N2, 1:1aturaies de un
byte,":omjiierididosentre O y 9 inclusl.ve. Se ne.cesita .sumar los cuadrados de Nl y _ N2, y el
___
resu1tado 'dejarlo en 3002 y 3003
.. ------ ------ - --.. - -
_. ~

3000~1
2
2000 00000000 (O= 0 )
2
2001 00000001 (1 = 1 ) 3001
N2
(4 =2 )
2
2002 00000100 3002
2003 00001001 (9 =3
2
) 3003
2
2004 00010000 (16 = 4 )
2005 00011001 =
(25 5 )
2

2
2006 00100100 (36 = 6 )
2007 00110001 =
(49 7 )
2

(64 =8 )
2
2008 01000000
2
2009 01010001 (81=9 )
U3-2 1

A 100
xx~:OlOO MO.Y S!, 20og SI apun~a al comie.~ o cie_la lista de d_a tos_
-~;;:(n3 sus AX, AX Pone AX en cero
xxxx:ios SUB BX, BX Pone BX en cero
xxxx:0107 suB
ox; DX .. Pon DX en cero
xxxx:Q!.Q~. _)'v lQY _~(_(30Q_Ql <;:~r_g~_!':J_l _~z: _I?~ ._
?'?'Xx:OlOD A.QP.S_I, "Q~ Registro SI apunta a 2000 + Nl...
xxxx:OlOF MOV AL, [SI] (N1)2 se lleva a la mitad inferior de AX
xxxx:Ol 11 SUB SI, D:X Ei puntero SI vuelve al valor 2600 .... -....
xxxx:Ol 13 MOV oi., [3001] Carga N2 en DL
xxxx :0117 ADD SI, DX - Registro SI apunta a ?QQO + N~-- -~......,:;:
xxx~ :0119 MOV BL, [SI] - (N2)2 se lleva a la mitad inferior de BX
xxxx:OllB ADD AX, BX S~ma los cuad~ados, y rese~a para_e_l.r.E'.5-.~~ti!d_<?_ ~ re:gi_~.!() ci~ 16_~_its
xxxx:OllD MOV [3002), AX Guarda
Fin . .el. resultado
. en..3002
. y 3003
- .. ..
J<;xx ~o20" INT 20

qtra forma ms compacta de_ escr.i?._i~- ~a ~~~.l!~~da_ a_nt~~i~r


A HJQ.
XX?'X:OlO() _ _MQ:V __ SI,)l)Q_Q SI ap'!-lllta al comienzo de _la lista de datos ...
xxxx:0103 SUB AX, AX ~01.w.AX e1::t. ser.~ -
-~xx~:Ql0?.:.-~~_!!__!3~, BX Pone BX en cero
xxxx:0107 SUB DX, DX -Pone
. ....._. D)( en
' . . cer
.. -
xxxx:o109 .. rViovsCc3ooJ Carg~_.Nl e_ n ~~- (~_o~ B.t f. :=._Q)
x;(~x:10..MOV.t;Tsf+BX] (Nl )2 se lleva a la mitad inferior de AX
;()(i<~:O>F.. -MOV si, [30011 ... ca!i_~2. en sl.. (~on _ BH; ar -
d - - - - -

~xxx:fl 3 MOV i.;ts +BX] cN2)2 se lleva a la mitad inferior de DX . .


"'xxx:Ol 15 ADD AX, DX
xxxx:Ol17 MO:V [3002], AX
Suma .. los cuadr~dos,
. . y
Garda el resultado en 3002 y 3003
reserva
.
para el resultado
:
un
. . .registro
. ;1 '. -1.
de 16 bits,

.
Fin
. . ..,.......
,...
.) .. ~
T..,.,,l~ "
xxxx:Ol lA INT 20
. ~ ~f

{ La instruccin MOV DL, [SI + BX), que tambi~~ se puede escribir MOV .DL, [SIJ . -: [B2(], est en "modo de
1 i iYeccio1iamiento indexado". ~ .
----
... . ----. - - -...-...-...-.,.--.. ..-..-.:.-..

P!y_idir . u11 fl_fl!.~t. rrntural de 3_2 bit_s que est a partir de la direccin 2,000 por otro .natural de 16
:-1
bJt?..q~~-~~-~~- ~!!.!~ 9-~recci.?.!l_lq~~- El _resultado_guardarlo en 15_0 0y1501; y e~ resto en 1502 y 1503'. .
L_C?,s _16 bits de ms peso de los 32 bits del d ividendo deben ir a DX; y los 16 de menor peso a AX. El divisor
debe ir a CX. El resultado .q ueda en AX '(~ debe sup:rar 16 bits)~ y efresto va a DX. . . .

_i\__~9--
~'SX~~OJQQ_ MOV AX, [2000] Carga en AX los 16 bits inferiores del dividendo
xxxx:Ol03 MV t>x:oo2j Carga en "fosl6
bX hits superio res-del dividendo
xxxx:Ol7 .. MoV ex, IioJ Carga en CX el divisor
xxxx:OlOB DIV CX Realiza la divisin
x'x. xx:Ol D MOV
. ... . [1500),
. - . . .AX
. .. . -uard a ~n 1?00 el cocienti:.
xxxx:Ol lO MQV [1502],DX Guard a en 1502 el resto
. x'p~x:Ol H __ U~I..:ZQ . -f.~ . .

.EJERClc.IQ --~~ -
Se__Ji~ne una lista de nmeros naturales de un byte, que comienza en la .direccin 2001, cuya
long~tud se indica en la direccin 2000. Hallar el promedio de dichos -nlfo-ieros,". j" guarda.r lo en la
direccin 1500
.. /-}
U3-22

AlOO
xxxx:OlOO MOV CL, [2000] Carga en CL la longitud de la lista
xxxx:0104 MOV SI, 2001 si apunta al comienzo de fa lista de datos
xxxx:Ol07 SUB AX,AX Pone AX en cero
J<:XXX:l09 .. ~!?.I?_ ~L,_!?I! Suma a AL un nmero de la lista apuntada por SI
XX~)C010B ADCAH,00 Lleva en AH la suma de acarreos que ocurren cu;mdo las sumas superan
el formato de AL (Hace AH<= AH + 00 + Cmy =AH +Carry)
xxxx:OlOE INC SI Incrementa SI
xxxx:OlOF DEC CL I).~~srementa CL
xxxx:Olll JNZ 109 Mientras Z sea O, volver a_l09
xxxx:Ol13 MOV BL, [2000] Carga en BL !a cantidad de nmeros de la lisl~
xxxx:0117 DIVBL Hce- AL 'j BL;-eI cociente va a AL, y el resto a AH
xxxx:Ol19 MOV [2000], ~~- Guarda en 2000 el resultado de la divisin (el prom~dio}
xxxx:OllC INT20 Fi

EJJ!Rpq9~_?.!.....E~~-E.!:}~strucciones ANO, ROL y OR


- '--~-. -- ~ -- -.-~ '
.. ~e. ~ -- -.. ,_
---- -.- - - - - . ...... ...

S_e tiene a partir de la direccin 2001 una lista de dgitos aislados codificados en ASCII, que ocuran
un nmero par de posiciones de memoria. Este nmero se indica en la direccin 2000. Conve ~ir
cada dos dgitos ASCII consecutivos-en un byte BCD empaquetado, que se almacenan a partir d. !.a
direccin 3001

Ejemplo:
DATOS
xxxx:2000 04. 31. 32. 35. 38
RESULTADOS
xxxx:3001 12. 58.

AlOQ_
xxxx:OlOO MOV DL, [2000] Carga en DL la longitud de la lista
xxxx:Ofo4 . . MOV SI, 2001 Inicializa SI para que apur.te al comienzo de la lista de datos
xxxx:0107 MV nt 3oi Inicializa DI p.ia que apunte al coqnzo de la lista de resultados
xxxx:OlOA MOV AL; [SI] Carga en AL un dato de la lista
xxxx:OlOC MOV ..J,;-[sI+iJ Carga en BL el dato siguiente de la lista
xxx~:_QJOF _ .4-J'~jj~:AL~ OF Pone en Ofos 4 bits ms altos de AL .
xxxx:Ol 11 _..AND _BJ,,_.Qf. s4-b-Hs Is-aHos-del3L
-1';~~-en _b_!O_
xxxx:Ol14 MOV CL, 4 Prepara CL para indicar 4 rotaciones
xxxx:.01!6 .. ROL_ AL,<;~ Rofa. 4 veces el contenido de AL
xxxx:0118 ORAL, BL F9rma el byte empaquetado
xxxx:Ol lA MOV [DI]; AL Garda el byteempaquetado en la otra lista
xxxx"':'OllC INC DI DI apunta al siguiente lugar
xxxx:Ol 1 D ADD SI, 2 SI se incrementa 2, pues ya se tomaron dos datos consecutivos
xxxx:0120 SUB DL, 2 A la l_o ngitud se le resta 2, pues se tomaron dos datos consecutiv-o-
xxxx:Ol22 JNZ lOA Mientras Z sea O, volver a lOA
xxxx:0125 INT 20 Fin

La in.~truccin AND AL, OF realiza bit a bit la operacin lgica And (A) entre el valor de AL y el nmen 1 ~)F,
c~fQrl!I~ ~ 9.jd1a_operacin A~d: O A O= ; O J\ i -= O; 1 A O= O; 1J\1 =l. .
Sp_oniendo _que en AL se tenga, como ei1este ejemplo 3, la operacin ser bit a bit: 00110001 = 31
A 00001111 = OF
00000001
D~_ esta manera, mediante la "mscara" OF se enmascaran los 4 bits superiores de 31, obligndolos a ser ceros,
mantenindose sus 4 bits inferiores. -
~~_instru~~i~-~~-~--1.l~~_da en este ejemplo- ROL AL, 1 (ROtates a register Left =rotar un registro a izquierda)
ordena rotar el contenido del registro AL-hacia.a i;;qu'ierda confOnne indican-fasflechas de la figura 3.21.a.
~~~o~~s;C:~::~~lfs~-'_0uv na poskin hacia la izquierda, siendo que el bit de la extrema izquierda se
la
reinyecta a derecha. La .flgura3.ii-muestra e1rsli1faclo-en
AL de ejecufr l instruccin.
Eiflag e toma~ valor d~l bit que-q'ueda en el exti-'emo izruierdo deAL (o el registro que sea).
U3-23

e
D Figura 3.21.a

e
[] Figura 3.21.b

Para rotar ms que una posicin, se debe poner el nmero de p~sicione~_ a rotar en el registro CL en la instruc-
_c;,n anterior {~~.~~i:_stro caso me~iante MOV CL, 4) y luego escribir ROL AL, CL (si se usa AL):
En el ejemplo de la se_c:uencia anterior, antes de ROL en AL se tena 00000001, por lo que luego de ejecutar
ROL se tendr 00010000, resultando C =O.
T~~bin exist~ la i~st;ucin ROR (ROtate a register Right), de funcin semejante?- RO~.

EJERCICI0.26:
U~ n~~ero ~~e est en la direccin 1500 agregarlo al final de una lista no ordenada de nmeros de
- - - - - - - -- __.,._ -- - - - - --- - , + + - - _ ,_. o. _ ...;., , - - - -- - _ . - - Co A~-- ' ....... -- + - -- ~- O - O -- . ' o+ .. + - - - '' ---

~-~--l?Y~~--9-1!-~--~gipi~?:.en ?091. si dicho nmero no se encuentra en la lista. Asimismo, aum,e ntar en_
u_1.l9. _~1.. ~~m~rg~~---~_le_~_~l} t2?: 9,~ _l~ gs ~l.. 9.lJ.~ ~s~~ en)~ 4_ire~~!~J]._'.?.Q9 ~. -

A 100
xxxx:lOO ~QY R_.L,__oo_ Asume on la indicacin~~-"". 00 q~.e e.!nlT\~rg__:i:i,o _e.?! _e!:lla_lii;ti.
;i(~)(jjfoi' MOV CL, [2000] 'targa en CL la longitud inicial de la lista -
~~-x~:i6-i\1ov 51, iioi-- Inicializa SI para que apunte al comienzo de _la lista
:xx-xx:oo9 _
Mov--A.'c,-rsiJ carg-a en -xc lin dato de la lista - .. -
~-~xx~QWl? ..G.MX .A-J;., p.sop] Compara el niii:nero que.est en AL con el que est en 1500
J0'.'_)(:QJ9!:__J~;Z__g~ s{i= (los .nme-ros-compai-ados- saltar ~Ti3 - son-dlsii.tos\
xxxx:O_lJ J.___MO_V ..!JL, _!.'.!.'. Si Z=l indica con FF en DL__q~e. el J;lrn,~ri:? ~~t~ ~n_la._ lis!a ~ ... .
,;.~

__ ,. .. . SI
xxxx:0113 INC
xxx.x:Ol14 DEC CL
xxxx:0116 JNZ 10.9
Incrementa SI
Decrem~nta CL ... .- .
Mientr-~ Z=O, volver _a io~ ~1t
. .< ..."' '' -
. ..
>
xxxx:Ol18 CMP DL, FF C~rri.para 'el nmero que_e~t __~I1 P!:-__ c;gn.FF; .
~~~-ff~: f.~~I2X----- _ ~es FF (Z=l) sa!ta a fil'. pes el nTI1ero e~'t en la lista
Si Z=O el nmero no est en_la _lista( y lo p~sa _a_AL
1
xxxx:o11D MOV AL, [1500]
..X.:<xx:_0120 MOV [SI],~:( - Lleva -efnli;neroTfin~Yci~ la ~t~ _(El -i~g._SI _fue _inctem~ntaqo en~l lazo}
xxxx:Ol22 MOV AL, [2000] Carga en AL la longi~tj._ de la lista
xxxx:0113 INC AL Incrementa la longitud
xxxx:_D122 MQV [2000], A!- Guarda en 2000 la nueva longitud de la lista _
xxxx:Ol2A INT 20 Fin

EJERCICIO 27:
S~!i.~-~-ii~~~J1::;ta de n~meros naturales de un byte, que empieza en la direccin 2001, y se l.a q1,1!~;re
o~~-e~~!:__e~_!?_rfi1~ .c~~~i_::::!: La iongitud de la lista est en la direccin 2000
E.!_i::e_~ani~mo de ordenacin que usaremos es el de "burbujeo", como se ejemplifica.a contir~uacin

Inici() PriilJ.e_r _Luego del ler Seg:-indo Luego del 2do Tercer Luego del 3er Cuarto Luego 4to
Ordenam ordenamiento ordenam. Ordenamiento ordenam ordenamiento ordenam ordenam.
6 4 4 2 2
4 6 2 4 4
8 2 6 6 6
2 8 8 8 8

Los crc_u los indican comparaciones realizadas; y las flechas, los casos en que hubo intercarn(~_o__de lugar entre
do? nineros.
U3-24

A 100
~?<xx:Oloo . ~ov J?.1.-' 1 Asume con Ja indicacin DL = 1 que no se produjo ningn cambio
xxxx:0102 MOV CL, [2000] Carga en CL la longitud inicial de la lista
xxxx:0106 -MOY-SI~ 2ooi Inicialfza SI para que api.inte al comienzo de la lista
xxi<x:T9-~M9Y. -AL;_[$11 C~rga en AL un dato de la lista
xxxx:OlOB CMP AL, [SI+11 . Compara el n<imero que est en.AL con el siguiente
xxxx:019E JBE 11_~ Si es menor o igual saltar i17 para-seguir recorriendo la Jist!l
~~.:c~:Ql_~.9....~~liG A~, {SI_:t:lJ Inter~ambia el _co_n tenido de AL coi:\ el d e memoria apunta'do por SI+1
~.'<X.~~O}}_B_ MOV [SJ], AL Guarda el nuevo contenido de AL en la direccin ap untada por SI
xxxx:Ol 15 MOV DL, O As.ume cc:i.la indicacin DL =O que hubo un intercambio
xxxx:Ol17 INC SI Incrementa SI
xxxx:Ol18 DEC ci.. Decrementa CL
xxxx:Ol lA JNZ 109 Mientras Z=O, volver a 109
~.xxx:Oll e'. CMP bL, Q_ Compara el nmero que est en DL con 00 .- ...-
~-

~x.~x:OllF JZ 100 Si es 00 (2'.=1) salt~ a 100 p_a ra iniciar_lll1 I1ll:evo ordenamiento


xxx~;Ol41 INT 20 Fin (recorriendo Ja lista no se produjeron ms intercambios)
. '

ERCICJ..~8_:_
Se tie~e una lista no ordenada de nmeros de un byte que empieza en 2001, siendo que su longitud
e~t en 2000. Si el nmero que est en la drreccin iSOO se encuentra en l~ l ista eliminarlo,
d~splazando un(l posicin hacia arriba los nmeros que estn debajo de dicho nmero. En caso que
!'.! se encuentre en la list_a, no m odificarla ..

! 2000 05 2OO 04
' 2001 20
2001 20
2002 52 2002 16
\ 2003 16 2003 98
\ 2004 98 2004 90
\ 2005 90

Se ha s upuesto que el nmero q~e est en la dir~ccin 1~00 es e_l S~

AlOO
xxxx:lOO . MOV CL, [2000] ~~~ga_en. ~L. la longitud d:e_la lista .
xxxx:0104 MOV . SI, 20001 SI apunta al comienzo de la lista de datos
xxxx:0107 MOV AL, [SI] Carga en AL "u."d.ato de la lista apuntada por SI
xxxx:Ol09 CMP "A.L; [lSOO] Compara el nmero que est en AL con el que est en 1500
xxxx_:O
__lOD JZ 120_ Si Z es 1 (los nmeros comparados son iguales); saltar a 120 .
xxxx:OlOE INC SI Incrementa SI
xxxx:OllO DEC CL Decrementa CL
xxxx:Ol12 JNZ 107 Mientras Z =O, volver a 107
xxxx:Ol14 INT 20 . Fin

A 120
xxxx:Ol20 MOV AL, [SI+l] Carga en AL el nmero que sigue al que apunt~_.SI
xxxx:Ol23 MOV [SI], AL G~arda donde apunta SI el nmero q ue estaba en la d ireccin siguiente
xxxx:Oi25 IN'<'.:-si ----- -- Incrementa SI
xxxx:0126
. . - . DEC CL
. . .
Decrementa CL
xxxx:0129 JNZ 120 Mientras Z=O, volver a 120
xxxx:012A MOV. L, [2000_) C~rga en AL la longitud de la lista
xxxx:012D DEC AL . Decrementa la longitud
xxxx:Ol2F MOV [2000], AL . Guarda en 2000 la nueva longitud de la lista
xxxx:Ol32 INT 20 Fin
U3-25

EJERCICIO 29: uso de la instruccin MUL para multiplicar nmeros naturales.


Secuencia que convierte una lista de nmeros de dos dgitos que estn en BCD empaquetado a
binario puro. La lista empieza en 2001, y su longitud est en 2000.

Ejemplo:
98 = 9xl0 + 8
10011000 BCD 1001X1010 + 1000 = 1100010 = 62 H

Si se multiplican dos nmeros de 4 bits (XXXX x 1010), el resultado entra en 8 bits.

A 100
xxxx:OlOO MOV DL, [2000] Carga en DL la longitud de la lista
xxxx:Ol04 MOV SI, 2001 Inicializa SI para que apunte al comienzo de la lista de datos
xxxx:Ol07 MOV DI, 3001 Inicializa DI para que apunte al comienzo de la lista de resultados
X:xxx:OlOA MOV AL, [SI] Car!a en AL los dos dgitos en BCD
xxxx:OlOC MOV BL, AL Cpia en BL el contenido de AL
xxxx:OlOE AND BL, OF Pone en Olos 4 bits ms altos de BL
xxxx:Ol 11 AND AL, FO Pone en Olos 4 bits ms bajos de..AL
xxxx:Oll3 MOV CL, 4. Prepara CL para indicar 4 rotaciones
xxxx:Ol 15 ROR AL, CL Rota 4 posicio_n es a la derecha el contenido de AL
xxxx:Oll7 MOV BH, OA El multiplicador BH se hace de valor diez
xxxx:Ol19 MUL BH M_11l~iplica Al, por BH y el resultado va a AL
xxxx:OlOB ADD AL, BL Sui:r.ia las unid ade~. ~l. p_r.09..u.~t<?..~.!~.!~~~fect_u-.qQ
xxxx:OllD MOV [DI], AL Guarda el byte empaquetado en la otra lista .
xxxx:OllF INC SI El registro SI apunta al siguiente lug~_:_
xxxx:0120 INC D DI apunta al siguiente lugar
xxxx:Ol21 DEC DL Decrementa DL
.' , .~.
xxxx:Ol23 JNZ l~OA fyfie11tras_Z=O, vol.v er a IOA . ., . .. . ......
'.
' .-
xxxx:0125 INT ......
20 Fin
.'
r+';:
. 1 ,
. .'

,.,.~ .... ... ,


EJERCICIO 30: ~t, . : .it. :~ ; ~...:l~.
~-2.el'.~~- c?-.~Je. ..c:!4~.cg_<)n. ~QQl ~~ ...tie.I}~ _urn1_ lsta de 11 __dgitos, ..q~l . O al 9, cg_gificados __en ...BCD, >:'':. _
S~~arlos en BCJ?, y_c:l res_ul.tl~() __ g~~-~darlo _e~}_a_A!i:l:~E!.!1 _1?Q,O.)~t!ll:Il!eJ;() Uo = OBH est err la !.\;~
direccion 2000_:

AlOO
.. xxxX:jn_Q.O__!'vI_OV CL, [2000] <:;:arga en CL la longitud de Ja lista
xxx;~:0104 MOV SI, 2001. R~gistro SI apunta al comienzo de la lista de datos
_;>c_xxx:Ol09 . SUB AL, AL . _!-lace cero el registro. .L . --
.xxxx:Ol09 AD.O AL, [SI] St,lma un elemento de la lista contra AL
xxxx:OlOB. DAA
xxxx:OlOC INC SI
C_Qrreccin para suma BCD
Incrementa SI
<---; A~

xxxx:OlOD DEC CL Decrementa CL


xxxx:OlOF JNZ 109 Mientras Z no sea 1, volver a 109
xxxx:Olll MOV [1500], AL Guarda indicacin de paridad
xxxx:Ol14 INT 20 Fin

EJERCICIO 31:
S~tiene=a-iista de nmeros de un byte que empieza en la direccin 2001, siendo que su longitud
est en la direcdn 2o6~ .besplazar cada nmero de la lista una posicin ms abajo.
betermiaf" sfeC~mer contniC.fo e. fa"<iiieccioii 1500--s- nalfaei\ la lista que . comienza en la
dii:ecdcm 2001, siendo qe la
longitud .de fa lista es.t en la direci~n 2000. En .c~so qe el nmer() .
citado sea WlO de los de la lista (salvo el ltimo), reemplazarlo por el que le sigue, ste por el
"51gwente, y as scesivamente, de. modo de recihii "fodas fos' "riumros que siguen . al hallado;
s_l.:l'l:>indolos 0ta posicin. Asimismo, restarle uno a la longitud de la lista que est en la direccin 2000.
U3-26

A~OQ..
x-~~x:OlOO MOV SI, 2001 R_egistro SI apunta al comienzo de la lista de datos
xxxx:Ol07 MOV AL, [1500] Carga 2E en AL . . . . .. . ..
xxxx:OlOA CMP AL, [SI] C_o mpara AL con el nmero apuntado por SI
xxxx:OlOC JZ 120 Si son iguales saltar a 120
xxxx:OlOE INC
~... ..SI
- - Incrementa s i
xxxx:OlOF DEC CL Decrementa CL
xxxx:Olll JNZ lOA Mientras Z=O, volver a lOA
xxxx:Ol13 INT20 Fin

A 120
xxxx:Ol20 MOV BL, (2000] Carga en BL la longitud de la lista
xxxx:Ol24 DEC BL Decrementa la longitud de la lista
xxxx:Ol26 MOV (2000], BL Guarda la nueva longitud de la lista
xxxx:Ol29 DECCX Decrementar CX
xxxx:Ol2A JZ 136 Si es el ltimo elemento de la lista saltar a 136
xxxx;012C MOV BL, [SI+1] Si no es el ltimo, cargar en BL el elemento siguiente
xxxx:Ol2F MOV [SI], BL Guarda en el lugar de un elemen to, el que le sigue
xxxx:Ol31 INC SI Incrementa SI
xxxx:0132 DEC CL Decrementa CL
xxxx:0134 JNZ 12C Mientras Z=O, volver a 12C
xxxx:0136 INT20 Fin

EJERCICIO 32:
Se tiene ~a-sta de nmeros naturales de un byte, ordenados en forma creciente, a partir de la
dire~~i6!\~.7_Qbj; .sf_end6 que en la direccin 2000 est la longitud de dicha lista. En la direccin 1500
~~- titme t.m.. nmero. natural de un byte. Intercalarlo segn su valor en ia lista citada, reubican9:c
una posicin ms abajo cada uno de lOs.'n meros de la lista que le siguen (salvo que sea el ltim~)
Asimismo, incrementar en uno la longitud de la lista, que est en la direccin 2000. Si el nmero a
tD.~~rcal_ar ya se encuentra en la lista, sta no debe modificarse
... .."
AlQO__
'5.~~-~:Q.100 .MOV ~L, [2QOO] Carga en CL la longitud de la lista
xxxx:0103 . 1\1.0V _SI, 2001 Registro SI apunta al comienzo de la lista de datos
xxxx:0107 MOV AL, [1500] C~rga el nmero a intercalar en AL
xx~x:OlOA
. -CMP
.
{SI],
.
AL.. ...
' ~
Co~para el .nmero apuntado por SI ~on AL .
xx_.ip;:OlQC _JA 129. ~i. el nmero de la lista es mayor hay que intercalar, saltar a 120
xxxx:OlOE JZ 115 Si son iguales (est en la lista) saltar a 115
xxxx:OO . INC . s:t Increrrien ta SI
xxxx:Oll 1 DJ~C CL Decrementa CL
X'.l!:xx:QI3 J~Z lOA Mientras Z=O, volver a lOA
xxx~;O))S INT 20 _fin

A120.
xxxx:0120 INC CL Incrementa CL, pues hay un elemento ms
xx.xx:0122 . MOV AH, [SI] Salva el nmero que apuntaba SI en AH
xxxx:0124 MOV [SI], AL Guarda el nmero a intercalar (u otro) donde apunta SI
xxxx:Ol26 MOV AL, AH Lev a AL el prximo nmero a "bajar"
XXl<l'=Q.12 . INC SI Icrernenta SI
xxxx:0129 DEC CL Decrementa CL
xxxx:Ol2B JNZ 122 Mientras Z=O, volver a 122
x~~;o12D MO_V Ai, [2000] Carga en AL la longitud de la lis ta
xxxx:Ol30 INC AL Incrementa AL
~J:<_lq<;0134 _MO~ [~~OO_!,_ :\!-_ Guarda en 2000 la longitud de la lista incrementada
XX)<X:0135 INT -~- Fin
U3-27

EJERC_IC_I()_}~_:-
Se tiene una lista de caracteres ASCII que empieza en 2000. Determinar el nmero de caracteres
enh"~ el caradei:-02 = STX (sfart of text), y el carder 03 - ~ ETX (end of text); e indicrlo e~ I
d h-ec~in isoo ---- ----------- - --------- ------------ --------- - ------ ---------------------------------'
~-

AlOO
xxxx:OlOO MOV SI, lFFF Registro SI apunta al comienzo de la lista menos uno
xxxx:0103 INC SI - Incrementa.SI . .
xxxx:0104-- -MOVAL, 02 Carga 02 = STX en AL
xxxx:010fi Compara el nmero apuntado por SI con AL
.... - ---.- CMP [SIJ>Af
_.""'~ -

xxxx_:0108 . JNZ _103


- - - -~ --

a
si ~l cara~t~;~ l~ iisi e~-c:iiknt:~~-a.it"i'r 103
xxxx:OlOA MOV CX, -1 Pone en -1 al contador
xxxx:OlOD MOV AL, 03 Carga 03 = ETX en AL
xxxx:OlOF INC CX Icrementa CX --
xxxx:0110 INC SI Decrementa SI
xxxx:0111 CMP [SI], AL C()mpara-el nmero apuntado por SI con AL
xxxx:0113 JNZ lOF ~ientras Z=O, volver a lOF _
xxxx:0115 MOV [SO], ex Guarda en 1500 el resultado
xxxx:Ol19 INT 20 Fin

EJERCICIO 34:
En las direcciones 2000 a 2003 se tiene un nmero N de 32 bits.
resultado dejarloen el regis_tro ex_
.>

Ensima aproximacin ..JN = An = [(N/ An-1) + An-1]/2


~~algoritmo se detendr cuando la diferencia entre dos aproximaciones sucesivas sea~~:, 1 -~-~P~--
-

-""-
;

.
. '\ ~.
-,__ ..tr,, 1

A 1.QQ.
~x_x.:Ql,_OQ ___fy!()_Y._ _S,I, 2000 Inicializa
- -SI
xxxx:0103 MOV AX, [SI] Carga en AX los 16 bits inferiores de N
;~~-;:bias Mo-vnx, rsi+il Carga en DX los 16 bits superiores de N
~x_xx:o10s Mov-cx,es El divisor ex toma el valor C8H = 2000
xxxx:OlOB DIV CX Dfvide por 200, y el resultado queda en AX
x.xxx:OlOD _ADD AX, 2 Suma 2 como pide el algoritmo
xxxx:Ol 10 MOV CX, AX Lleva Al (cociente) que est en AX hacia CX (divisor)
-~~~~:cii2 - Mv-Ax, csn Vl:l~_lye a cargar en AX los 16 bits inferiores de N
x;xxx:Oll4 )'vl()y _px1 [SI--_2J Carga en DX los 16 bits superiores de N
xxxx:Oll7 DIV CX D~vic:i~ por A_l
xxxx_:_0119_ -~DD AX:, CX:_ Suma_N/ Al que est en AX con A1 que est en CX
~xxx:OllB SHR AX, _1:_ Divide por 2 la suma antes hallada, para h'allar A2
?SX.X.X..:.OHD_ eMP A,X, _
c;:x <;~~para A2 con A_ l_
xxxx:OllF JZ 12D Si son iguales, terminar
-~~-~-~;9.l?t. ~l.;~.<;8! .~~ Resta l -A2
xxxx:Ol23 CMP ex, 1 C9mpara (Al - A2) contra 1
~~~~Op6 . JZ 12J:? Si es igual a 1, terminar
xxxx :Ol~ 8 CMP ex, -1 Si no es igual a 1 determina si es -1 = FFFF
.?<x.xx:Ol2B JNZ 110 Si no es i~ual a - 1 se hace otra aprnximacin
xxxx:Ol2D MOV ex, AX Guarda An vlida en CX
xxxx:Ol2F INT 20 fin
U3-28

La instruccin SHR AX, 1 permite r~pi~amente dividir por dos un nmero binario, merced a que desplaza
h~~ta l~. \'.Ie.r~c:ha ("silift rig~~-" ),_ un~ posicin, l~~-'\)s d~l ~~gf~:~ &~-y_._ag~eg~ ~ce; ~ la izquierda: Esto se
in~ica en la figura que sigue, que ejemplifica
.. para
.
4 bits,. cmo el nmero
. - . .. . . . (12) .se transforma.en O (6). ..
1100 ' ~ ,
el
o--J.111110101
LJ...J. ll 21.. Accin de la instruccin

101111101 e Resultado

-L.__(. _J .J...J. J J. l ._J. J. J__.(J Generalizacin paran bits


...
,;;
'

En general, para un registro d e n bits, SHR di:splaz_i _uz:t J~gr: ..b.~_<;i... @..derecha .el contenido del registro, :
llevando-~-c~"f-.;;i'~q~i~~d.~:-Ei bit d~-~-;~t~~~a derech~ pasa a ser el nuevo valor del flag C (Carry) . ..
i)';~anera inversa, SHL-AX~i despla~-;:i-~Ttlir''fiacia"i~"LZ:qt;.ferci'a"' (sbi'it left). cada iln'<le los. 16 bits de AX,
p;~;-u,~~~~~O.~~-f~ J??~I~-~treiii~- ~.~9.~j~~~;)r-.eTVif~~-t~ffi(;.Tiq~i~rdop.asa a ser el valor del flag c.
As es posible
.
~-
multiplicar
. .
por
.. dos
. en----
binario, m...ediante
________ una sol~_i.r:~q-t1.
.___ ....,.._... ....___............................ __... .
~~~-~, ~~ cm:i.tepjdo .d e f0 .

~J~RCICIQ 35: . M.~Hiplicacin de dos nmeros enteros de 8 .bits. ca~a uno mediante IMUL
Multiplicar el ninero entero que est_ en la direccin 2000 por el nmero -60 = 111~1010 8 =F~_H
Para multiplicar dos nmeros enteros de 8 bits, mediante la instruccin IMUL, uno de ellos puedC! estar en. cualquier
registro de 8 bits, y el otro en AL El resultd, que puede ser un nmero de hasta 16 bits, se encuentra en el registro AX.
- . ..

AlQ_D...
ipcxx:019.Q._.. fy!QY _c;::J,,..[209Pl Carga en CL uno de los nmeros enteros de 8 bits
. XJO(x:O~O'! .. MOV AL, F~.. Carga en AL el otro nmero entero de 8 bits
xxxx:Ol 06 IMUL CL Ordena multiplicar CL.pc)r AL, con resultado en AX
FiTI . . - .....
XXxX:Ol OA 'iNT 20_
. . ::

EJERCICIO 36 : Multiplicacin de dos nmeros enteros de 16 bits cada uno mediante IMUL
M~itipli~~r-~i'nmero
. .. . _. . -. .
en.t.ero
. . ..
qu.est en la 'arecdn
. .. . ..
2bby'2bi p'or eli.iiffier ~-~ FFFAH
. . .. . .. .

Pra multiplicar !fos nmeros enteros de 16 bits, .mediante Ja instrucci.n _IMUL, uno de dios pued~ est~r. en cualquier
regi.stro de 16 bits, y el otro en AX. El resultdo, que puede s~r un nrriero de has~ .3_2J~i~.. .~C! .en_centra en los registros
DX (mitad superior), y DX (mitad inferior)
.. ' ' 1-: ' ' .
AlOO
xxxx:OlOO MOV BX, [2000) Carga ~n. BX el nmero entero de 16 bits que est en 2090.y 2001..
xxxx:Ol04 MOV AX, FFFA.. C:arga en AX el otro nmero' entero de 16 bits
xx~x~fo7 IML BX Org_eJla !11..uL~iP.)i~ar J32C por.hX, c_on _resultad.~-~D. I?.2C.y .A."J!....
xxxx:0109
..... -INT
. 20
.. - Fin

EJERCICIO 37 : Multiplicacin de un nmero entero de 16 bits por otro de 8 bits, y uso de CBW
M~ipcar ~l nmero entero que est en la diieccin 2000 y 2001 por el nmero -60 ;, FAH
, - -- h - - . - - -- . - ...._.... . - - - . - .,,_, .: . . .. . - - - ... ,. ,. . . .

ELnmeros..~mei:.o. 9.e_ .!_6 bits, p_u_ede estar. en_ct!alquier reg~s~ro..d_e_\~ _bits, y ~l .de 8 bits en A.L. :A es\e ltimo se le debe
p_~opagar e_
l _signo \unidad 4), median te .la i~stru ccin CBW .C9onvert b}'te to .word), para que result!'. una mul_tiplicacin
entre dos nmeros de 16 bits.

Al OO
xxxx:OlOO MOV BX, [2000) Carga en BX el nmero entero de 16 bits que est en 2000 y 2001
x~X.x :0104 .....MOY_At, FA Qirga en AL el otro nmero entero de 8 bits
xxxx:0106 . CBW.: C_cinvierte FA que est en AL; en FFFA queocupa AX
xxxx:Ol07 IMUL BX Or~_e.na multiplicar BX por AX, con ~esultado en DX y AX
-~-.. -- .
xxxx:Ol09 INT 20 Fin
U3-29

DIRECCIONES EFECTIVAS Y REGISTROS DE SEGMENT0 1


Hasta el presente, en ina direccin que en el Debug apareca corno 2B16:1723 slo considerl:Jarnos
didcticamente la porcin derecha 17~3: Ello supona considerar una memoria (figura 3.22) cuyas
<li!ecciones iban de 0000 a FFFF = 65.536, o sea una memoria de 64 KB.
ED .mo_do n~a.J2, l!P direccin efec~a es formada con las dos porciones (2B16 y 17~~) que la
c_omponen, para lo cual la UCP realiza una suma binaria, que en hexadecimal es:
2Bl60 (qi.reccin )Jase)
+ 1723 (desplazamiento)
2C883 (direccin efectiva)
Se observa que a 2B16 se le agreg un cero a la derech~ (eq_l_:!_iy_'.l)~~t-~-~-l1~.i:I9_S~~--?...~n.-~4'-9-_~i9}. ~~ -
Lo-ant.r ior implica ~figura 3.23) que_la UCP (80286) din:~c_:ciona una memoria cuyas direcC<?!leS Y.D..
cii])9Q.b"b ~ fFf.FF .= 1.048.S.7?! o ~_ea una memoria de 1 MB. Las direcciones que van de 0000 a FFFF
c"nstituyen un "segmento" de 64 KB _de la meinori~ __d _e_) __MB, dentro _del . cual el valor 172~
r~"_i)resenta un "desplazaJJ].i~~t''. .(P). \!_~'. f;et'.' r~specto _del __~rigen relc1tivo 0000. E_~te o.r igen tiene.
pp_r ciireccin efectiva 2Bl60 (2Bl60 + 0000),_ siendo que la celqa localizadl. co11 desp1.azamiento .
l.?23 tier).e ~()ffi() .cliJ~<;;cic)n ~fect~va 2C.~83 = ?B160 + 1723 = 2B16:17~3.. _
Ei}__el _~spa,c:j9.,Q.~_}1l.~r.nori _cigL_2J~-~4.a __p!ograma. disponE: d~ cuatro segment()_S indepe_ndientes
de <?4 KB...rnd.a. uno, qireccionados en su origen por unJegistro. denominado regi_stro desegm~11_t():__
l. ~eg~~~t() _ de - ~~c!i.g.o: do~~-~2~-g~~r-~l} ]()~ ~5;~;g()_S_ ~e.- mql!ina de las irlstruccion~?. que
c9n~f!t:gy~D-. eJ prograrr:i:a_. Ca~a instruccin es localiza~a dentro del . segm._~.[1t()_ .P! .1!1-edi_~ <!el
~p!. qu~_ pr()porciona el .valor del d~?.plaz.1~~I1~ _i:~specto . de_l o_rigen A~_l__ ?._egn;u~n.~~~'. (figura_
3.24)... El origen de este segmento es direccionado (apuntado) por. el... "registr d~ sgmento de
.. .. . . .. ... . - . .. - - - . . .. . .. --- - - - ---
~ft-

cdigo_"_(CS =code segment registerLJ;'.~!:.lo tanto, una ins~ucci_n se localizfl ~ ~J~~f~~~~~go


Ir\~drai:te el par de valores CS:IP,_que co!l!p~_ l()_que_se denomina el "c?.~~do~riepl~~~'.
En laf1gura 3.24. se ha 5puesto CS:_IP = 302B:B01C. ...:'. ' ~ ~~~\ :. ~-~;\i......
2. S.~!!!~PJO.. ge..ciatos: qu_e guat9:.a_l?s dato~ que _el. prog1::111. debe. ?P~ra.,~. y.}~~}~:.~l~.~~ q~!=
resulte11 de la ejecucin del mismo.__ Cad<! _~~tos _es ~oca!iz."<~do dentrp d~(~e~J,1!~~~~.9-!~n,t~.
a}gl!D_ d~. ~stqs. tres. p_t.!nte!'Q~:. ~~,_ PLC?.,.J.30~.-q'-1~. pr9pq~ciqnan el valor. d~r de~p~#~~stit9. en
:r:~lac:in ~9_I1 el orig~n del segi;negt_o (f~?: 3,24). L_direccin donde comienza .e~t~: seg;nento
e~ pi:oporr:ionada por.. el .. ~.'.regi:?.trq . _dg . segmmto . d,e. datos'.', (DS = data segrn~n~ ~egis!er)
Confgr.m~J---.!ltg!'iO~_Q!l__g~tQ_?.~Jocalii~-~P...-~L?~grr{e11t_o_ de dat()S mediarif{ alguno de los
s~gl1i_e11J_es P~!es _g~_Xl?~~: .P?.;?.I,}?~:Pl.<>-~-~-~ , . ;:-~
En la figura 3,24 se haspu.esto p~:DI =:=?04.~:25_1A r

~i:~:~6~~a~cr~~-&;i~~~l~~!f~~~ik:;~4~~~5f0~~i1%itJr:~~;~~e1:~~:~~9~;~~~~:---
3.

Ul}_ !~g~~trojieri'Q~fu-Eii~~J.5--c~I~.S:KP.2Ii.if~iJ;)~f]i1l~L<?:~~r~e.gP:i~rifo::cie p_a: es.'gfr~f~iQDld()


pQr;_~L!~g~!~q_Ae_~eg~~?!_~q_qep_il_a :' (~~ = stack segrne11t_ reg_~s~e.r). ~o~ lo tanto_el par.. d~ va~()!_es
S,S:SP per:m.ite localizar e~ e_l s~g?:i:i::r:.~~E7_P.i!l_ ipf9_rm.~c!n. _d~ntro de la pila (figura 3,.24).
En la figura 3.24 se ha .supuesto ?S:SP = A3232:7,62A
4. Segm~ntq ~~tra: u.s ado mayorm.:ent_~ pa_ r a,guardar datos tipo "string~lf _.(cacienas. d~_<:9:~9-.C:!.~r;~~),
o ~orno pro}ongacil1. del segI!1ento de da_t_os. Cada dato es apuntado dentro del segi.nen,!() por .~l
registro puntero DI (figura 3.24). La direccin1 de inicio _d e este segmento es propo.rc:iof1a_d_a_p_o.r
e_~ . "iegz~fra([e segnieiito extra" (ES ;; extra segment register)._As, el par de valores ES:D~ ?!rve
par; a l()~lli:z:ar un da fo en eI segr.en.to..exha~ .. . . .
En la figura 3.24 se ha supuesto ES:DI = E230:5420

Los registros de segmento permiten cambiar de lugar programas, con tan solo cambiar el valor
mismos: ... .. - -- - . . ... .
co~t"enido -en.los . . .... . . .... . . . ,_ .. ... ... . . .. .. .. . ... . ... -..----
St9bservamos'elDebug"vemos que normalmente los registros CS, DS, SS y ES ~stf1 con ~1 valor qe
l~..P-It~jzgu.ier..:c:ll. . Qe la direct;in (2B16 en. un eji;.1plo anterior). Ello implica que Jos cuatro seg-
me~!~_s_ c~t~-~~5-. ~rnpiezan en la misma direcci]'\ (2B~60), sea que estn superpuestos (figura 3.25).

1
Este punto es necesario para desarrollar los temas siguientes.
z J:?esde el 80286 hasta el Pentium. los procesadores pueden operar en .modo real o en modo protegido. Este _ltimo_es el que se utiliza
.~!1 ~ultitasking (multiprogramacin).

L
U3-30

E~~.~. es la f_orm~ .e~__que .hemos


estado usando dichos segmentos, como un solo segmento de 64 KB,
fil..P:t.~Q.~-~~ti~!'e
un_pr(?grama pequeo, como son los .COM. En este segmento pueden convivir,
en rea$ separadas, up programa, datos, y una pila (figura 3.25)

0000 . i
-----------, ooooq 00000---------1
1 :


!
1

.t '
64 KB 30280
(CS=302B) ' .
.r .

'- ~:i ' -;_ ' '

1
1
i
FFFF ------ -..--J
3B2CC
Figura 3.22 (3028:801 C)

..
1

28160
5299A
(5048:251A)

2C883
2816:1723)
! :.r .. ~.; 1 ...
. . ;-::
..... ;

! .
!
A3210 :
'
(SS=A321)
-"'~ : .. ;.~
.-
;.~

'
AA83A
(A321 :762A)

l
1
E2300
(ES=E230)
1
1
!
l
i
FFFFF I.__ _
Figura 3.23

'
FFFFF L--------J
Figura 3.24 Figura 3.25

... '. .. . .... ..


U3-31

LLAMADO A SUBRUTINAS
Una subrutina es una porcin especfica de un programa, que puede ser incorporada, para ser \ ',;.
1 .,
ejecutacf~~ =~- c~~~gie! p~t_o _de un P!ogr~~~:- La. acd.de requerir l ejecudn d na~ subruthi~a 1" (}
qe se incorpora a un programa, se conoce corno. ll!l;maqo" ("caW) a ~ubrutin.a.. 11 ..
,
:!1 g~_!:l_e~_a!!_l.J!l~ s~p~utina es llamada sucesivamente desde distintos puntos del pr9grarna. principal
Plf_~ pr()_v~f;?~ una funcin. En lugar de incluir repetidamente dicha porcin de prograi.a en el
p~~grama prindpal, cada vez que _se la nece__sita se la invoca como subrutina, en cada oportunidad
.9.~~J~ fl:rncin se necesite. As, ~a misma porcin de programa escrito una sola vez pued~ ser
usada muchas veces, . con la consiguiente economa de memoria, y en beneficio de una mej<;>r
estructuracin de los prograrna.s.
Otra razn para usar subrutinas es la divisin de programas largos en mdulos ms pequeos. ..(-- -
Las -casas'" ms COITiunes para co9-ificaar un programa en "v arios supprograrnas separa<;i~s ' -que
lu;~i~r~n coffi.~Jriads e~_ m; -~ico p~ograrr<:_ejec~_t1ble_-::- -?~~~~.fl _ser:
\
_f~~git_a_r la S()lucin del problem~.q~e ~e quiere re_sohrer \\
Agilizar la fase de depuracin de errores 1
CE-_"i-1~ eidste-n c.ia de suficientes. regi.Stros de la UCP para un programa extenso
La divisin de un programa largo entre varios programad~res !

.. . ya
1
:Erarovecfiiriierito de sbrHas exiSteies -- -.. - - )
-- p________ _...... ... . .. ... ... . . . .. -- - ....
Existen ~~~!:u tinas que se es~riben corno programas independientes. Corn~ tales pueden. tradl,.l:irse,
prol:>arse y a4nacenarse para formaar parte de una "bibli~tec:;a .d~.. s1,1l;il}lJin~s~'. ...:E.~taJ.qli<; R~1:"!ll!t.e
c~.q}p_~rj:~~-?.~~n.J..~~- ~ng~ i~~if\~()S_pr_og_~~~~s.

..
_ _,
i
l. Cuando desde un progrma se quiere ...
: .... '

pasar a ejec_u tar una subrutina (~R), una ...~ I


intruccin Ik del mismo denominada de
"1arr1adi{ 'a-sbrutirla''. (CALL en ass:e mbler
de Intel), debe ordenaar saltar a la prim_~ra
i:tstruccin (! 1) de dicha S.~-
Previamente (paso O) Ik ordena gu~dar en
memoria principal la direccin de Il.1 ,
instruccin con la que continuar la
ejecucin del programa que llam a la SR,
una vez que sta se haya ejecutado.
2. Luego se ejecutan I, y las siguientes
instrucciones
- de la SR.
..
:2000 :fo______ 1t _________ 3: La ltima de estas instrucciones I" (RET
1 er:i assernbler) ordena saltar a la direccin de
'-- --------L - ------
13 Ik. 1 del programa llamador de la SR~ o sea
r------
--
----------
'
a
refoinar este' prograi:n~

2b ~~~i~~
La direccin de Ilt' o sea la "direccin de
_retorno''. es guardada -paso ade la ejeccn
---1~~------ de la instruccin Il de llamada- en una zo1a
MEMORIA t...-- !r.... <~.~!)
d-la memoria principal denominada "pila"
. (" stack").
MEMORIA La pila se usa duran.te la ejerncin de cada
Figura 3.26
sitbrutina que haya sido llarnad.
La direccin de memoria donde se escribe (o lee) la direccin de retomo es proporcionada por un
regISfro d la UCP denominado "puntero de pila" ("stack pointer" ~ SP).
Como se ver, la denominacin "pila" se debe a que al com.ienzo- de la ejecucin de la SR (2a)
instrucciones ordenan guardar en la .pila contenidos de registros de la UCP, que vena usando -el
_programa llamador. Dichos contenidos se "apilan" -como una pila de platos- encima de la
d~reccin de retorno citad~. Las ltim_as instrucciones de la SR (2b) ordenan..'~~esapHar"!__() ?~-!!.
.,.--
:

U3-32

pa_sa~do ~~~-:!:i.~~~!:_~_t_e, de la pila hacia los registros, los contenidos que tenan en el momento del
llamado a SR El registro SP-es usad para apilar ydesapilar; en-forma . orden.ada~ los c.o terudos de
pila.
la- .... ----
Efmismo
....... .. ..
es ni.anejado
- - . - . .. ---
-~
automticamente por la UC, la ..cu.a lpor su iTitermedio controla
-- - --- -------- ----- ... -- . - -"'------ ------- ... -....... - -- ...... la pila.
..... - .. . . . .

DESCRlPCION MAS DETALLADA DEL PROCESO


--
1~-c:oiticac>n -~i"e. 1strucci~-es ___ ------~
..........._ _ ______
____,.,,, - . . . . ..,, ..... __ ,
' '

Ejercicio 38:
Las:~rglitin~.~--S.~J:1.t~nc:_ia:5 en alt_o__:i.~vel:
... .
'~"""' :Unsign~.d..
. N ..:=:=....R:t Q
. R .=:: .P.xQ . ""
T = NxQ
ser11.rr~P.1:!~.i<.i!?.. ~_jnstrucc:;i_?~~s en a_sse~~ler, con llamadas a SR para efectuar las multiplicaci(_?nes
S!,e_J:DP..X:~.. C:O.~ .f.m.es_ didcticos segu.Ternos usando para m.ultlpllcai ('on
sus lirilitaciones) la secuencia
~la. figura ~.51._asumiendo para la.~~_v~ara~ies"i~s-~~etes auecc()~~~~~-~~~~1!.l?.!ia: ... -- . -------

R~ 4000/l
Q ~ 5000/ l
p ~ 5500/1
T ~ 6000/1
N ~ 6500/1
Entonces, una forma de presentar las instrucciones es la siguiente:

ASOO
xxxx:OSOO MOV ex, [5000] La variable Q pasa a ex
1

xxxx:0504 MOV AX, [4000] La variable R pasa a AX


xxxx:0507 ADD AX,CX Realiza en AX: N = R + Q
xxxx:0509 MOV [6500], AX Asigna a la variable N el valor d e AX
xxxx:OSOe MOV DX, [5500] Pasa el valor del multiplicando (P) a DX, pues as lo exige la subrutina
xxxx:0510 CALL2000 Llama a la subrutina que est en 2000 para hacer PxQ ,
~
..
xxxx:0513 MOV [4000], AX Asigna a la variable R el resultado de PxQ que la SR acumul en AX
xxxx:0516 MOV DX, [6500] Pasa el valor del multiplicand o (N) a DX, pues as lo exige la subrutina
xxxx:0519 CALL2000 Vuelve a llamar a la subrutina para hacer NxQ
xxxx:OSle MOV (6000], AX Asigna a Ja variable T el resultado de PxQ que la SR acumul en AX

A2000
xxxx:2000 PUSHCX Guarda en la pila el valor de eX=Q para poder luego recuperarlo
xxxx:2001 SUB AX, AX Pone AX en cero
xxxx:2003 ADDAX,DX Suma el valor del multiplicando supuesto en DX y deja 'resultado en AX
xxxx:2005 DEC ex Resta en cada ciclo uno a CX, hasta que sea CX=O
xxxx:2006 JNZ 2003 Mientras Z sea O, volver a 2003
xxxx:2008 POPCX Pasa el valor Q de la pila ex, as en ex se vuelve a recuperar el valor de
Q (que en Ja subrutina se hace O), para usarlo luego
xxxx:2009 RET Vuelve al programa llamador.
Figura 3.27
En el programa llamador, antes de cada CALL, se pasa al registro DX el valor del multiplicando (R P segn
sea), y al comienzo del programa se pas el valor del multiplicador (Q) a ex. Esta exigencia surge de observar
la subrutina, dado que sta emplea los registros DX y ex para dichos datos. Asimismo, la subrutina deja en
AX el resultado, el cual en el programa es asignado en memoria a la variable correspondiente.
Este pase de datos del programa a la subrutina, y de resultados de la subrutina al programa se conoce como
"pasaje de parmetros". Los parmetros se han pasado a r egistros. Existe otra forma de pasaje de parmetros
por medio de la pila, que luego se ilustrar.

1
Esto, como se ver, tambin lo exige la subrutina paara hacer el producto
U3-33

11. Uso de la pila ("stack") y d el stack pointer (S P)


Como se plante anteriormente, la pila es una zona de memoria principal, usada para almacenar
tamporariamente direcciones y datos relacionados con la ejecucin de subrutinas. El puntero d e
pila (SP) es un registro de la UCP que proporciona la direccin del ltimo dato que se ha ahnacenado.
En lo que sigue veremos cmo progresa el SP desde que se llama a una subrutina hasta qu e se
retorna al programa llamador. Es conveniente seguir este proceso usando el Deb ug.
Ob servando el Debug (ejemplificado a continuacin ), al comenzar la secuencia, cuando no se usa la
pila, permanece SP = FFEE, o sea que determina la direccin de memoria FFEE (figura 3.28). Si se
ejecuta la instruccin CALL 2000 d e la secuencia anterior, luego cons tataramos con el Debug_que
en la pila se guard a la. direccin de retorno 0513, y que en correspon dencia SP=FFEC (figura 3.29),
indicando la nueva cima de la pila, siendo que se ha apilado el valor 0513. El valor de SP cambia,
pues, automticnmente, mientras se ejecuta CALL 2000: n o es necesaario insertar en el p rograma
ninguna instruccin que modifique el valor del SP.
La siguiente instruccin que se pasa a ejecutar es la p r imera de la subrutina, o sea PUSH CX. Esta
instruccin ordena guardar en la pila el contenido (supuesto 0002) d el registro CX (figura 3.30). En
consonancia con el nuevo apilamiento, el va lor del SP pasar al valor FFEA, apuntando al dato que
est en la cima de la pila.
Las instrucciones SUB AX, AX; ADD AX, DX; DEC CX y JNZ 2003 no afectan a la pila. Hacia el
final de la subrutina, la instruccin POP CX ordena un movimiento contrario a PUSH CX. Esto es,
retornar el dato (0002) que est en la cima de la pila (ap untado p or SP) al registro CX (figura 3.31).
Adems POP produce un desapilamiento, siendo que el SP apunta ahora a FFEC. Siempre que se
desapila un dato, el m ismo deja de formar parte de la pila, aunque momentneamente siga en la
memoria. Al desapilar slo cambia el valor del SP.
La instruccin RET, ltima d e la sub rutina tambin afecta e1 la pila. El d esap ilamiento que ocasiona
hace que el v alor de la direcin d e retorno se restaure en el IP, de modo que se puede reandar el
programa en la mstruccin que sigue a CALL (figu ras 3.27 y 3 .32). Asimismo, luego de ejecutar
RET, el SP pasa a l valor FFEE, que tena antes que se llamase a la subrutina.
Con el Deb ug, m ediante el coman do E se examina la pila en distintas oportunidades.
'"' .
1 ~ t ~'

' '
IP '~-----~
0513 ex 0002 =i
.' l l


FFEA

(FFEB FFEC 13
..-./

tf' FFED 05
SP - FFEE ....___ __, SP: FFEE
Figura 3.28 Figura 3.29 Figura 3.30

ex! 0002 IP I 0513 --j


/
/ 1

FFEA ___ / i
i

;FFEC

,:' FFEB
13 . FFEC
)
./
/ ~o+ FFED 05 FFED
SP:<l.o FFEE sp:Bu FFEE
Figura 3.3 1 Figura 3.32

De la descripcin anterior resultan las siguien tes caractersticas d e la pila:


U3-34

La pila guarda temporariamente datos en forma ordenada, mien tras se ejecuta una subrutina.
Los datos tienen una restriccin de acceso: slo pueden agregarse o eliminarse por un extremo de
la pila, conocido como "cima".
El ltimo dato colocado en la pila es el primero en quitarse, cuando se comienza a retirar datos. En
ingls esto lo expresan las siglas UFO: "last in, first out".
Se usa la palabra introducir o empujar ("pusli") para indicar la operacin de colocar un nuevo dato
en la cima de la pila; y sacar o tirar ("pop") para sealar la operacin de retirar el dato de la cima.
El puntero de pila (SP) proporciona la direccin del ltimo dato almacenado en la pila, que es el
,qu~ est en la cima de ella.
Cada vez que 2 4 bytes son~ almacenac:tos ("apilados") en la pila, el valor-aeJc-sp es previainerite
decrementado en 2 4, respectivamente. Cuando 2 4 bytes son desapilados de la cima, a
posteriori el SP es incrementados en 2 4, respectivamente.
El SP controla el orden de la pila, y el SP es controlado por. la UC durante la ejecucin de - ,:;
instrucciones que afectan a la pila (como CALL, PUSH, POP y RET)

A los efectos de visa!izar mediante el Debug el proceso indicado en las figuras 3.28 a 3.32 se ejecutar la
secuencia de la figura 3.27, desde la direccin 0500 a 0513. Previamente ser necesario suponer valores pa ra
las variables. Asumiremos:

R (4000/1) = 0005H
Q (5000/1) = 0002H
p (5500 / 1) = 0004H
Estos va lores se escriben en memoria, en las posiciones de las variables, mediante el comando E, como se hizo
en la unidad l.

IP 0100
:500
-R
'
AX=OOOO BX=OOOO CX=OOOO DX=OOOO SP=FFEE BP=OOOO SI=OOOO DI=OOOO :.:~:. i;;:J
DS= 106E ES= 106E SS= 106E CS= 106E IP=0500 NV UP ETPL NZ NA PO NC
106E:0500 8BOE0050 MOV ex. (5000) DS:5000=0002
-T
AX=OOOO BX=OOOO CX=0002 DX=OOOO SP=FFEE BP=OOOO SI=OOOO DI=OOOO
DS= 106E ES= 106E SS= 106E e S= 106E IP=0504 NV UP EI PL NZ NA PO Ne
106E:0504 Al0040 MOV AX, [4000] DS:4000=0005
-T
AX=0005 BX=OOOO CX=0002 DX=OOOO SP=FFEE BP=OOOO Sl=OOOO Dl=OOOO
DS=l06E ES=106E SS=l06E CS=I06E IP=0507 NY UP El PL NZ NA PO NC
106E:0507 OIC8 ADD AX,eX
-T
AX=0007 BX=OOOO CX=0002 DX=OOOO SP=FFEE BP=OOOO SI=OOOO DI=OOOO
DS= l06E ES=l 06E SS= l06E CS= l06E IP=0509 NV UP EI PL NZ NA PO NC
106E:0509 A30065 MOV (6500), AX DS:6500=0000
-T
AX=0007 BX=OOOO CX=0002 DX=OOOO SP=FFEE BP=OOOO SI=OOOO DI=OOOO
DS=l06E ES=l06E SS=J06E CS=l06E IP=050C NY UP ET PL NZ NA PO Ne
106E:050C 8BI60055 MOV DX, [5500) DS:5500=0004
-T
AX=0007 BX=OOOO CX=0002 DX=0004 SP=FFEE BP=OOOO SI=OOOO DI=OOOO
DS=l06E ES= l06E SS=106E CS=l06E IP=0510 NY UP EI PL NZ NA PO Ne
106E:05 I OE8ED 1A eALL 2000
-T
AX=0007 BX=OOOO CX=0002 DX=0004 SP=FFEC BP=OOOO SI=OOOO DI=OOOO
DS= l 06E ES= l06E SS= l06E CS= l06E IP=2000 NV UP El PL NZ NA PO NC
106E:2000 51 PUSH ex
03-35
-E FFEC (Examina la pila)
l 06E:FFEC 13. 05. (Se verifica que en la pila guard en FFED el 05, y en FFEC el 13. de 0513. que es la direccin
de retomo)
~T
AX=0007 BX=OOOO CX=0002 DX=0004 SP=FFEA BP=OOOO SI=OOOO Dl=OOOO
DS=l06E ES=l06E SS=l06E eS=106E IP=2001 NV UP El PL NZ NA PO NC
106E:2001 29CO SUB AX, AX

-EFFEA
106E:FFEA 02. OO. 13. 05. (Se verifica que en Ja pila guard en FFEB el 00, y en FFEA el 02, de 0002
'
contenido en ex, mantenindose 13 en FFEC, y 05 en FFED)
.....-. - --

-T
AX=OOOO BX=OOOO CX=0002 DX=0004 SP=FFEA BP=OOOO SI=OOOO DI=OOOO
DS=l06E ES=l06E SS=l06E CS=l06E IP=2003 NV UP EI PL ZR NA PE Ne
106E:2003 OIDO ADD AX,DX
(Se observa que la pila no cambi, pues SP contina apuntando a la cima que est en FFEA)
-T
AX=0004 BX:OOOO CX=0002 DX=0004 SP=FFEA BP=OOOO SI=OOOO DI=OOOO
DS= l 06E ES= 106E SS= 106E CS= 106E IP=2005 NV UP El PL NZ NA PO NC
106E:2005 49 DEC ex
-T
AX=0004 BX=OOOO CX=0001 DX=0004 SP=FFEA BP=OOOO SI=OOOO DI=OOOO
DS= 106E ES= l 06E SS= 106E CS= 106E IP=2006 NV UP El PL NZ NA PO NC ...... . ,.
106E:2006 75FB JNZ 2003
-T
AX=0004 BX=OOOO CX=OOO 1 DX=0004 SP=FFEA BP=OOOO SI=OOOO Dl=OOOO
DS=l06E ES=l06E SS=l06E CS=l06E IP=2003 NV UP El PL NZ NA PO NC
106E:2003 O1DO ADD AX,DX . ... .
'' ~

-T .. ::... ;'<:
AX=0008 BX=OOOO CX=OOO 1 DX=0004 SP=FFEA BP=OOOO SI=OOOO DI=OOOO .: .: ')fJ:. .y<.....
DS=106E ES=106E SS=106E CS=106E IP=2005 NV UP El PL NZ NA PO NC ' ': ~' ~~ .'
106E:2005 49 . DEe ex t..:~~ ~":,~ ' ,,. ~

.. t.;. ..
-T
AX=0008 BX=OOOO CX=OOOO DX=0004 SP=FFEA BP=OOOO SI=OOOO DI=OOOO
DS=l06E ES=l06E SS=l06E CS=l06E IP=2006 NV UP ETPL ZR NA PE NC
106E:2006 75FB JNZ 2003
-T
AX=0008 BX=OOOO CX=OOOO DX=0004 SP=FFEA BP=OOOO SI=OOOO DI=OOOO
DS=106E ES= l06E SS=l06E CS=l06E IP=2008 NV UP El PLZR NA PE NC
106E:2008 59 POP ex
-T
AX=0008 BX=OOOO CX=0002 DX=0004 SP=FFEC BP=OOOO Sl=OOOO Dl=OOOO
DS=l06E ES=l06E SS=l06E CS=l06E IP=2009 NV UP EI PL ZR NA PE NC
l 06E:2009 C3 RET
-EFFEC
106E:FFEC 13. 05. (El SP pas a FFEC donde guarda 13, siendo que en FFED guarda 05)

-T
AX=0008 BX=OOOO CX=0002 DX=0004 SP=FFEE BP=OOOO SI=OOOO Dl=OOOO
DS=l06E ES=l06E SS=l06E eS:::l06E IP=0513 NV UP EI PL ZR NA PE NC
106E:0513 A30040 MOV [4000),AX DS :4000=0005
(Luego de ejecutar RET, el SP volvi a su valor inicial FFEE, y la direccin 0513, guardada en la pila, pas al lP)
-T
AX=0008 BX=OOOO CX=0002 DX=0004 SP=FFEE BP=OOOO SI=OOOO DI=OOOO
DS=106E ES=l06E SS=l06E CS=l06E IP=05 16 NV UP El PLZR NA PE NC
106E:0516 8B 160065 MOV DX,[6500] DS:6500=0007
U3-36

EJERCICIO 39:
A partir de la direccin 2000 existe una lista de nmeros naturales de 2 bytes, cuya longitud est en
la direccin 1500. Determinar la raz cuadrada de cada uno, sumarle 3, y al nmero resultante
guardarlo en otra lista a partir de la direccin 3000. Este problema se basa en el ejercicio 34.
a) Resolucin por medio de pasaje de parmetros a travs de ~egistros (en este caso se us BX)

A 100
xxxx:OlOO MOV CL, (1500] Carga en CL la longitud de la lista
xxxx:0104 MOV SI, 2000 El registro SI apunta al comienzo d e la lista de datos . ... Jj
xxxx:0107 MOV DI, 3000,-.,1.. -~;y. .Dlapu::ita-:a:l-comienzo de la lista de resultados -
xxxx:OlOA MOV BX, [SI] Carga en BX (para la subrutina) un dato de la lista apuntada por SI : .!~
xxxx:OlOC CALL 5000 Llama a subrutina que est en 5000 para calcular raz cuadrada
xxxx:OlOF MOV AX, 3 Carga en AX el valor 3
xxxx:Ol 12 ADD AX, BX Suma 3 al resultado de la raz cuadrada dejado por la subrutina en BX
xxxx:0114 MOV [DIJ, AX Guarda el nmero resultante en la lista apuntada por DI
xxxx:Ol 16 ADD SI, 2 Incrementa en 2 el puntero SI
xxxx:0119 ADD DI, 2 Incrementa en 2 el puntero DI
xxxx:OllC DEC CL Decrementa eL
xxxx:Ol l E JNZ lOA Mientras Z=O, volver a lOA
xxxx:Ol20 INT 20 Fin

ASOOO
1
xxxx:SOOO PUSHF Guarda los flags (Registro de Estado) en la pila
xxxx:SOOl PUSH AX Guarda AX en la pila
xxxx:5002 PUSH ex Guarda BX en la pila
xxxx:5003 PUSH DX Guarda DX en la pila
xxxx:5004 SUB DX, DX Lleva a ceroel registro DX
xxxx:5006 MOV AX, BX Carga en AX el nmero N de 16 bits (dejado en BX) cuya raz se quiere hallar
xxxx:5008 MOV ex, C8 El divisor ex toma el valor CSH = 2000
xxxx:SOOB DIV CX Divide por 200, y el resultado queda en AX
xxxx:OlOD ADD AX, 2 Suma 2 como pide el algoritmo
xxxx:5010 MOV CX, AX Lleva Al (cociente) que est en AX hacia ex (divisor)
xxxx:5012 SUB DX, DX Lleva a cero el registro DX
xxxx:5014 MOV AX, BX Vuelve a cargar en AX el nmero N de 16 bits
xxxx:5016 DIV CX Divide por Al
xxxx:5018 ADD AX, ex Suma N/ Al que est en AX con Al que est en ex
xxxx:501A SHR AX, 1 Divide por 2 la suma antes hallada, para hallar A2
xxxx:501 C eMP AX, CX Compara A2 con Al
xxxx:SOlE JZ 502C Si son iguales, terminar
xxxx:5020 SUB ex, AX Resta Al-A2
xxxx:5022 CMP ex, 1 Compara (Al - A2) contra 1
xxxx:5025 JZ 502C Si es igual a 1, terminar
xxxx:5027 CMP ex, -1 Si no es igual a 1 determina si es -1 = FFFF
xxxx:502A JNZ 5010 Si no es igual a -1 se hace otra aproximacin
'

xxxx:502C MOV BX, AX Guarda An vlida en BX
xxxx:502E POP DX Restaura DX desde la pila
xxxx:502F POP CX Restaura CX desde la pila
xxxx:S030 POP AX Restaura AX desde la pila
xxxx:5031 POPF Restaura los flags en el Registro de Estado desde la pila
xxxx:5032 RET Retorna al programa principal

b) Resolucin por medio de pasaje de parmetros a travs de la pila

' En general, esto es necesario hac~rlo, dado que cuando se ejecute la subruti~a cambiar el valor de los flags, siendo que se
requiere volver a la secuencia principal con los mismos valores que tenan los flags antes del llamado a la subrutina. Como
se ver, en cualquier tipo de interrupcin se guardan automticamente los flags, o sea el Registro de Estado, en la pila.
U3-37
AlOO
xxxx:OlOO MOV CL, [1500) Carga en CL la longitud de la lista
xxxx:Ol04 MOV SI, 2000 El registro SI apunta al comienzo de la lista de datos
xxxx:0107 MOV DI, 3000 DI apunta al comienzo de la lista de resultados
xxxx:OlOA MOV AX, [SI] Carga en AX un dato de la lista apuntada por SI
xxxx:SOOC PUSH AX Guarda AX en la pila (es el nmero N cuya raiz se quiere hallar)'
xxxx:OlOD CALL 5000 Llama a subrutina para calcular raz cuadrada que est en 5000
xxxx:OllO POP AX Restaura AX desde la pila (la raz cuadrada calculada)
xxxx:Ol12 ADD AX, 3 Suma 3 a la raz cuadrada calculada
xxxx:Oll4 MOV [DI], AX Guarda el nmero resultante en la lista apuntada por DI
xxxx:0116 ADD SI, 2 Incrementa en 2 el puntero SL .
xxxx:Oll 9 ADD DI, 2 Incrementa en 2 el puntero DI
xxxx:OllC DEC CL Decrementa CL
xxxx:OllE JNZ 10A Mientras Z no sea l , volver a lOA
xxxx:Ol 20 INT 20 Fin

ASOOO
xxxx:SOOO PUSHF Guarda los flags en la pila (designados REH y REL en la figura 3.33)
xxxx:SOOl PUSHAX Guarda AX en la pila (designado por sus porciones AH y AL en la figura 3.33)

xxxx:5002 PUSHCX Guarda CX en la pila (en sus porciones CH y CL en la figura 3.33)


xxxx:5003 PUSHDX Guarda DX en la pila (en sus porciones OH y DL en la figura 3.33)
xxxx:5004 PUSH BP Guarda BP en la pila (en sus porciones BPH y BPL en la figura 3.33)
xxxx:SOOS MOV BP, SP Cargl e~ BP el valor de SP, as tambin BP apunta a la cima de la pila
xxxx:5007 SUB DX, DX Lleva a cero el registro DX, pues los nmeros son de 16 bits .. .
xxxx:5009 MOV AX, [BP+C] Carga en AX el nmero cuya raz se quier e hallar' . ..
..
:,,
\ . ~

xxxx:SOOC MOVCX,CS El divisor ex to~a el valor C8H ::: 2000 . . .e_.... .


xxxx:SOOF DIVCX Divide por 200, y el resultado queda en AX
xxxx:0111 ADDAX,2 Suma 2 como pide.el algoritmo :
- , " -~J .. ~"..
xxxx:5014 MOVCX,AX Lleva Al (cociente) que est en AX hacia CX (divisor) '
xxxx:5016 SUBDX, DX Lleva a c~ro el registre o:x; ~....... : . .. f ,;
: .::~ir
. :.
xxxx:5018 MOV AX, [BP+C] Carga en AX el nmero N cuya raz se quiere hallar
xxxx:SOlB DIVCX Div ide por Al
xxxx:SOlD ADD AX, CX Suma N/ Al que est en AX con Al que est en CX
xxxx:SOlF SHR AX, 1 Divide pr 2 la suma antes hallada, para hallar A2
xxxx:5021 CMP AX, ex Compara A2 con Al
xxxx:5023 JZ 5031 Si son iguales, terminar
xxxx:5025 SUB ex, AX Resta Al - A2
xxxx:5027 CMP CX, 1 Compara (Al - A2) contra 1
xxxx:502A JZ 5031 Si es igual a 1, terminar
xxxx:502C CMP ex, -1 Si no es igual a 1, determina si es -1 ::: FFFF
xxxx:502F JNZ 5014 Si no es igual a - 1, se hace otra aproximacin
xxxx:5031 MOV [BP+C], AX Guarda An vlida en la pila, en lugar del dato cuya raiz se quera cakular1
xxxx:5034 POP BP Restaura BP desde la pila
xxxx:5035 POP DX Restaura DX desde la pila
xxxx:5036 POP CX Restaura CX desde la pila
xxxx:5037 POP AX Restau ra AX desde la pila
xxxx:5038 POPF Restaura los flags desde la pila
xxxx:5039 RET Retoma al programa principal

1
Indicado como AH y AL en la base d e la pila de la figura 3.33
2
Este nuevo apilamiento de AX, o sea de N, indicado tambin como AH y AL, puede servir, por ejemplo, para hacer
'1N +N (en vez de '1N +3) en cuyo caso la secuencia principal se podra modificar como sigue:
CALL 5000
rj MOVDX, A X
.t POP AX
i ADDAX., D X
' Figura 3.3: el nmero N cuya ra z se quiere hallar est en Ja base de la pila, y siend o que ahora BP apunta a la cima, entre
sta y el comienzo de N en este caso exis ten doce posiciones (C posiciones en hexa).
Sern los nuevos valores que toman los denominados AH y AL en la base de la pila de la figura 3.33
1
l

1
'
03-38

BPL }sP
d!fh;l BPH
CL
(/j / ;
/ ; CH }ex
BL
/ BH }sx
// AL
AH
AEL
REH
}Ax
} RE(flags)
IPL
/ IPH
p (Direccin
} 1 de retorno)

/ AL
AH } AX (N y'/N)
Figura 3.33
-~~-

Anidamiento de subrutinas . i.

Una subrutina puede llamar a otra, sta a una tercera, y. as sucesivamente. Este proceso se conoce
como "anidamiento de subrutinas". Cuando la ltima subrutina llamada termina de ejecutarse, se
retorna a la subrutina que la llam, sta a la que la llam, y as de seguido. De este modo los
retornos se van sucediendo en orden inverso al de las llamadas. El ltimo retomo ser hacia el
programa principal, que efectu el primer llamado. Conforme a lo visto, el mecanismo de operacin
de la pila permite cuidar el orden en el anidamiento de subrutinas.

DETALLE DE LA EJECUCION DE INT (INTERRUPCION POR SOFTWARE)


En la U nidad 1, seccin 1.11, se introdujeron los conceptos fundamentales acerca de las interrupciones
por hardware y software, habindose planteado que en esencia son una forma de llamado a subutina.
-.Como.se estableci, la ejecucin de la instruccin INT xx,da,h.ga!:.a una int~rrupcin por softyv:ar:e, .
en el sentido que desde un programa de usuario no se llama a una porcin del mismo, sino a un ::. ;;~:.: ~
subprograma de la ROM BIOS o del sistem a operativo. Vale decir, se suspende momentneamente la ..
.~;...~;;~~ ~ -\~

ejecucin de un programa, y en su lugar se pasa a ejecutar dicho subprograma de la ROM BIOS o del ----: .."+
:~ , l
sistema operativo llamado por el programa en cuestin. Por tal motivo se habla de "a utointerrupcin", :-. .!
provocada por la ejecucin de 1NT xx.
Puesto que u n a interrupcin es una forma de llamado a subru?na, en relacin con el u_so d e la pila
v alen las consideraciones h echas al tratar ese tema, como se ejem p lificar.
Subrutina que
Zona de
Vectores sirve a INT 21

OOOO:OOB4 ~~~: llP ~ EA304C20 ~~~~ ~~


t- --~~- - -: }}
~;=
XXXX:0104 MOV AH, 2
XXXX:0106 INT 21
XXXX:0108 INC DL
f @;
' ,g;
POP BX
POP AX
EA30:hhhh IRET
FFE8 ! 81 ;
() FFE9 [_. __Q___=:=:_J
FFEA! 08 :
FFEsr-------or---,
' ..... )

FFEd:":~~-:~~:. .,
FFEDl xx
SP ~- .... . FFEE[............... .. .. Figura 3.34

E n otros procesadores la instruccin INT tiene otros nombre5, como SVC, TRAP, etc.
U3-39

Dada la secuencia:
xxxx:0104 MOV AH, 2
xxxx:0106 INT 21
xxxx:0108 INC DL

durante la ejecucin de una instruccin INT xx, como INT 21, la UC realiza los siguientes pasos
(figura 3.34):
1. Multiplica por 4 el nmero que acompaa a INT. Por ejempo, (en hexa) 21 x 4 = 84 = 0084
~-t.:,pLresultaclo. cobtenidoes el desplazamiento dentro 9.el primer segmento donde empie0:J..,.} ..""'1
memoria principal (CS = 0000) denominada "zona de vectores interrupcin". Esto es, la UC
forma la direccin 0000:0084. Esta es la direccin donde se encuentra la direccin CS:IP de la
subrutina que atiende a INT 21. O sea que 0084 es la direccin, de la direccin (CS:IP) de la
subrutina que sirve a INT 21, supuesta en la direccin CS:IP = EA30:4C20.
La direccin CS:IP apunta al comienzo de la subrutina, por lo cual se llama "vector interrupcin"
3. La UC guarda en la pila la direccin de retomo (xxxx:0108) de la instruccin que sigue a INT 21
Sobre ella apila el registro de estado (RE) conteniendo los flags (entre otros SZVC 1). Por lo tanto,
el SP pasa de FFEE a FFE8.
El RE en el 80286 tiene 16 bits. Los flags estn dispuestos como sigue (figura 3.35)

1 1 1 1 lvloi t ITISIZI !A! !PI lcl Figura3.3s


., ..
Suponiendo que los flags SZVC tengan los valores supuestos a C0!1;tinua~in, el contenido del RE
en hexa ser (como se ha: guardado en la figura 3.34): .. .>.
..~;r~::.~~
'
-# . ,.. ,1
..... .
lolololol1lololol1lololorolo10111 =0881
. '' t
.
~ .
., . . ... - ~ .. . ...... .,..., i ,,. J "' i

' .._,! !..... \.... ... .i\

4. Ejecuta la subrutina llamada por INT 21. Las instrucciones PUSH con que empieza sta, ordena- . '
rn guardar en la pila el contenido de registros de la U~P. Asimismo, lasiristrucctones PQP qu~ >,
estn al final de la subrutina ordenarn restaurar desde Ja pila los contenidos de los registros . . :. ,
guardados mediante las instrucciones PUSH. _...
5. La ltima instruccin de la subrutina, que necesariamente debe ser IRET ordena .r etornar a la
instruccin que sigue a INT 21 en el programa llamador (o sea a INC DL). La direccin de esta
instruccin est en la pila. Tambin retorna desde la pila el contenido del RE. Luego de ejecutarse
IRET, el SP vuelve a su valor inicial FFEE.

Salvo pequeas diferencias, se observan grandes similitudes con lo visto al tratar el llamado a
subrutina. Las diferencias consisten, en primer lugar, en que con INT xx la direccin de la subrutina
se halla a travs de la zona de vectores (figura 3.33). Por otro lado, con INT adems de salvarse la
direccin de retorno (CS:IP), tambin se guarda en la pila el registro RE (flags). Por ello, la
instruccin de retorno se llama IRET ("interrupt return"), dado que adems de la direccin de
retorno, ordena restaurar los flags en RE. A continuacin se dan casos de uso de INT 21 2

Secuencia para leer los contenidos (binarios) de dos posiciones consecutivas de memoria, de direcciones
2000 y 2001, y mostrarlos en hexa en la pantalla en orden inverso (como se establece en Intel)
A 100
xxxx:OlOO MOV BX, [2000] Carga el contenido de 2000 y 2001 en BL y BH, respectivamente
xxxx:0104 MOV CH, 4 Carga en CH el nmero de loops a repetir
xxxx:0106 MOV CL, 4 Carga en CL la cantidad de bits a rotar en BX
xxxx:0108 ROL BX, CL Rota a izquierda 4 veces en BX
xxxx:OlOA MOV AL, BL Carga en AL el valor de BL

1
El flag A. es el Auxiliar Carry, usado para operar en BCD. El flag T (Trap) se usa por ejemplo cuando en el Dcbug se ejecuta
instruccin por instruccin .. Los flags l y D se describen ms adelante. No se han dibujado dos flags para modo protegido.
2
Los valores que se dan a AH (pasaje de parmetros) se obtienen de Internet y de manuales.
U3-40

xxxx:OlOC AND AL, OF Pone en O el cuarteto superior de AL


xxxx:OlOE ADD AL, 30 Suma 30 para convertir el nmero de AL en ASCII
xxxx:OllO CMP AL, 39 Compara con 39 ASCu= 9
xxxx:Oll2 JBE 116 Pregunta si es < 39
xxxx:Oll4 ADD AL, 07 Si es m ayor suma 7 (por ej. 3A + 7 = 41 =A)
xxxx:Ol16 MOV DL, AL Para el BIOS carga E::l nmero de AL en DL
xxxx:Oll8 MOV AH, 2 Inicializa parmetros para ver en pantalla caracteres ASCII
xxxx:OllA INT 21 Llama a subrutina del BIOS
xxxx:OllC DEC CH Decrementa cantidad de loops a realizar
xxxx:Ol lE JNZ 106 Mientras Z=O, volver a 106 --
-. ~....
~- - f.
:

xxxx:0.120.) NT 20 Fin -~ .o!


'

Secuencia para vis ualizar en pantalla 255 =FFH caracteres ASCII, a partir del carcter ASCII 00 - T:. '~ ,.
. . t
A 100 ~ . . ...
xxxx:OlOO MOV CL, FF Carga en CL el total de repeticiones a realizar
xxxx:0102 MOV DL, 00 Carga en DL el cdigo ASCII del primer carcter a visualizar
xxxx:0104 MOV AH, 2 Inicializa parmetros para ver en pantalla caracteres ASCll
xxxx:Ol06 INT 21 Llama a subrutina del BIOS
xxxx:0108 INC DL Para el BIOS carga el nmero de AL en DL
xxxx:OlOA DEC CL Determina el siguiente carcter ASCII a visualiza r
xxxx:OlOC JNZ 104 Mientras Z=O, volver a 104
1
xxxx:OlOE INT 20 Fin
i'
1

Secuencia para ingresar caracteres por teclado, cuyo nmero se indica en la direccin 2000. Jos cuales a f
medida que van ingresando se observan en pantalla y se deben g uard ar a partir de Ja direccin 2001. El
programa se queda esperando hasta que se han tipeado todos los caracteres. Tiene la lim itaci n que al apretar
Ja tecla Enter se v uelve al comienzo de rengln, sin saltar al rengln siguiente.

A 100
xxxx:OlOO MOV CL, [2000] Carga en CL el nmero de caracteres a tipear
xxxx:0104 MOV BI, 2001
xxxx:0107 MOV AH, 1
Inicializa a DI en 2001
Inicializa parmetros para entrar un caracter por teclado, quedando
_,,,f-
esperando el programa hasta que se tipee el caracter, el cual luego aparece
. ~
por pantalla .
xxxx:0109 INT 21 Llama a subrutina del DOS .
xxxx:Olo"B MOV [DI], AL Guarda cada carcter tipeado en lis ta apuntada por DI ... :'.t'.
xxxx:OlOD INC DI Incrementa DI . .i ~

xxxx:OlOE DEC CL Decrementa cantidad de repeticiones a realizar f


xxxx:OllO JNZ 109 Mientras Z =O, volver a 109
xxxx:Ol12 INT 20 Fin f
t
t
Secue ncia que co mbina Ja secuencia anterior para ingresar caracteres por teclado y visualizaarlos. con la que
visualiza un carcter que est en el registro DL. El nmero de caracteres a tipear se indica en la direccin i

2000, siendo que los mismos a medida q ue van ingresando deben obser varse repetidos en pantalla.
El programa se qued a esperando hasta que se han tipeado todos los .caracteres. Tiene .la limitacin que al
apretar la tecla Enter, en la pantalla se vuelve al comienzo de rengln, sin saltar al rengln siguie nte.

A 100
xxxx:OlOO MOV CL, [2000] Carga en CL el nmero de caracteres a tipear
xxxx:0104 MOV AH, 1 Inicializa parmetros para entrar un caracter por teclado. El programa queda
esperando hasta que se ti pee el caracter, el cual luego aparece por pantalla
xxxx:0106 INT 21 Llama a subrutina del DOS
xxxx:0108 MOV DL, AL Guarda en DL el carcter dejado en AL por la subrutina anterior
xxxx:OlOA MOV AH, 2 Inicializa parmetros para que un carcter en DL se vea en pantalla
xxxx:OlOC INT 21 Llama a subrutina del DOS
xxxx:OlOE DEC CL Decrementa cantidad de repeticiones a realizar
xxxx:OllO JNZ 104 Mientras Z=O, volver a 104
xxxx:011 2 INT 20 Fin
U3-41

ESQUEMA DETALLADO DE INTERRUPCIONES POR HARDWARE ENMASCARABLES EN PC


Habiendo tratado en forma global las interrupciones por hardware en la seccin 11 de la unidad 1,
pasaremos a ver ms en detalle el p roceso que tiene lugar durante las mismas.
l. Segn se estableci (figura 3.36), las lneas IRQn de solicitud de interrupcin ("interrupt
request"), salen de las interfaces y van a un chip donde, entre otros circuitos, se encuentra un
"arbitro". Este, en caso de que haya varias lneas IRQ11 activadas simultneamente, le otorga
prioridad a la de menor subndice n.
2. En correspondencia con la prorizacin de una lnea IRQ.,, el "rbitro" activa la lnea INTR,
'"<>\l...-.-. que llega al microprocesador1 pat~er sensada.:e.QrJa UC .. -- ~.,.,..
3. Como se especifica en el diagrama lgico de la figura 3.36, luego de tem1inar de ejecutar cada
instruccin, como ser la In, la UC sensa si la lnea INTR est activa o no. En caso negativo,
pasa a ejecutar la instruccin siguiente, In+l .
Si INTR est activada, la UC se fija en el valor del Interrupt flag 1, contenido en el Registro de
Estado (RE), bit que mediante instrucciones se lo puede poner en 1 O.
En caso de que sea I=l, no da curso a la solicitud de interrupcin indicada por INTR (y
comenzada por la activacin de)a lnea IRQ2), pasando a ejecutar la instruccin In+t
4. Si 1=0, se aceptar la solicitud de interrupcin que lleg a la UC a travs de la activacin de
INTR, y la UC enviar al rbitr INTA (A de acknowledge = aceptacin)
5. El rbitro enva hacia la UC por el bus de datos, una combinacin binaria, que es la direccin
de la direccin donde se encuentra la subrutina preparada exclusivamente para atender la
activacin de la lnea IRQ2' La direccin de la subrutina es el vector interrupcin.
6. La UC ordena escribir en la pila (como en las interrupciones P.Or software) el CS e IP de la
direccin de retorno, y luego el valor de los flags cont_e nidos en RE:
7. Con la direccin obtenida en el paso 5, la UC , direcciona ~,~~: primer instruccin de la
subrutina que atiende la interrpdn, y pasa a ejc_tit.r sta y ~a~iiJentes. .
8. Cuando ejecuta la instruccin IRET, de la pila la UC lee el valor J1 registro RE del programa
interrumpido, y luego el IP y CS de la direccin de retorno. Todos estos valores se restauran :,,.,
en los correspondientes registros de la UCP, con .lo cual se reanuaa la ejecucin del programa
interrumpido.

El tipo de interrupcin tratado se denomina "enmascarable", pues segn el valor del flag 1, a una
interrupcin se le puede dar curso o "enmascarar". Esto ltimo significa que la interrupcin se
tiene que quedar esperando hasta que sea 1 =O, no pudiendo ser interrumpido el programa.
Como se anticip, el valor de 1 puede establecerse por software. As, si un programa no debe ser
interrumpido, empezar con la instruccin STI (Set I), que hace I = 1, y al terminar debe hacerse I = O
mediante la instruccin CLI (Clear I).
En el Debug, el flag I aparece en sus dos valores como El (Enable I) y DI (Disable 1).
Existen tambin interrupciones por hardware "no enmascarables" mediante el bitl, que son sensadas
por el microprocesador a travs de su "pata" NMI (Not Mascarables Interrupt). Un caso de activacin
de la lnea NMI tiene lugar cuando la fuente de alimentacin deja de proveer tensin. En este caso la
interrupcin no enmascarable llamar a una subrutina preparada para tal evento.
PERIFERICO 1 INTERFAZ 1
ew
;,.
N
UAL uc
1 PORT 1
@ r---~-~[SzyCJJ
[YoRTU 1 0000:0240
r------- uc
enva
INTA(4
1 PORT 1
ARBITRO
enva
Zona de vectores dlrde dir I@

0000:024m0
50 Se~sa J@

-
la pila y
se ejecuta
. E3 la 10
1
IRQ
~;:tina BIOS subrutina
hasta la
E320:5000 1 PUSH . . . instruccin
IRQ () PUSH .. . IRET
CD IRQ ...INTR _!!.2-..~]
IRQ
IRQ
POP .. .
IRQ POP .. .

IRQ I IRET

Programa
ARBITRO interrumpido

PERIFERICO n INTERFAZ n 1,

1 PORT 1
.---i.--i--H
CD IRQDir ret (CS:IP . ki_

1 PORT 1

~
Pila

E Figura 3.36
1 PORT 1 p

''
- .... - - .. , .....,~---~~~~~--:-;:i.,--.~ .... - -.-..... . - ..- - - .. .. -- ~.; "~~
..

1
U3-43

MNEMONICOS DE LAS INSTRUCCIONES MAS USADAS

AAA (ASCII Adjust for Addition):


Ordena obtener una suma en BCD a partir de dos dgitos que estn en ASCII, uno de Jos cuales est en el
registro AL, que acta como acumulador. Esta instruccin puede hacer cambiar los flags AC y C.
Ejemplo: AL= 00110110 = 6; BL = 00111000 = 8
ADD AL, BL luego de ejecutar esta instruccin resulta: AL= 01101110 (resultado incorrecto en BCD)
AAA luego de ejecutar esta instruccin resulta: AL= 00000100 = 4 (desempaquetado) y C=l
Esto i~ica que el resultado en BCD es 14 = 6 + 8, siendo_<:;l .~_::~icado P\~ .. _

AAD (Conversin de BCD a binario antes de dividir)


Dados dos dgitos BCD desempaquetados en AH y AL, la instruccin AAD los convierte en un nmero
binario puro contenido en AL. Esta conversin se usa antes de dividir dichos dgitos BCD por un dgito BCD
desempaquetado en CX. El resultado de la divisin aparece desempaquetado en AL, y en AH aparece el resto.
AAD puede cambiar los flags S y Z.
Ejemplo: AX= AH AL = 0000001000001000 = 0208 = 28 desempaquetado; CX = 0009
AAD luego de ejecutar esta instruccin resulta: AX = 0000000000011100 (28 en binario)
DIV ex luego de ejecutar esta instruccin resulta: AL= 00000011 "' 03 (cociente)
AH= 00000001 = 01 (resto)
AAM (Conversin de binario a BCD despus de multiplicar dos dgitos desempaquetados)
Ejemplo: AL= 00000110 = 6 BCD desempaquetado; BH = 00001000 = 8 BCD desempquetado
' ' ~ ~ '~, ' .. .. .... .. j

MUL BH luego de ejecutar esta instruccin resulta AX= 00000~000~10000 = 48 ~ . :.


AAM luego de ejecutar est?- instruccin resulta AX= 00000100 00001000 = 0408 des_e mpaquetado
AAM puede cambiar los flags S y Z.

AAS (ASeU Adjust for Substrction):


#~~~o:.:-~~-_ , .
semejante a AAA, pero para una

resta
-"'.;fi(JJ.:. ~ ~

Ejemplo: AL = 00110101 = ASCII s BL = 001111000 = ASCI.l.8


- ;. f \ ,_
SUB AL, BL luego de ejecutar esta instruccin resulta AL= 11111101 = -3 y e =_L .
AAS luego de ejecutar esta instruccin resulta AL= 00000011 = 03 desemp~quetado, y C=l
Si dos nmeros de varios dgitos son restados, el flag C es tenido en cuenta para los dgitos siguientes, usando
la instruccin SBB.
AAS opern slo sobre el registro AL. Puede cambiar los flags AC y C.

ADC Instruccin ejemplificada en el ejercicio 2 para sumar dos operandos ms el carry existente.

ADD Instruccin ejemplificada en el ejercicio 1 para sumar dos operandos.

AND Instruccin ejemplificada en el ejercicio 25 para realizar la operacin lgica AND.

CALL Ordena transferir la ejecucin a una subrutina.


Un near o intrasegmento eALL llama una subrutina que est en el mismo CS que el de la instruccin CALL,
como se ejemplifica en el ejercicio 38
Un far o intersegmento CALL llama a una subrutina que est en un es distinto que el de la instruccin CALL
En este caso primero se decrementa SP en dos y se copia en la pila el valor de CS. Luego otra vez se decremen-
ta SP en d~s, y se copia en la pila el IP con el offset de la instruccin que sigue a CALL. Despus se caarga es__
con el valor de CS de la subrutina, y se carga IP con el offset de la primera instruccin de la subrutina.

CBW Instruccin ejemplificada en el ejercicio 37, para duplicar el tamao del registro AL

CLC (Clear Carry) Ordena poner en cero el flag C


03-44

CLD (Clear Direction flag)


Ordena poner en cero el flag D. De esta forma los registros SI y DI pueden autoincrementarse autom~t
mente (en uno o dos, segn sea) en las instrucciones para operar sobre strings (como MOVS o CMPS; '
ejemplo en instruccin CMPB)

CLI (Clear Interrupt flag). Ordena poner a cero el flag I, para que la UCP no responda (enmascare) l o~
pedidos de interrupcin que activan las lneas IRQ.

CMC (Complement Carry flag) Ordena poner el flag Cal valor contrario al que tena antes de ejecutar esta
instruccin.

CMP Instruccin ejemplificada en el ejercicio 7, para comparar dos operandos.


Se trata de una instruccin de resta, para que se enciendan los flags segn el resultado (que no se asigna a
ningn destino). Siempre es seguida por una instruccin de salto condicionado

CMPSB
Ordena compara un byte en un string origen (source) con un byte en otro string (destination), siendo que un
string es una cadena de caracteres del mismo tipo (como ser caracteres ASCII). La comparacion se realiza
tomando el byte apuntado por SI, y restndolo del byte apuntado por DI, a fin de que se enciendan los flags.
Los operandos no son afectados por la resta. Despus de la comparacin, SI y DI pueden ser incrementados
automticamente a fin de apuntar a los siguientes elementos correspondientes de los strings. Para ello
previamente el flag D (de direccin) debe ser llevado a cero con la instruccin CLD. El string apuntado por SI
debe estar en el segmento de datos, y el apuntado por DI, en el segmento extra.
La instruccin CMPSB puede ser usado con REPE para comparar todos los elementos sucesivos de un string.
Ejemplo:
MOVSI, 3000 SI apunta al comienzo del primer string
MOVDI, 1000 DI apunta al comienzo del otro string
CLD Pone el flag Den cero para indicar autoincrementar a DI y SI
MOVCX,50 Pone en CX el nmero de elementos del string
REPE CMPSB Repite la comparacin de los bytes correspondientes d e los strings, hasta completar
50 elementos, o hasta que los bytes comparados sean distintos
Si en luegar de usar CLD se bugiera usado STD (Set D; poner a uno a D), los punteros SI y DI se hubieran
decrementado.
CMPSW
Semejante a CMPB, pero para operar elementos de strings que tengan 2 bytes. Tambin, agregando CLD o
STD, los punteros SI y DI pueden autoincrementarse o decrementarsee en dos, respectivamente.

CWD (Convert signed Word to signed Doble word)


Extiende el signo de AX a todos los bits de DX. Semejante a CBW

DAA (Decimal Adjust AL after BCD Addition). Luego de sumar dos nmeros BCD y dejar el resultado en
AL, convierte dicho resultado en dos dgitos BCD. Instruccin ejemplificada en el ejercicio 30

DAS (Decimal Adjust AL after BCD Substraction)


Realiza correcciones semjantes a DAA si va luego de la instruccin SUB AL, ....

DEC Decrementa uno el operando. Instruccin ejemplificada en el ejercicio 3

DIV (Divide magnitudes)


Divide una magnitud de 16 bits por otra de 8 bits especificada en la instruccin, una de 32 q bits por otra de
16 bits especificada en la instruccin. Instruccin ejemplificada en el ejercicio 23
1
IDIV (Divide integers) '
l

Cuando el dividendo tiene 32 bits, su parte ms significativa tiene que estar en DX, y la menos significativa en
1
AX. El divisor puede estar en cualquier otro registro de 16 bits. El cociente resultante est en AX, y DX
contiene el resto, del mismo signo que el dividendo. !
IMUL Instruccin para multiplicar nmeros signados, ejemplificada en el ejercicio 36
U3-45

IN (Input). Ordena copiar el contenido de un port en AL AX, segn que el port sea de 8 6 16 bits,
respectivamente. Ejemplo: IN AL, 3080 IN AX, 4COA (Ver aplicaciones en la Unidad 2)

INC Instruccin ejemplificada en el ejercicio 7

INT Instruccin ejemplificada en el ejercicio 39

IRET Instruccin ejemplificada en el ejercicio 39

JA=JNBE Instrucci!'l.ejemplificada en el ejercicio 8

JAE = JNB = JNC Uump if Above or Equal::; Jump if Not Below::; Jump if Not Carry)

JB =JC=JNAE Instruccin ejemplificada en el ejercicio 10

JBE =JNA Instruccin ejemplificada en el ejercicio 11

JCXZ Uump if the ex register is Zero)

JE=JZ Instruccin ejemplificada en el ejercicio 5

JG = JNLE Instruccin ejemplificada en el ejerci~io 9

JGE=JNL Qurnp if Greather or Equal ::; Jurnp Not Less)


...
JL =JNGE Instruccin ejemplificada en el ejercicio 10

JLE = JNG Ournp if Less or Equal::; Jurnp N~t Greather) ..


.... ...: .. .~-tr
l(,
JMP } !1;.;truccin"ejempli_ficada en el ej:r,9.sj~.A.-- .._;//'.
, - ' , ~1

JNE = JNZ . Instruccin ejemplificada en el ejercicio 3 -" "


"' -
JNO Qurnp if Not Overflow) ....... .,.i
...
JNP =JPO (Saltar si no hay paridad par ::; saltar si hay paridad impar)

JNS Uump if not signed = jump if positive)

JO Instruccin ejemplificada en el ejercicio 4

JPE = JP Instruccin ejemplificada en el ejercicio 13

JS Oump if Sign is negative (S::;l)

LEA Transfiere a un registro el valor de la direccin del operando fuente.


Instruccin ejemplificada ms adelante, en el assembler para T ASM y MASM

LODSB (Load String Byte in to AL)


Ordena copiar en AL un byte de una locacin de un string apuntada por SI. Mediante el flag 0::;0, el registro
SI se incrementa automticamente para apuntar al siguiente elemento del string. Si 0 ::;1, SI se decrementa
automticamente.

LODSW (Load String Word into AX)


Ordena copiar en AX dos bytes consecutivos de un string, apuntados por SI.

LOOP
Ordena repetir una secuencia de instrucciones un nmero de veces dado por el contenido de CX. Cada vez
que LOOP se ejecuta, CX es automticamente decrementada en l. Mientras CX:;eO salta a ejecutar la instruccin
U3-46

ejemplificada por la direccin que acompaa a LOOP. (Esta direccin ~o puede superar el rango de +127 a 1
-128 bytes desde la instruccin que sigue a LOOP) 1 '

LOOPE = LOOPZ
1
Ordena repetir la secuencia mientras sea ex:,. o y Z=1

1
LOOPNE = LOOPNZ
1
Ordena repetir la secuencia mientras sea ex : /:. O y Z = 1
1
1

MOV Transfiere el valor del operando fuente hacia el operando dest~I!o)nstruccin ejemplificada
en el ejercicio 1

MOVSB (Move String Byte)


Ordena transferir un byte de un string apuntado por SI en el segmento de datos, hacia una posicin en el
segmento extra apuntado por DI. El nmero de elementos a ser transferidos es puesto en CX.
Si flag D=O, entonces DI y SI sern automticamente incrementados en uno.
Si flag D=l, entonces DI y SI sern automticamente decrementados en uno.

MOVSW Semejante a MOVSB, pero copia 2 bytes.

MUL Instruccin ejemplificada en el ejercicio 29

NEG Genera el complemento a dos del nmero contenido en un registro

NOP Su ejecucin emplea hasta 3 ciclos reloj, y luego incrementa el IP para apuntar la prxima
instruccin. Se usa para aumentar el retardo de un loop que genera retardo.

NOT Ordena invertir cada bit dell operando.

OR Realiza una operacin OR. Instruccin ejemplificada en el ejercicio 25

OUTxxxx Transfiere el contenido del registro AL ( AX) hacia el port de direccin xxxx

POP Copia 2 bytes desde la cima de la pila (apuntadada por SP), y los transfiere al registro o :::.:.'.
des tino indicado en la instruccin. Luego se incrementa en dos el SP. Ejemplificada en el ejercicio 38 . :_>kc<:

POPF Instruccin ejemplificada en el ejercicio 39. Ningn flag es afectado por esta instruccin.

PUSH Primero ordena decrementar en dos al SP, y luego salva 2 bytes (que tpicamente estaban en
un registro) en la cima de la pila''. Ejemplificada en el ejercicio 38.

PUSHF Instruccin ejemplificada en el ejercicio 39

RCL Ordena la rotacin a izquierda dibujada un cierto nmero de v eces, en la que se incluye al
flag C (comparar con ROL)
C ~ MSB LSB
l~~~~~~~-t

Ejemplos: RCL BX, 1 MOVCL,4


RCL BX, CL

RCR Ordena Ja rotacin a derecha dibujada, en la que incluye al flag C (comparar con ROR)
e~ MSB LSB
t l

REPZ = REPE
Ordena repetir una ins truccin para stringsd hasta que se de una cierta condicin. A menudo usada con
CMPS, para comparar dos cadenas hasta que ex= O hasta que los elementos del string no sean iguales.
U3-47

Ejemplo: REPE CMPSB compara bytes de cadenas hasta el fin de la cadena, o hasta que bytes de las
cadenas no sean iguales.

RET Ordena saltar a la instruccin que sigue a la ltima CALL ejecutada.


Instruccin ejemplificada en el ejercicio 38

ROL (Rotate Left)


Ordena la rotacin a izquierda dibuja, un nmero de veces

C (-- MSB +--- -- ---LSB


J,_ _ __ _ i
ROR (Rotate Right)
Ordena la rotacin a derecha dibujada, un cierto nmero de veces

MSB LSB--? C
..
i _ _ _ _ __ J,
SHL =SAL (Shift Left)
C (-- MSB ~------LSB (-- O
Como indica el dibujo, ordena desplazar hacia la izquierda cada bit del operando un cierto nmero de
posiciones (indicado por CL'). Conforme un bit es desplazado d e la posicin menos significativa (LSB), un
cero es puesto en dicha posicin, a la par que el valor del bit que est en la posicin ms significativa (MSB) es
puesto como valor del flag C. En el caso de varios desplazamientos sucesivos, el flag C toma. el valor del bit
ms recientemente desplazado desde la posicin ms significativa.
Esta operacin puede usarse para multiplicar un nmero natural por dos, o una potencia de dos.
. ,.,,
.' ' .....,'
SAR
MSB --? MSB LSB --? C ~ ::.'1 '
Esta instruccin puede usarse para dividir un nmero signado por dos, o una potenda~s'e:d6s, ~ado q~e el
0

MSB es copiado nuevamente como MSB, conforme el que era bit de signo es desplazado a la dere"'Clta. ..
..
.; . . .:,. ; :!~~-~ :
',.~}-
SBB (Substract with borrow). Como ADC, p~~o pa;~ la resta. _., '?~ t:1il ~
. , ....,.-. ."'_-~.:~.~;:~ ... .- :

... "'\ ... , \ .. : .. ~~t ...


SCASB (ScanaStringByte) ": ~ . .,;..;.:.~..:) ,.. ;
Ordena comparar un byte en AL con un byte' de uh string. apuntado por DI en ES. . ~ : r '
Si flag D=O entonces DI ser incrementado luego de SCASB; y si D=l entonces DI puede ser de~rementado
luego de SCASB

SCASW (Sean a String Word)


Ordena comparar AX con 2 bytes consecutivos de un string apuntados por DI en ES. El flag D puede usarse
para incrementar o decrementar DI en dos.

SHR Instruccin ejemplificada en el ejercicio 34, para nmeros na turales.

STC (Set Carry flag): ordena hacer C=l

STD (Set Direction flag): ordena hacer 1 el flag D, de direccin.

STI (Set Interrupt flag):


Ordena hacer 1 el flag I, para habilitar las interrupciones por hardware enmascarables.

STOSB (Store Byte in String)


Ordena almacenar una copia de un byte desde AL en una locacin de memoria apuntada por DI en el ES,
reemplazando un byte de un string. Luego DI puede ser automticamente incrementado o decrementado segn
que el flag D valga O l, respectivamente.

STOSW (Store Word in String)


Ordena almacenar una copia de AX en dos bytes sucesivos apuntados por DI en el ES, reemplazando 2 bytes
de un string. DI puede autoincrementarse o decrementarse en 2 mediante el flag D.

1
Si el nmero de desplazamiento es uno, ello puede especificarse colocando un uno a la derecha de la coma en la instruccin.

U3-48

SUB Ordena restar dos operandos. Instruccin ejemplificada en el ejercicio 1

TEST
Realiza una operacin AND para activar los flags, sin asignar resultados. Semejante CMP respecto de SUB.

WAIT
Ordena aque el procesador pase al estado IDLE, en el cual no procesa hasta que se active la entrada de
interrupcin INTR o NMI, o hasta que la entrada TEST resulte baja. Se usa para sincronizar al procesador con
hardware exterior.

XCHG (Exchange source and destination) 'i:C ~: - -


Ordena intercambiar el contenido de un registro con el otro, o el contenido de un registro con contenidos de
locaciones de memoria.

XLATB (Translate Byte in AL)


Translada un byte de un cdigo a otro cdigo. Reemplaza un byte en AL con un byte punteado por BX, en
una tabla de memoria

XOR
Ordena realizar Ja operacin X-OR entre cada bit de un operando fuente con cada bit del operando destino, y
el resultado colocarlo en el destino. Si se hace XOR AX, AX, el registro AX se pone en cero.



TECNCAS DIGITALES Il

lnstrucci6n Co11dlci61) pro!JtJtl~ Ctllellfrlfio


------
JA e ~oy?:"o rlr.ca si Oi:t pr oriib\
JAE e=O fJr:ncn si sl f)r nrrili o bs igUal n
JD e= 1 Brln!;ll si ost pr abaj
JU!: e= t oZ"' 1 [1rln<;n s! st~ por abajo o ,s lgunl n
JC c-1 Crfr,cn (lor ocoirco
JE o JZ z= 1 f:lrlnM si os Igual o corfi
JG Z=OyS=O f:llititll SI S mliyor C]UO
.JGE S=O rwnca si os mtiyr quo, d lgUal D
JL s .. o tlilfll:a si s r'l'l.Mr que
JLE ZnloS,.C 81tnca si 'S M.Mr qun, o 1yu111 a
JNe e=O Ot!nca si M hy ac1meo
JNE o JNZ Z=O Otinca si no os tg11al a, o si no es coro
JNO o= o l11nca si no ho.y !obreflufo
JNS S=O tltlnl'.a si no hay !lgno
JNP/JP.O P=O n1J11ca si no ltay paridod o con paridad lm'iar
JO o .. 1 Utlilcl\ si llny sobtelufo
JP/JPE I' =1 13rlnc .~I hay '>1\rh:Jad o paridad par
JS SR1 Orlnco si hay signo ;
JCXZ ex~ o lrlncAr si ex .. o .

..'t.

; . -...,.
";; .
..';. ,. ....
...
Nm6ros aln 1lgno Nmeis co11 ~lgho

255~
254= ,127~
+126 1~H

132
131
04H
03H
- +2
+1
02H
01H
-
130 _ __Olli__ +O OOH
129 OIH -1 r-ni
128 801-1 -2 FEH
---...... .---- ----
~
4 1 124 84H
3
03_11_ _
+125 03H
--
04H
2 O~H -! 126 0QH
1 OIH - 127 OIH
o 001-1 - 128 O'OH

JNSTRUCClONES DE SALTO

Вам также может понравиться