Sie sind auf Seite 1von 53
ASSEMBLER DESDE CERO € INTERRUPCIONES MARIO CARLOS GINZBURG INGENIERO ELECTRONICO (UBA) DIRECTOR DE LA CATEDRA DE “ESTRUCTURA DEL COMPUTADOR" E INVESTIGADOR EN LA FACULTAD DE INGENIERIA DE La UNIVERSIDAD DE BUENOS AIRES A Piyi, Jerénimo y Rafael A. mis alumnos INTRODUCCION GENERAL A LA INFORMATICA: 3 ASSEMBLER DESDE CERO M.C.Ginzburg Fs propiedad - Queda hecho el depésito que marca la ley Impreso en la Argentina - Printed In Argentina DERECHOS RESERVADOS © 2000 LS.B.N. 987-43-2203-9 Impreso en talleres prensa & acabado, Concepeién Arenal 4866, Capital Federal en el mes de agosto de 2000 No se permite la reproduccién total o parcial de esta obra, ni el almacenamiento en un sistema de informatica, ni transmisin en cualquier forma o por cualquier medio electrénico, mecénico, fotocopia, registro u otros medios, sin el permiso previo y la autorizacién escrita del autor. INDICE UTILIZACION DEL LENGUAJE ASSEMBLER ....... : ne REGISTROS DE LA UCP A UTILIZAR seca a EJERCICIOS EJERCICIOS DONDE SE DEFINEN INSTRUCCIONES DE SALTO. EJERCICIO CON UNA LISTA (VECTOR) a EJERCICIO DONDE SE DEFINE LA INSTRUCCION DE COMPARACION Y DOS LISTAS 10 JERCICIOS CON NUEVAS INSTRUCCIONES DE SALTO... sel al5 EJERCICIOS CON SUMA DE NUMEROS NATURALES ¥ ENTEROS DE UNA LISTA. .. 16al7 EJERCICIO CON TRES LISTAS. EJERCICIO PARA VERIFICAR MEMORIA Y EXTENDER SIGNO. EJERCICIO CON MODO INDIRECTO POR REGISTRO CON DESPLAZAMIENTO ‘MEDIANTE REGISTRO ¥ EJERCICIO CON DIVISIONES : we 20 EJERCICIO CON USO DE INSTRUCCIONES AND, ROL Y OR....2.000000000seessee 22 EJERCICIOS CON REORDENAMIENTO DE LISTAS - EJERCICIOS DE MULTIPLICACION Y DE SUMA EN BCD... EJERCICIO PARA OBTENER RAIZ CUADRADA .. RJERCICIOS PARA MULTIPLICAR ENTEROS.....-- 22. 00++ DIRECCIONES EFECTIVAS ¥ REGISTROS DE SEGMENTO . 0.0.0.0... c0.c0000000:29830 LLAMADOS A SUBRUTINAS Y USO DELAPILA...... 31038 PASAJE DE PARAMETROS ......0.0000c0ccsccceceeesesses 136037 INTERRUPCIONES POR SOFTWARE (INSTRUCCION INT)... 3941 INTERRUPCIONES POR HARDWARE... 2.0000cccscccecseeceeseeeseerseee MNEMONICOS DE LAS INSTRUCCIONES MAS USADAS deceeeeeeeeeeesee ed CUSPIDE ‘Av Gral, Paz 57 PROLOGO Esta corta editiGn previa salié a pedido de los alumnos, dada la inexistencia de textos que expliquen en forma progresiva la ensefianza 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 Assemble. El objetivo de esta mitad es que el alumno incorpore las estructuras bésicas de programacién en Assembler, conozca las instrucciones més 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 mds complejas. Esto es, se definen los modos de direccionamiento bésicos que combinados permiten operar cualquier estructura de datos. ‘También se ha tratado que los ejercicios vayan progresando en complejidad. No podia faltar el llamado a subrutinas con el consiguiente uso de Ia pila, instrucciones PUSH y POP, y el pasaje de pardinetros. Dado que tanto las interrupciones por hardware (mediante las Ifneas IRQ), como las interrupciones por software (mediante la instruccién INT xx) son formas de llamado a subrutinas (del BIOS 0 del sistema operativo), por extensién se tratan éstas, indicando su proceso en detalle. Si bien el Assembler esta dedicado a procesadores de Intel (dada la facilidad de acceder al DOS desde cualquier PC para practicarlo) los conceptos desarrollados pueden aplicarse a ottos microprocesadores y microcontroladores. La otra mitad (en preparacién), a cargo del Ing. Carlos Robello, trata en esencia los mismos jercicios desarrollados en la primer mitad, pero realizados con directivas para programas ensambladores més poderosos, como cl TASM y el MASM. Esta mitad se incorporard a la primera en una préxima edicién completa De esta forma, el alumno primero se concentra en lo fundamental del lenguaje, para luego manejar un Assembler de més alto nivel, con mayores posibilidades y Mlexibilidad de programaci6n. Asimismo esta plancado agregar nuevos ejercicios mas complejos. usa UTILIZACION DEL LENGUAJE ASSEMBLER Conviene actarar que en nuestro pais se habla de programar en “assembles”, siendo que en realidad el lenguaje se denorina assembly. Assembler (Yensamblador”) es cl programa traductor de assembly a cédigo de miquina, por le que Jenguaje assembly puede traducirse como lenguaje “ensamblable” o lenguaje para ensamblador. Siguiendo la costume, seguiremos llamando assembler al lenguaje simbélico de mdquina, y ensamblador al programa traductor citado Recordemos (Historia de la Computacién, unidad 1) que el assembler fue el primer lenguaje simbélico creado. Permitis ‘escribir programas desde el teclado de un computador (salida cddigo ASCID, 10 cual suponia la existencia de un Programa ensamblador, para pasar los simbolos en ASCII a cédigo de méquina, Cada modelo de procesador tiene su correspondiente lenguaje assembler, y su ensambladot. Por fo general, los nuevos ‘modelos de un mismo fabricante conservan instrucciones en assembler de modelos anteriores. Asf, 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 particulares para simbolizar insteucciones en assembler, con un poco de practica no resulta difcil para quien sabe programar un determinado assembler, pasar a ot, Dado que la mayoria de las PC usa procesadores de Intel 0 sus clones, y que desde una PC se puede programar cémodamente en assembler, desarrollaremas el assembler de Intel como lenguaje representativo. En el presente, se programa en Assembler para distintas aplicaciones. Lo més corriente quizés sea programar porciones dde un programa que necesitan ser ejecutadas en corto tiempo, siendo que la mayor parte del programa se desarrolla con tun lenguaje de alto nivel (C, Pascal, Basic, etc). Esto se debe a que wn Compilador para CISC (unidad 1), al pasar de alto nivel a cédigo de méquina genera cédigo en exceso, en comparacién con el oblenido a partir de assembler, lo cual redunda en mayores ticmpos de ejecucién de porciones de programa cuyo tiempo de ejecucién es critica. Como ccontrapartida, en general leva més tiempo programar en assembler que en alto nivel ‘También suele usarse el assembler para desarrollar manejadores de perifeicos, y para controlar directamente cl hardware, dada la flexibilidad de este lenguaje. EI lenguaje assembler, por otra parte, es una herramienta imprescindible para dominaar a fondo el funcfonamiento de un ‘computador, de modo de sacariee! méximo provecko. pee = : AX AH t AL si 5 BX BH : BL DL 7 cx CH i cL iP Dx DH : 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 acumulador, y pata operaciones de entrada y salida. Este registzo también es indispensable usarlo cuando se rulliplica o divide, segin se vers. Pero en Ia UCP existen otros registros de 16 bits que pueden elegirse indistintamente como acumuladores, como BX, CX_y DX (figura 3.1), que serén empleados en assembler a partir del ejercicio 3. ‘También se dispone en la UCP de 1os registros ST y DI para guardar exclusivamente direcciones que apunten « posiciones de memoria (registros punteros), como se ejemplifica a partir del ejercicio 6 BX es el vinico acumulador que también puede wilizarse como registro puntero (eercico 16). “El registro IP (instruction pointer) es afectado por las instrucciones de salto Gump). Si se necesita operar datos de 8 bits, ls registros de 16 bits: AX, BX, CX o DX (0 sea los terminados en X), pueden dividirse en dos registtos de 8 bits. Por ejemplo, AX se descompone en AHL y AL; BX en BH y BL, et °- = Las letras H (de “high”), y L (de “low”) hacen referencia ala parte alta y baja de un registro de 16 bits ee {En los procesadores 986, 486 y Pentium, los registro citados pueden tener 32 bis, indicéndose EAX, EBX, u3.2 Entonces, en assembler, cuando se necesita definir un registro para datos o resultados de 16 bits, el mismo tendré su segunda letra terminada en X; y en caso de ser necesatio emplear un registro para datos o resultados de 8 bits, se usara una mitad del mismo, la cual se identificaré por ser su segunda letra una Ho una L, segtin se elija Ferrer eee eens otra lpm geet ea aa en bite tnedntelaslbologs se dei El Deg slope din restr de Tou Bl EJERCICIO 1 Escribir en assembler las instrucciones necesarias para codificar la operacién R=P +P-Q Suponer qu, como en ta pégina 31 de la Onidad lls variables, Py Q estén en ls retiones $010, 5000 5006, respectivamente, y que son magnitudes. Razonando de igual forma que en la Unidad I, se debe también tener siempre presente en assembler el esquema del caleulador de bolsillo, en el cual los datos estén en su memoria, y los célculos se efectiian usando como acumulador el visor. Segsin se explic6, en un computador también por un lado se tiene los datos en memoria, y por otto lado se tiene el procesador (supuesto de Intel en esta obra). Como se describi6, en este Sltimo, se encuentran distintos registros que pueden ser usados a eleccién como acumnuladores, designados AX, BX, CX y DX ‘Usando el programa Debug para codificar en assembler, es necesario partir siempre de una asignacién de direcciones de las variables (datos) en memoria, o sea suponer que previamente estén 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. Tn este caso se asume que las variables se encuentran en las direcciones 5010, 5000 y 5006, seg se enuncid Mediante el comando A del Debug se pueden escribir programas en assembler. Al lado de la letra A se debe colocar la direccién (en general arbitraria) a partic de la cual se quiere escribir el programa. A los fines de continuidad con la Unidad I, usaremos la misma direecién (0200) para comienzo del programa. En otros ejercicios posteriores hemos elegido arbitrariamente la direccién 0100. Escribiremos a continuacién en assembler, para el Debug, las 4 instrucciones que se correspondien con I, @T, de Ja pagina 31 citada 4.0200 1 yooo200 MOV AX, [5000] _Llevar a AX una copia del dato (P) que esti en 5000 y 5001 de la memoria vo0x.0203 ADD AX, [5000] Sumara AX una copia del dato (P) que esta en 5000 y 5001 de la memoria, yovac0207 SUB AX, [5006] .1 estar a AX una copia del dato (Q) que esté en 5006 y 5007 de la memoi vovx20B MOV [5010], AX! Transferit a 5010 y SO11 de memoria una copia del contenido de AX ro00c020E (Ge vuelve a pulsar para salir del comando A) ‘i (El guidn indica que el Debug espera otro comando) ‘Con sx se han querido indicar 4 simbolos hexadecimales, cuyo valor puede ser distinto en cada PC. Tos corchetes que aparecen en las instrucciones del assembler de Intel, indican posiciones de memoria. Cuando una instruccién tiene un miimero entre corchetes su dice que esté en “modo directo”, o en modo de direccionamiento directo, siendo que directamente asi se da la direccion para localizar en memoria el dato a procesat, En la figura 32 aparece un diagrama légico, que es conveniente ‘AX=1020 realizar antes de codificar en assembler. El mismo también muestra los valores que iria tomando AX durante el proceso. Con AX += AX + [000/011] x n949 (5000/01) se quiere indicar los valores contenidos en las 7 pposiciones de memoria 5000 y 5001 (dos bytes de informacién). A la derecha de cada rectingulo aparece el valor que tendria el }AX=0000 registro o posicién si se ejecutaria la instruccién Luego de tipear una instruccion en assembler, y de pulsar “Enter” (J), el programa traductor Ensamblador (que viene con €1 Debug) traduce los caracteres de la instruccién en assembler (que estén en ASCII), en el correspondiente cédigo de méquina. Asi, a partir de la direceién 0200 la instruceién MOV AX, [5000] queda codificada como A10050, segiin aparece en la pagina 31 de la Unidad I. Puesto que el Debug ahora sabe que dicha instruccién ocupa 3 bytes, luego del Enter escribiré autométicamente 17000203, Esto mismo se repite con cada instruccién. AX — [5000/01] AX +— AX - [5006/07] ee [5010/11] — ax '5010/11}=0000 Figura 3.2 U33 En definitiva, después de tipear las 4 instrucciones, en memoria quedaré la secuencia de cédigos de maquina indicada en dicha pagina 31, no quedando rastro alguno de lo tipeado en assembler. De esta forma, se evita tener que escribir con el comando E todos los eédigos de instruccién, como se hizo en la Unidad 1, pagina 34 Debe notarse que en lugar del registro AX podriamos haber usado BX, CX o DX; sdlo hubiesen cambiado los cédigos de maquina de las instrucciones. Si se quiere ejecutar las instrucciones de la secuencia anterior escrita en assembler, primero se debe dar valores a las variables en las direcciones, mediante el comando E, como se hizo en la pagina 33 de la Unidad 1 Luego se debe proceder conforme a lo realizado de la pagina 36 a 39 de la Unidad I + En cualquier momento que se quiere verificar si la secuencia a ejecutar 0 en ejecucién es la correcta se usa el comando U seguido por la direccién donde comienza la secuencia: 0200-1 £ xxexx0200 410050 MOV AX, (5000), 00x. 0203 03060050 ADD AX, [5000] xxx0207 28060650 SUB AX, [5006] soo 020B A31050 ‘MOV [5010], AX Los puntos suspensivos indican otras instrucciones que arroja el comancio U, pero que no interesan a nuestro problema. Son “basura”. Este comando realiza lo que se denomina “disassembler” o “unassembler”. Esto es, a partir de la direccién dada (0200 en este caso) interpreta los c6digos de miquina de un programa en sus correspondientes instrucciones en assembler, efectuando el proceso contrario al que realiza el programa traductor Ensamblador. Los conceptos hasta aca vertidos sirven para todos los ejercicios planteados, EJERCICIO 2 : be Escribir una secuencia para realizar Ja suma R = M +N de dos niimeros enteros de,32 bits (").~i4 integers”), dado que mediante ADD’ AX, [xxxx] s6lo pueden sumarse dos nimeros de. 16 bits Los valores de My Nen decimal son: M=~2.650.000 y N= 3250876 : on ‘A continuacién se indican Ios valores dé'las vatiables'con bit de signo, corto los dejaria et’ memoria un programa traductor. Con fines didacticos han sido sumados y expresados en hexa. ca - AL11110101111001000001110000 “= FFD79070 a yjovo1409301010111100 = 003]9ARC 1900000000000100100x0161100101100 10009 282c tL 4 szve szve 0001 0011 AX == 120007011 | 44-5070 T AK =~ AX + (200809) | «2800 oo ~—_ S2ve 2008 | BC] |] {_[2010/41] == AX | eoratt}en2c of9A] | y r | ‘| —*—. 42002108) _| ax=rro7 | AX-AX + [200A/0B] + Ca. o099 2010 Se 1 [2012/13] -— AX pee R (2012/16}-0000 cy Figura 3.3 U3-4 Los niimero M y N de 32 bits serén los datos para el programa a desarrollar. Separados en dos grupos de 16 bits se sumarén en forma fraccionada, habiéndose indicado en negeita los que se sumaran primero. Se supone una UAL como la del 80286, que s6lo puede puede sumar hasta dos niimeros de 16 bits cada uno. Esto es, el programa sumaré primero los 16 bits menos significativos de M (arbitrariamente escritos en las irecciones 2000 y 2001 como se indica en la figura 33 con los de N (en las direcciones 2008 y 2008), y almacenaré los 16 bits del resultado parcial obtenido en las direcciones 2010 y 2011 (que despus de ejecutarse el programa deberén contener 2C y 28, respectivamente, como se deduce de la suma anticipada realizada con fines didscticos) LLuego se sumarsn los 16 bits superiores de M (localizados en 2002 y 2008) can ls correspondiientes de N (en 200! ¥ 2008), a los cuales se les adicionaré el valor 0 6 1 con que resulta el carry C generado de la suma de los 16 bits de la mitad inferior (en nuestro ejemplo resulté Cal, como se indica en la suis diddctica). El resultado de la ssuma de la mitad superior (que en hexa deberd ser 0008) se guardaré en 2012 y 2013, a continuacién de donde estardn los 16 bits de la suma de la mitad inferior. Estos pasos se indican en el diagrama l6gico dela figura 33 Arbitrariamente escribiremos en assembler la secuencia a partir de la direceién 0100, existiendo corresponden- cia entre los 6 pasos del diagrama légico y las 6 instrucciones siguientes: A100 ye00c0100 MOV AX, [2000] evar a AX una copia del dato que esti en memoria en 2000 y 2001 ye00<0103 ADD AX,[2008] Sumas a AX una copia del dato que esté en memoria en 2008 y 2009 x0%0107 MOV [2010], AX Transferira 2010 y 2011 de memoria una copia del contenio de AX yxx010A MOV AX, [2002] Llevar a AX una copia del dato que est en memoria en 2002 y 2003 xooc010D ADC AX, [200A] Sumar 2 AX copia del dato que esta en 200A y 2008 més Carry anterior voxx01ll MOV [2012], AX Transferir a 2012 y 2013 de memoria una copia del contenido de AX La instruccién ADC (“Add with Carry”) es distinta de ADD, pues ordena sumar a AX el contenido de dos posiciones consecutivas de memoria (200A y-200B) més el valor que ten‘a el flag C de carry antes de ejecutar Ia instruccién. Puesto que una instruccién fipo MOV, como MOY [2010], AX, no cambia ningiin flag. el valor de Ces 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 mullibyte FJERCICIO 3: uso de una instruccién de salto condicional (conditional jamp) Emplearemos una instruccién de salto condicional para repetir Ia ejecucién de una secuencia Esta estructura serd usada repetidamente en la mayoria de los ejercicios. La usaremos para realizar el producto R = M x N, iépitiendo N’ veces un procedimiento que consiste en una suma. Lo hacemos por razones didacticas, dado que en el presente los micto- procesadores poseen instrucciones para multiplicar y dividir mediante una sola instruccién. Efectuaremos R= MxN=0+M+M+....+M; _6sea mediante N sumas con sumando M. nun acumiulad6r, que primero se pone en 0, iremos tegistrando los resultados de las sumas sucesivas. ‘A fin de que resulte una secuencia sencilla, supondremos: que M y N son niimeros enteros' positives de dos bytes, que N #0, y qu -sultado R £32767. Luego se vera como detectar si se supera este maximo’. Ejemplifcaremos el p a desarfolla para la operacion MxN= 3x4 = (11 x 100), a efectuatse como R=MxN=0411 411411411 (N=4sumas con el sumandoM=11,) Asignaremos (figura 3.4) a la variable M (con valor 0003 ,) las direcciones de memoria B300 y B301; y a la variable N (con valor 0004,,) las direcciones B310 y B31. Se ha reservado para el resultado R la B320 y B321. Los ndmeros enteros se tratanen la Unidad 4 de esa obra, tras limitaciones que tend a secuencia a desatollar, esque si MuO, si bien el resultado seré P=, se repetn el lazo N veces Surge as a necesidad de un programa mis genésco,capaz de detecar desde su iniio si M 6 N valen oot, se asigue inmediatavente 3 {a-variableR el valor 0. Esto podr concretare luego de que dfinamos la instaccién compara. Fn este ejemplo se ha busca la smplicidad didsctca en luge de la igorosidad oe UBS 8300[08 ] ty Conforme a as nstrucciones conccidas, una secueneia para realizar N sums repetas seri 1} 00 MOV BX, [B300] ___Llevar a BX una copia de M que esté en B300 y B301 SUB AX, AX Poner acumullador AX en cero, restindolo de sf mismo, [ADD Ax, Bx ‘Sumara AX una copia del valor de BX = M B310| 04 ] N ddem 1/00 dem LADD Ax, Bx En AX est el resultado MOV [8320], AX Se asigna el resultado a R, que esta en B320 y B321 {La tinica instruceién ruieva es SUB AX, AX usada para lievar el registro AX a cero (lo mismo Figura3.4 puede hacerse para limpiar cualquier registro). También ex formas de hacerlo. Cuando el dato a operar no esta en memoria sino en un registro de la UCP, el modo de direccions denomina “modo registro” tose A fin de evitar escribir N veces ADD AX, BX se construiré (ver secuencia siguiente en assembler) un lazo repetitive controlable, que obligue a ejecutar N veces dicha instruccién escrita una sola vez, con la ayuda de dlos instrucciones nuevas: DEC CX y NZ (jump if not cero), que aparecen en la secuencia esctita. Previamente, ‘mediante MOV CX, [B310] se cargara en CX una copia de N, para contar las N veces que se ejecutaré el 1220, valor que disminuird cada vez que se ejecute DEC CX, instruccién en modo registro, que ordena decrementar (disminuir en uno) el valor de C Tipicamente se usa el registro acumulador CX para controlar s veces que se debe repetir un lazo, En definitiva, una secuencia en assembler puede ser: A100, yoooc100-- MOV CX, [B310] Llevar.a CX una copia de N que esté en 8310 y B31. ovoctl04._ MOV BX, [8300] evar a BX una copia de M que esté en B300 y B30i yooxi0108 SUB AX, AX Poner acumulador AX en cero, restandolo de sf mismo rox010A ADD AX, BX Sumara AX el valor de M que ests en BX . rowx010C | DECCX Restar uno a CX (con lo cual pueden cambiar lo flags SZVC), soooc10D NZ 010A Si luego de la instruccién anterior Z-0 (CX no zero) saltar a 010A. oooc0l0F | MOV {[B3201, AX Llevar a 8520 y B521 de memoria, una copia del valor de AX po00:0112 INT 20 Instruccién de final’ a Como se observa en el diagrama légico de la figura 35, GX=— [BSTO/I] Jox-o004 al procedimiento bisico que se debe repetir Ni veces consiste en este caso en la instruccién ADD AX, BX BX +— [8900/01] | 99g aida ver gies realiza est suma, la operaci siguiente r a ddescuenfa uno al contenido del registro CX (que ass iniclalmente es N); y la operacion subsiguiente determina A AX = Ag! Axe0000—_slelndmero contenido en CXaleanz6 ool valor eros Mientras (“while”) este mimero en CX no sea cero (not XS TAKS BX Jay goog eto = NZ) 0 sea mientras el fesultade de rear Une'a rv Ke corresponda Ia indicacion 2=0 (condicién de salto Coen de JNZ), se salta a sjecutar nuevamente ia instruccién X=0003 ADD AX, BX de comienzo de la secuencia que se debe Teeraen| crn sever Sav repetir. La_direccién de esta instruccién a la que se v Zo (Cx#) uiere sala es el nimero que acompata a NZ =e. En definitiva, desler sresulado \ ae anterior no e ipsaoel— AX _|tasoo2tje0012 i, ordena ° ont ci Tai fe sigie @INZ. Figura35 Tmbién puede decirse que JNZ HARK oFdena saltar a la instruccién de direccién hhhh si es verdadero ordena continuar con la instrucci6n que sigue a JNZ to) aye Ze que sies falso que sia instrucisn no convene ejeutarle mediante el eomando T del Debug, pues puede hacer perder el programa tpead, ® Noconfundiret hecho de que un resultado na sea cero (NZ), con ia indicacin del ag para exe eso: 2-0 que significa Zero no “Tener presente que cuando un resultado si es cro el flag x Z=1 (eros), como se expica en a unidad 4 de eta obra. 36 Alllado de cada rectangulo del diagrama lgico (figura 3: er ejecucion de las instrucciones del laz0. Después de realizar N veces el lazo, el contenido de CX, que era N, se le habré restado N veces uno. La sitima resia que efectuard la UAL con el valor de CX serd 1-1 = 0, con lo cual ser Z=1, en correspondencia con CX=0, En consonancia se habran realizado Naumas. A esta altura del proceso, el siguiente zalto con la condicién que sea Z=0 no se realizaré, por no verificarse esa icin. y la secuencia continuaré con MOV [B320], AX escrita a continuaciGn, se indica el contenido del lugar de destino para la En este ejemplo, con Ned $e ejecutaraé 4 veces el lazo, realizéndose en cada oportunidad las siguientes operaciones que-ordenardn las instrueciones dadas, con los resultados en hexadecimal que se indican 0 ADD AX, BX DEC CX JNZO10A raver: AX@043 AX=3— CX-4-1(Z=0) XB Salta a 010A pues Z) Dia ver: AXE3+3 AX=6 = CX@3-1 (220) CXe2 Salta a 010A pues Z=¢ Braver: AXE 643 AX=98 — CXE2-1 (20) CXat Salta a 010A pues 2-0 Minver: AXE 943° AX=C CXE1-1(Z-1) CKO No salta, sigue, pues = AU Bsto puede veritcarse paso a paso, secutando Ia secuencia dads, mediante ol comando T del Debug, En la seccién N.3 de la Unidad 4 se define el overflow para nsimeros enteros. Para un formato de 16 bits, como ‘el que tienen los registros AX, BX, CX, DX, existe overflow si por ejemplo, una suma de enteros positives ‘supera el valor 32767. En ese caso la UAL genera la indicacién V=1 de existencia de overflow. Modificaremos la secuencia del ejercicio anterior para que si por los valores My N alguna suma parcial o total excede 32767, con lo cual la UAL genera indicacién de overflow, se indique esto escribiendo FFFF en B320 y B321. Para tal fin, en la secuencia anterior luego de la instruccién de suma agregamos la instruccién JO como se indica a continuacién. A100 soox0100 MOV CX, [B310] Llevar a CX una copia de N que esté en B310 y B311 soooe0104 MOV BX, (B300} evar a BX una copia de M que esté en B300 y B3O1 woox0108 SUB AX, AX Poner acumulador AX en cero, restindolo de si mismo yoxx010A ADD AX, BX Simar a AX el valor de M que esté en BX wxxxOl0C J0.01 Si de la instruccién anterior resulta V=1, saltar a 0130 soo 010E, c Restar uno a CX (con lo cual pueden cambiar los flags SZVC) roox:0l0F — JNZOI0A, Si luego de la instruccién anterior Z=0 (CX no zero) saltar a 010A soox0111 MOV [320], AX Llevar 2 B320 y B321 de memoria, una copia cl valor de AX xexOll4 INT 20 Instruccién de final 0130 200x10130 MOV.AX, FFFF Llevar a AX una copia de la constante PFFF voxx 0133 MOV [B320], AX Llevar a 8320 y B321 de memoria, una copia del valor de AX vooex'0136 INT 20 Instruceién de final Figura 36 “A. // Batonces la secuencia que empieza en 0100s la del ejecicio anterior cone agregado de JO. La instruccién de sulla i el esultado anterior generd overfow que én assembler se eeribe JO hbwh,ordens salar a le ns~ truce de diveceign hl slo si Velseuco contato(Uo0), ordena continuar con la instruccin que sige a JO. En definitiva, si luego de una suma es V=0 se eecula la secuencia del ejercicio anterior, y si V=1 se pasa a cjecutar la secuencia que empieza en 130 y termina en 136. Esto puede verse en el diagrama de la figura 3.7 La instruccién JO 0130 ordena saltar (si V=1) a una instrucci6n que no forma parte de la secuescia. Por tal motivo, mediante A 0130 hubo que escribir la otra secuencia, que empieza con MOY AX, FEFF. Esta tltima ordena pasar a AX una copia de la constante FFF, la cual serd luego escrita en memoris mediante Ia ejecucién de MOV (BS? ,, AX. La direccién 130 fue “!agida arbitrariamente. Ux-T OX — [8310/11] [px = 18000708) Joona AX AX - aX ——— IF cea eee ee eae ea Che OK i cxso003 [Bee BREESE] ax. frre a ‘2=0 (CX; a {Ox Bao 8h as |[B320/21)}=FFFF (taster 9 psoetnre @) ae ‘No existe una instruccion como MOV [8320], FEFF que ordene pasar directamente una constante a memoria (Osea que para ello se debe pasar primero a un registro (en este caso AX), y luego de éste a memoria 1es que ordenan pasar una constante a un registro estin en modo de. direccionamiento Obsérvese la diferencia entre MOV AX, FFFF en modo inmediato, y MOV_AX, [FFFF] enimodo directo. La primera ordena cargat en AX el rimero FFE, mientras que a segunda ofdefa cargar engAX el nuimero Gi std en la direcein de memoria FFFE v= * : “Ta denominacion “inmediato"puede explicarse a_partir del cédigo de maquina de una instruccién en este ‘clo de direccioramiento, Mediante el comando U del Debug hallaremos el cédigo de MOV AX, FFFF (ego die haber escrito la secuencia en assembler) uo1a9 xxxx0130-BSEEFF = MOV AX, FFFF x000133 A323 MOV (B320], AX wexc0136 CD20. INT 20 Se observa que en memoria, luego del cédigo de operacién BS inmediatamente le sigue la constante FFFF, le donde proviene el nombre “inmediato”de este modo. En el mismo el dato (constante) en lugar de estar en una zona de datos ge encuentra formando parte de Ia instrucci6n. Es el Gnico caso que un dato se halla en la zona de instrucciones. ‘Use de la instraccién JMP (jump) El programa de la figura 3.6 puede escribirse con menos insirucciones, como en la figura 38 dado que les secuencias que empiezan en 100 y en 130 terminan con las mismas dos instrucciones. En el diagrama légico de la figura 37 se indica una linea en punteado que luego de la orden de pasar FFFF a AX sigue con la orden de pasar de AX a [B320]. De esta manera, luego de ejecutar la primer instruccién que esta en 0130 se saltaria sin Condicién alguna a ejecular las dos iltimas instruceiones de la secuencia que empieza en 0100, que son también las dos sltimas de la secuencia iniciada en 0130. La instruccién JMP 0111 de salto Gump) cumpliré teste cometido, No es necesarioindicer con un recténgulo la existencia de la instruccién JMP. Mf» En general una instruccién JMP hh ordena saltar inconclicionalmente ("si si") a la instruccidn que esta ef la dizeceién hhh, sin posibilidad de seguir con la instruccién que sigue a JMP en memoria. Es equivalente a up "GO.TO" en un lenguaje de alto nivel, Conforme al uso de [MP, las secuencias dela figura 3.6 quedarian como indica la figura 3.8 038 A100 ro00%0100 _ MOV CX, [B310} MOV CX, [8310] yooo0108 “MOV BX, [8300] MOV BX, [B300} yoooc0108 SUB AX, AX SUB AX, AX wooxx010A ADD AX, BX OTRA ADD AX, BX xxxx010C JO 0130 JO ALFA xxxx:010E DEC CX DEC CX xxxx:010F — JNZO10A JNZ OTRA oooc0I1 MOV [B320), AX BETA MOV /[B320], AX woxc0lM4 INT 20 INT 20 Kéi30 seooe'0130 MOV AX, FFEP ALFA. MOV AX, FFFF y000:0133 JMP 0111. JMP BETA Figura 38 Figura 39 pura 3.9 repite la secuencia de la figura 3.8 pero sin las direcciones. En lugar de éstas aparecen las "Talia", que son admilidas por Stros traductores, pero que no son big. Esté claro que dichas etiquetas se usan para indicar direcciones simbélicas a las que apuntan las instrucciones de salto, En la presente etapa usaremos etiquetas para escribir secuencias en assembler con papel. y ‘no para el Debug. De esta forma nos, independizamos del Debug y de las direcciones. : EJERCICIO 5: c6mo.cambiarfa el ejercicio 3 si se usara JZ en ver de JNZ. Ellector pu xn lugar de poner la condicién que Z=0 se hubiese puesto que Z=1 X= SOM or as nen Mae fg 210 ¢ pasaria a ejecutar la secuencia que BX +— [8300/01] | 55 g99g empieza con el envio del valor de AX a la direc- sign B320, a la que sigue el fin de la secuencia "ero mientras tanto, cada vez que se le resta uno a Ax=0000 EX no se salta, sino que se continia (por el no, oe ado que es Z=0)) con la instruccién siguiente (en BX AK BX p00 pumteado en Ia figura 310) a. In del salto Peer aa condicional, que debe ser un JMP. Esta instruccién KX Xt frdena saltarincondicionalmente a la instruccién ex=0003, gue indica sumar AX con BX. Asi se vuelve 4 frmar un ciclo como en Is figura 35) Esto es, puesto que el rombo que representa una instruccién de salto condicional solamente permite saltar por uno solo de sus vértces laterales, iendo que su vértice inferior esté ligado a la continuacién de una secuencia, ésta se continéa con una Lo instruceién que ordena saltar incondicionalmente, ‘ch osi, a otra instuceicn. (B320/21] — AX Obsérvese (figura 3.10) que el salto condicional no [B320/21]=0012 se realiza sobre la misma secuencia, como en la figura 35, sino que ee salia a otra secuencia, compiesta por dos instrucciones. Bs por ello que fn la figura 311 esta secuencia se escribe aparte Figura 3.10 Con el Debug fue necesario indicar A 120, habiéndose elegido la direccién 130 en forma arbitraria: Si bien, como se dijo mis aria, noes necesario representar mediante un rectingulo esta instruc, esta vez lo haremos por razonesdidécticas, para mostar que cuando no se cumple la condcin en una instr de salto incondieional, la secuencia continda con otainstuccién, que en ese caso particular es de salteincandicional u39 MOV CX, [8310] Lievar a CX una copia de N que esté en B310 y 8311 MOV BX, [B300] Tlevar a BX una copia de M que estd en B300 y B30L SUB AX, AX Poner aciimiulador AX en cero, restandolo de sf mismo ADD AX, BX Samar a AX el valor de M que esté en BX es Restar uno a CX (con lo cual pueden cambiar los flags SZC) JZ.130 Si luego de la instruccién anterior Z=1 (CX zero) saltar a 0130 JMP 104 Saltar incondi MOV [B3201, AX Llevar a B320 y B321 de memoria, una copia del valor.de AX INT 20 Instrucei6n de final Figura 3.11 EJERCICIO 6: Se supone (figura 3.14) que a partir de la direccién 1000 de memoria, y en posiciones consecutivas, se tiene una lista de ntimeros enteros de dos bytes cada uno: N,,N,,N, ...N, La cantidad n de riimeros de la lista (longitud) se da en la direccién 1500. Todos los niimeros de la lista deben ser sumados, y el resultado total de la suma debe ser asignado a una variable R que est en las irecciores 2000 y 2001. La posibilidad de overflow se considera en otro ejercicio posterior. iejo de un listado de datos consecuti en memoria (lista 0 vector) De tener que codificarse la secuencia solicitada con los modos de direccionamiento definides hasta el presente, y no considerando el overflow, habria que escribir (figura 3.12) tantas 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, [1000] SUB _AX,AX __Llevar AXa cero ADD AX, [1002] ADD AX, [St] ~ Sumara AX el contenido de las direésiones 1000 y 1001.(AX=N,) ADD AX, [1004] ADDSI,2 En modo inmediato sumat? al contenido de SI, ADD AX, [1006] ADD AX Ton Samar a AX el contenido de las direceiones 1002 y 1003 (AX=N,) 7 ADD SL2__ En modo inmediato sumar 2 al contenido de SI (S1=1004) ADD. MOV [2000}, AX ADD‘ Al En modo inmediato sumar 2 al contenido de SI $1=1005) ADD AX, [SI] Sumara AX el contenido de las direcciones 1006 y 1007 (AX=N,) _ Figura 3.12, ete... hasta que SI contenga Ja Figura 313 Nea FSA] "]Nt Enel corcete de cada instuecién ADD AX, [hihi] hay un nimero de valor fo. (hhh), que es la direccién de una celda de memoria, Dicho numero aumenta en \ ee BB nc Sb ieee ke amen \. 3 [00 presenta el valor del registro SI como direccién de una celda de memoria, dado 1004 | 45. | IN que lo que esté entre corchetes es siempre, una_direccidn,, Se comprende,que el 5| 96 valor de esta direccién seria el valor que tenga el registro SI... 1006 [AZ| "| yg Pare.aveso problema habss que carga St con el valor ina 1000 y luego 7 (et il para que SI vaya tomando sucesivamente los valores 4008 ("00 j Ns 1002, 1004, 1006, etc, de modo que ADD AX, [SI] cumpla la mismz 9 Ba de toda uc DD AX, fhhhh] de la secuencia de la figur idea “en brute”. p ia lineal de instrucciones, sin laz0 de repeticién, seria la de la figura 3.13, Mediante un azo (figuras 3.15 y 3.16) se evita repetir las instrucciones ADD AX, [SI] y ADD SI, 2. recein del ultimo dato N, de la lista Ay LnIStREsln ADDD-AX [ell erdena cenge-6n AX el conan de dos celag 1500 [051] vf Sisccutvas de remota, send que ie dceeton des poner decks att i dada pore registro 9, Una istructiGn de este tipo corespende al mode de Figura 3.14 feccionamiento indirecto por registro. Fsto.es, la direccién de una celda de _ * memoria se da indirectamente a través de un registro, como SI, DI, 0 BX. indirecto por registro pen el problema de recorrer uno tras otro datos Las instrucciones en. sions de memoria, contenidos u3.10 A100 yoxix0100 MOV CL, 11500] Carga en CL (mitad inferior de CX) la langitd dela lista que esté en 1500 yoxx0104 MOV S1,1000——STapunta al comienzo de a lista de datos veoo:0107 SUB AX, AX Pone AX en cero ox109 ADD AX [SI] Summa a AX un neimero de la lista apuntada por St voox10B ADD SI,2 Suma 2a St rocou010E DEC CL Decrementa CL sooe110 JNZ 109 Mientras Zsea 0, volver a 109 rovoc112 MOV 2000], AX Carga en 2000 y 2001 el resultado delasuma Gove LEON o105. rooeDI1S. INT 20 Fin si -— 1000 Sas Figura 315 (St 1000 BS aE CObsérvese en el diagrama o en la secuencia, Ean aque al registro puntero SI (0 cualquiera. que ‘save, *X=0000 sea) primero es necesario darle un valor ini AX — AX SI conforme ala direccién donde comienza lal [AX AX + TA daxaoan {a (mediante In instruccién en mdo inmediato MOV Sl, 1000), Luego en el azo es necesario Sl — Sl+2 a incrementar segtin corresponda (en este cas0 eecegees eeeesenrer ee mediante ADD SI, 2) el valor de SI a fin de Cia baer wud la lista. Es importante notar que cL=04 esto no se hace automsticamente, sino que debe estar a cargo del programador. En el gjercicio 13 se amplia esta secuencia considerando la posibilidad de overflow. [2000 /01] — AX {2000 /O1}-N1+N2*.. Figura 3.16 EJERCICIO. 7; uso de las instrucciones de comparacién y JZ ump if Z=1);y escritura en una lista A partir de la direccién 2000 se tiene una lista de caracteres codificados en ASCII (figura 3.17), siendo que su longitu esté en la dizeccién 1500. Encontrar el nvimeto de veces que en la lista se encuentra la letra E (c6digo 45), y dicho ntimero guardarlo en la direccién 1600. Asimismo, cada vez que se encuentra una E, indicar en una segunda lista que empieza en 6000, la direccién donde se encontraba dicha F (figura 3.18). 1500 [06] “Como indica el diagrama I6gico (Figura 3.19), primero se ‘nicializan los registros. El registro CL con Ta longitud dela lista; el registro SI con la direccién inicial de la lista +2000 [B4|() DI--—+ 6000 [G2] de caracteres ASCIL; el registro DI con Ia direccion Nov 2001 Fata) 1 [20] inicial de la segunda lista, que guarda las direcciones “= 2002 [45 |(E) “S. g002 [04] donde se encontro una A; y el registro BL (mitad 2003 [30 |(0) 3 [20] inferior de BX) se pone a cero, pues va a ser usado como 2004 [45 |(E) GOntador de las veces que se encontré una A. Tiuego, cada elemento de la lista es llevado en modo indirecto por registro hacia AL (mitad inferior de AX, pues AX tiene 16 bits y cada datoes des bits) ‘R continuacion se compara el elemento cargado en AX Figura 3.17 Figura3.18 con el valor 45 (valor en hexa det e6digo ASCII de ta letra). Para tal fin se resta en la instruccién de comparaci6n AX ~45,a fin de que la UAL genere valores de os flags SZVC. 2005 | 47 |(G) Por si el valor del flag Z es 1, se pregunta en la instruccién de salto siguiente JZ. Si es es, que el elemento cargado en AX es la letra E. Entonces se salta a la instruceién que incrementa a BL USI implica que AX= 45, (Contador), y se escribe en la lista que comienza en 6000 la direccién donde se encontrs tina E, mediante la {nstruccién MOV [DI] SI Luego se debe aumentar en dos al puntero DI (pues cada direceién octipa 2 bytes) ¥ saltar (mediante JMP) « la secuercia 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 en la frase anterior. [eu = 116001 see ‘si —— 2000) valor de Z es 0 implica que en AX no esté a letra E, por lo que deberan realizarse las acciones indicadas a Lisi == 2000 | 5.2000 DI — 6000 |p. c000 Figura 3.20 Del diagrama Logico de la figura 3.19 resultan las secuencias escritas a continuacién.. A100 xxx 0100 MOV CL, [1500] xxxxi0104 MOV SI, 2000 soox0107 MOV DI, 6000" sox 010A SUB BL, BL sooxc010C” MOV AL, [ST] sooxcO10E_ CMP AL, 41 xoouc0l10_ JZ 130 xxx 0112 INC Si soo 0113” DEC CL “xooc01I5_ JNZ 0c xox 0117 MOV [1600], BL xxx OLB INT 20 A130 x0000130 INC BL xxx<0132 MOV [DIST xox014 ADD DI,2 xxxx 0137 JMP 112 Carga en CL (mitad inferior de CX) la longitud de la lista que esté en 1500, SI apunta al comienzo de la lista de datos DI apunta al comienzo de la otra lista Pone AL en cero aa Leva a AL un cafacter de la lista apuntada por SI ‘Compara el valor de AL con 41 Sison iguiles (Z=1) saltar a 130 Mientras Z sea 0, volver a 10C Carga en 1600 el valor del contador Fin Inefementa BL Escribe el valor de SI en la lista apuntada por DI Suma 2al puntero DI Seltar ala instruccién que esté en 112 uB12 Obsérvese que una instruccién como MOY Al [SI] ordena leer un elemento de una lista y cargarlo.en AL. En cambio MOV [Di] I ordena escribir in elemento de una lista cayo valor esté por Sl Las dos secuencias anteriores pueden escribirse en tna sola, evitantando la instruccion JMP, cambiando JZ por INZ, conforme a las figura 320 y a la secuencia siguiente: Carga en CL (mitad inferior de CX) Ia longitud de la lista que estd en 1500 SLapunta al comienzo dela lists de datos yeoc0107 MOV DI, 6000 apunta al comienzo de la otra lista yoooe10A SUB BL, BL Pone Alen cero yexeQ]0C MOV AL, [SI] Lieva a AL un caracter dela lista apuntada por Sl sooe10E CMP AL, 41 Conipata el valor de AL con 41 yooxox0110 JNZ 119 Si no son iguales (Z=0) saltar a 119 Seooe0112 INC BL Trierementa BL yoxc0lld MOV [DI], St Escribe el valor de SI en la lista apuntada por DI xexc116 ADD DI,2 Suma 2al puntero DI ~yeox0119 INC ST Inerementa SL yooQI1A_ DEC CL Deerementa CL. seoxed1IC NZ 10C Mientras Z sea 0, volver a 10C xox O11 MOV [1600], BL Carga en 1600 el valor del contador yoonc0122 INT 20 Fin ara Ia instruceién JNZ 119, nos encontramos con un problema nuevo: se debe saltar hacia Ja instrucci6n INC SI, pero. en el momento de escribie NZ no conocémos la directidsi 119. Para soltcionar esto primero eseribimos JNZ, 100 (elegimos 100 por ser una direcci6n proxima; podria haber sido cualquier otra cercana), y cuando terminamos de escribir toda la secuencia, entonces conoceremos que 119 es la direccién de INC Sl Luego corregimos como sigue la instruccién JNZ 100 (siencio conocida su direcci6n 110): Ano ace: 0110 JNZ 119 Este procedimiento debe hacerse siempre que haya que saltar “hacia adelante” uso de la instruccién JA Jump if above = saltar si esté por arriba) para nimeros naturales, y jel modo indirecto por registro con désplazamiento [[peRcicio Se tiene una lista de ntimeros naturales de un byte cada uno, que empieza en la direccién 2000, estd en la direccién 1500. Encontrar el mayor de los ntimeros de Ja lista y "A 100 MOV CL, [1500] Carga en CL Ja longitud de Ia lista que estd en 1500 MOV SI, 2000 Sl apunta al comienzo de la lista de datos, MOV AL, (S11 Lieva el primer niimero de la lista @ AL, suponiendo que es el mayor INC SI" Inerementa el puntera SI para tomar el segundo elemento de la lista WA DEC CL. gmenta CL, pus jase tom el primer nimero de a lista CMP AL, {ST mpara el nro supuesto mayor ér JAI Saliar a 112 si el nro que estd en AL-esid por arriba del apuntado por St 500110 MOV AL, [SII Carga en AL el nuevo ntimero mayor apuntado por SI 12 INC St Tncrementa SI preparéndose para apuniar al préximo elernento yoooi13 DEC CL Decrementa CL ooxc0115 JNZ_10C” “~~ Mientras Z séa 0, volver a 10C jooxi0117 MOV [5000], AL Carga en 3000 et nximero inayor soooc0l1A INT 20 ~ Bin” JA.112 que sigue a CMP AL, (SI), ordena saltar a la instruceiOn que esté en 112sial hacer Ia resta SI! en la comparacion anterior, resulta C-0, o sea si el ntimero natural que esté en AL. esté por arriba (es ‘major) del niimero natural apuntado por SI; caso contrario continuar con la instruccién que sigue a JA 112. $i ue esté en AL e5 igual al apuritado en la lists por SI, como no se cumple Ia condicisn, la Secuencia _Sigue por INC Sl. De haberse realizado un diagraitia légico, &X el rombo correspondiente a la condicién de salto Rabria que escribir C-0. En la Unidad (pag 88) se trata‘en detalle el uso del flag C. u3.13 Se puede escribir la secuencta anterior de la manera siguiente, donde las instrucsiones INC Sly CMP AL, [SI]. se han reemplazado por la instruccion CMP AL, [SI 1], Esto es, én tna misma insinuccion sé inerementa SL y ‘se compara AL contra el niimero apuntado por Si + J."También Se puiede escribir CMP AL, [SI] + 1. Esta forma de direccionar el operand se conace como “Based Addressing Mode” A100 ox%e0100_ MOY. CL, [1500] Carga en CL la longitud de la lista que esté en 1500 sooxc0104 MOV SI, 2000 SI apunta al comienzo de la lista de datos s00c0107 MOV AL, [SI] ‘Leva el primer mimero de la lista a AL, suponiendo que es el mayor yoox0109_ DEC CL. Decrementa CL, pues ya se tom6 el primer niimero de Ia lista 2oxxc0108 CMP AL,{SI+1] Compara el nro supuesto mayor en AL.con otro nro apuntado por SI + 1 >voxeD1OE JA 2 Saltar a 113 si el nro que esta en AL esti por arriba del apuntado por SI ‘AL,[S1+1] Carga en AL el nuevo mimero mayor apuntado por SI +1 Incrementa SI preparéndose para apurtat sl préxime elemento eon0lld DEC CL Dacrementa CL soooc0116 JNZ 10B ‘Mientras Z sea 0, volver a 10B oxi MOVE Carga en 3000 el riimero mayor soo INT 20 Ha EJERCICIO 9: uso de la instruccién JG Jump if Greater ~ Saltar si es mayor) para niimeros enteros Se tiene una lista de ntimeros enteros de dos bytes cada uno, que empieza en la direccién 2000, siendo que su longitud esta en la direccién 1500. Encontiar el mayor de los nimeros de la lista, y guardarlo en la direccién 3000. © < Este ejercicio es similar al anterior, con la diferencia que se trata de nimetos enteros que ocupan dos bytes. Por un lado el puntero SI habré que incrementarlo en dos, y usar AX en vez de AL. Por ofro, usar la instrac_ in de salto condicionado JG para niimeros enleros en lugar de JA, propia de numeros naturales. A100 x004x:0100_MOV_CI,{1500] Carga en CL la longitud de la lista que esta en 1500 yo0x0104” MOV’ SI, 2009 SI apunta al comienzo de la lista de datos yo0%0107 MOV AX, [SH Lleva el primer miméro de la lista a AL, suponiendo que es el mayor yoooe0109_ DEC CL Decrementa CL, pues ya se tom6 él primer niimero de la lista ooo 010B “CMP AX,[SI+2] Compara el nro supuesto mayor en AL cori otro nro apuntado por SI + 2 roonx0108 JG 113 Saltar a 113 si el nro que esté en AL. es mayor que el apuntado por ST seve110 MOV AX,[SI+2] Carga en Abel nuevo numero mayor apuntado por SI +2 xoou0l13ADD SI, Incrementa SI preparéndose para apuntar al préximo clemento ypsac0116 DEC CL Décrementa CL soooc0118 JNZ 108 Mientras Z sea 0, volver a 108 sooxcO11A MOV [3000], AX Carga en 3000 y 3001 el fisncro mayor xoec01TD INT 20 Fin La instruccién JG 113 que sigue a CMP AX, (SI+2], ordena salter 2 a instruccién que estd en 113 si al hacer Ia esta AX [SI2] en la comparacion anterior, resulta S=V (S=0 y V=06 est0 5, res ‘0 sea si el miimero entero que esti en AX es mayor ("greather”) que el riimero entei 0 contrario se debe continuar con la insiruccién que sigue a JL113. Vale decir, en tin diagrama légico, nbo correspondiente a JG habrria que eseribir S=V y Z=0 en funcién de los flags (Unidad 4, pig. 88) 12 S12; enel Es importante saber usar para cada clase de niimeros (enteros 0 naturales) Ia instrncci6n de salto que correspond: ‘quando Se ofdena saliaé si un primer niimero es mayor que otro segundo, se debe usar JA para naturales, y JG para enteros. Se supone que la instruccién anterior a la de salto es una comparacién (resta del primero nienos el segundo). EJERCICIO 10: uso de las instrucciones JB (jump if below) para naturales, y JL (jump if less) para enteros Ia insteyecign JA 113 por JB 113, y en el eercicio 9 reemplazar JG 113 por JL: ucei6n JB. 13 que seguiia a CMP Al. (SI, ordena salar a Ia instrucelén que estéen 113 si al hacer la resta AL ~ [SIj en la compatacién anterior, resulte C=1, 0 sea siel niimero natural que esté en Al, esté por ddebajo (es meno) del nimero natural apuntado por SI; caso contrario confinuar con ia instruccién que sigue a JB113, u3.14 La instruceién JL. 113 que seguiria a CMP AX, [S112], ordena saltar ala instruccign que esté en 113 si al hacer la esta AX [SI+2] en la comparacion anterior, resulta SAV (Se y V=0 6 S=0 y Val, esioces, resultado negative) y 0,0 sea si el nimero entero que esta en AX es menor ("less") que el nimero entero apuntado por Slv2; caso contrario se debe continuar con én que sigue a JG 113. De lo anterior, resulta que en un diagrama logico habria que escribic la condicién $V y_Z=0 en el rombo que corresponde a JL EJERCICIO 14; uso de JBE Gump if below or equal) Se_tiene tuna lista de combinaciories binarias de un byte que corresponde cada una a digitos hexadecimales aislados (0, 1, 2, . . F), la cual empieza en la direccién 2001, siendo que su longitud esta en la direccién 2000. Convertir cada digito hexadecimal a su correspondiente carécter ASCII segiin se ejemplifica a continuacién. Los caracteres ASCII obtenidos guardazlos en otra lista que comienza en 3001 Binario_ Hexa ASCH 2001, [700000000 ] (00) +3001 [700170000 ] (30) 2002 [00000100 | (04) 3002 [00110100 | (34) 2003 | 00007001 | (09) 3003 [700111001 _| (39) 2004 | 00001010 | (0) 3004 | O1000001_} (41) 2005 “00001101 | (0D) 3006 [oT000100 "| (44) 2006 (“00007 1] (OF) 3006 [[o1000110"} (46) Sidato <9 es en ASCII igual a dicho dato + 30 Si dato > 9 es en ASCII igual a dicho dato +7 +30 Por ejemplo: Dato = 00001010 = A +7 +30 ‘Len ASCIL ‘A100 xo0c0100 MOV CL, 12000] Carga en CL la longitud de la lista xeoc0104 MOV SI, 2001 Sl apunta al comienzo de la lista de datos xxcex0107- MOV DI, 3001 DI apunta al comienzo de la lista de resultados xogecD10A. MOV AL, [SU] Carga en AL un dato de la lista apuntada por ST cO10C CMP AL;9 ~ _-Gompara el dato en AL contra 9 O10E JBE 12 Sires menor o igual que 9 salta a i12 ecO110. ADD AL,7 Suma 7a AL xoxx0112/ADD_AL, 30 ‘MOV [DI], AL_ Guarda un resultado en la lista apuntada por DI c Incrementa DI yoouc011? "INC SI Incrementa St xoxd118 ‘DEC CL Decrementa CL xoox:011A JNZ 10A ‘Mientras Z sea 0, volver a 104. sooxc0l1C INT 20 Fin * La instruccién JBE 112 que sigue a CMP AL, 9, ordena sallar a la instruceién que esté en 112 si al hacer la resta AL~= 9 en la comparacién anterior, resulta C=1 6 Z=1, 0 sea si el ntimero natural que esta en AL esti por debajo (es menor) o es igual al némero 9; caso contrario continuar con la instrueeién que sigue « JBE 112. Osea que én tin digerania logico, en el rombo correspondiente a JBE habria que escribir C=1 6 Z=1. BJERCICIO 12: Este ejercicio és contrario al anterior. Esto es, s¢ tiene una lista de caracteres ASCII que empieza en 2001, y cuya longitud esté en 2000. Se la quiere convertir en otra lista que empiece en 3001 con Jos niimieros hexadeciniales (én binario) cOrrespondientes a dichos caracteres en ASCII. 3-15 ‘A100 yooxe:0100 MOV CL, 2000] Carga en CL fongitud de la lista x60x0104 MOV $1,20001_ SL apunta al comienzo de la lista de datos jooo:0107" MOV DI, 3001 Di apunta al comienzo de la lista de resultados pooac010A MOV AL, [STI Carga en AL un dato de la lista apuntada por St xiooc010C SUB AL, 30 Resta 30a AL, sooxc010E CMP AL, 9 Compara el contenido de AL con 9 yooxc0110 JBE 114 Si es menor o igual salta a 114 (Si AL <9 es un simbolo del 0 al 9) UB AL,7 Resta 7a AL (Si AL> 9 es un simbolo de A a F, que se halla restando cad 37, sierido que antes ya se restaron 30) sooocdIld_ MOV (DN), AL Guarda el resultado en le ISE'apuntada por Dl SSGKOIIE INC DI” Inerementa DI seoxe0117 INC SI Inerementa SI Sooxe118. DEC CE Decrementa CL weexc011A JNZ 1A Mientras Z sea 0, Volver a 108 yoooc011C INT 20 Bin EJERCICIO 13: uso de la instruccién JPE (Jump if parity is even = Saltar i la paridad es par) Se tiene una lista de caracteres ASCII a parti direccién 3000, Sila paridad de unos de cad: presenta paridad imy {reccién 2001, siendo que su longitud esté en la os caracteres es par, escribir 00 en la direccién de unos, escribir FF, en la direccién 3000 A100 yooec0100 MOV CL, [2000] Carga en CL la longitud de ia lista yooo0103. MOV S1,2001* Registro ST apunta al comienzo dela lista de datos v000c0107_ MOV DL, 00. Carga 00 en DI. suponiendo que todo esté bien sooo:0109” SUB AL, AL Hace cero el registro AL s yeoxc010B ADD AL, [SH] Suma contra A. para que pueda cambiar el indicador de pardad P. 200x010 JPE 111 Si paridad_n ALes par, saltara 111 soox010F MOV DL, FF Ingicacin de un elemento con paridad errada xox011T INC SI ‘Trerementa SL yeox0l2 DEC CL Decrementa CL sooac0lI4 JNZ 109 Mienitas Z=0, volver a 109 >oxxc0116 MOV [3000], DL. Guarda indicacién de paridad sooacOLLA INT 20 Fin La instruccién_JPE 111 que sigue a ADD AL, (Si), ordena sallar a la instaccion au suma AL. + [Sf] en la suma anterior, resulta PE (paridad even, o sea paridad pat); caso contrario (paridad Jimpar) continuar con la instruccin que sigue a JPE 111. La instruccién ADD AL, [SI] debe insertarse a los fines de sumar AI. =0 més el ntimero apuntado por SI, para aque de acuerdo con este nero pueda detectarse la paridad del mismo. Sistematizacién: INSTRUCCIONES DE SALTO CONDICIONAL ° 0x010F DEC CL Decrementa CL yxx0111 JNZ 104, Mientras Z=0, volver a 10A yooo0113 INT 20 Fin A120 x008x0120 MOV BL, [2000] Carga en BL Ja Jongitud de la lista xoox0124 DEC BL Decrementa la Jongitud de la lista 200x0126 MOV [2000],BL Guarda la nueva longitud de la lista yo0x0129 DEC CX Decrementar CX wwooeO12A JZ 136 Sies el ultimo elements de la lista saltar a 136 wxx012C MOV BL,[SI+1] Sinoeseltiltimo, cargar en BL el elemento siguiente yooxx02F MOV (SI), BL Guarda en el lugar de un elemento, el que le sigue sooxc0131 INC SI Incrementa SI wox0132, DEC CL Decrementa CL wooxc0134 JNZ 12C Mientras Z=0, volver a 12C ye0x0136 INT 20 Fin BJERCICIO 32: : Se tiene una lista de ntimeros naturales de un byte, ordenados en forma creciente, a partir de la scciGn 2001, siendo que en la direccién 2000 esta la longitud de dicha lista. En la direceién 1500 se tiene un rximero natural de un byte, Intercalarlo segtin su valor en Ja lista citada, reubicando ‘una posicién més abajo cada uno de los ntimeros de la lista que le siguen (salvo que sea el tiltimo). Asimismo, inctementar en uno la longitud de la lista, que esta en la direccién 2000. Si el nimero a intercalar ya se encuentra en la lista, ésta no debe modificarse m0 MOV CL, [2000] Carga en CL la longitud dela lista xoox:0103 MOV SI, 2001 Registro SI apunta al comienzo de la lista de datos x00000107 MOV AL, [1500] Carga el mimero a intercalar en AL yogec010A CMP [SI], AL ‘Compara el niimero apuntado por Sicon AL rogx010C_JA 120, ‘Siel nsimero de la lista es mayor hay que intercalar, saltar a 120 xxxxO10E JZ 118 Sison iguales (esté en la lista) saltar a 125 soox0110 INC SI Incrementa SI yoox:01lL DEC CL Decrementa CL yaxc0113._JNZ 10A Mientras Z=0, volver a 104 yeox0115. INT 20 Fin A120 yoove0120 INC CL Incrementa CL, pues hay un elemento més x00x0122, MOV. AH, [ST] Salva el ndmero que apuntaba Sten AH xox0124. MOV [SI] AL Guarda el niimezo a intercalar (u otro) donde apunta SI y0000126 MOV AL, AHL Lleva a ALel proximo niimero a “bajar” woox0128. INC ST Increment St soonc0129 DEC CL Decrementa CL = JNZ 122 Mientras 2-0, volver a 122 ocx012D MOV AL, [2000] Carga en ALIa longitud della lista yo00130, INC AL Incrementa AL 250000132, MOV [2000], AL Guarda en 2000 Ia longitud de Ia lista inerementada xxxxi0135. INT 20 Fin : U3-27 EJERCICIO 33: Se tiene una lista de caracteres ASCII que empieza en 2000. Determinar el ntimero de caracteres entre ¢] caracter 02 = SX (Start of text), y el carécter 03 = ETX (end of text), € indicarlo en Ja direccién 1500. ‘A100 330600100 MOV SI, 1FFF Registro SI apunta al comienzo de la lista menos uno yoooe103 INC SI Incrementa Si weoc0104° MOV-AL, 02 Carga 02 = STX en AL yovoc006 CMP [SI], AL Compara el mimero apuntado por SIcon AL, oooe0108. JNZ 103 Si el caracter ce la iia 8 distints, saltara 103, seoon010A MOV CX, -1 Pone en -1 al contador seo 010D MOV AL, 03 Carga 03 = ETX en AL wooxcO10F INC CX Inerementa CX xxxx0110 INC ST ‘Deerementa SI yoooe0111 CMP STL, AL. ‘Compara el iimero apuntado por SIcon AL yooon113.JNZ 10F Mientras Z=0, volver a 10F yoooe0118- MOV [1500], CX Guarda en 1500 el resultado xoox0119. INT 20 ~ Fin EJERCICIO 34: En las direcciones 2000 a 2003 se tiene un niimero N de 32 bits, Hallar su raiz cuadrada, y el resultado dejarlo en el registro CX Primera aproximacién YN = Al = (N/200) +2 Segunda aproximacion VN= A2 = [(N/A1) + Al]/2 Tercera aproximacién YN=A3 = [(N/A2) + A2]/2~ Enésima aproximacién YN'= A [(N/An-1) + An-t]/2 EL algoritmo se detendré cuando la diferencia entre dos aproximaciones sucesivas sea cero, 16 = A100 9000100 _MOY $I, 2000 Inicializa SI x90c0103 MOV. AX, [SI] Carga en AX los 16 bits inferiores de N woxc0105 MOV'DX,[SI+2] Carga en DX los 16 bits superiores de N yoo0c0108” MOV'CX, C8 El divisor CX toma el valor CB, = 200, 200x010B_ DIV CX Divide por 200, y el resultado queda en AX soo0e010D ADD AX,2 Suma 2 como pide el algoritmo enc0110 MOV CX, AX Leva Al (cociente) que esté en AX hacia CX (divisor) yox0112 MOV AX, [SI] Vuelve a cargar en AX los 16 bits inferiores de N xxxx0114 MOV_DX,{SI42] Carga en DX Jos 16 bits superiores de N woouc0117 DIV EX Divide por Al sxxx0119, ADD AX, CX. Suma N/A1 que esté en AX con Al que esté en CX wooxi11B SHR AX, Divide por 2 la suma antes hallada, para Halla A2 soxc011D_ CMP AX, CX ‘Compara A? con Al. oocO1LE Si son iguales, terminar wqeol21_ Resta Al A2 900123 Compara (AT ~ A2) contrat Sies igual a1, terminar pent123 Sino esiguel al determina sep -1 = FFF pemc0128 JNZ 10 Sino esiguale “1 ee hace or aproximacién soe012D MOVCX AX Guntda Anvida en X xox O12F INT 20 Fin 3.28 La instruccién SHR AX, 1 permite répidamente dividir por dos un nyimero binario, merced a que desplaza hacia la derecha (“shift right”), una posicién, los bits del registro AX, y agrega un cero a la izquierda. Esto se indica en la figura que sigue, que ejerplifica para 4 bits, c6mo el nuimero 1100 (12) se transforma en el 0110 (6). 1110 LUI. Accién de fa instruccién 0} 1) 1) 0} Resuraco JET EE gael para_un registro de-Albits, SHR desplaza un lugar hacia la derecha el contenido del registro, + “aquierda (Ghift left) cada uno de los 16 bits de AX, ro en la posicién extrema igquierda, y el bit extremo izquierdo pasa a ser el valor del flag C. Astes posible multiplicar por dos en binario, medi instruccién, el contenido de AX. EJERCICIO 35: Multiplicacién de dos mimeros enteros de 8 bits cada uno mediante IMUL Multiplicar el nximero entero que esta en la direccién 2000 por el mimero ~6, = 11111010, ‘A Para multiplicar dos nimeros enteros de 8 bits, mediante la instruccién IMUL, uno de ellos puede estar en cualquier registro de 8 bits, yl otro en AL. El resultdo, que puede ser un imero de hasta 16 bits, se encuentra en el registro AX. A100 so0e%:0100_ MOV CL, [2000] Carga en CL uno de los niimeros enteros de 6 bits xxxxi0104_ MOV AL, FA, Carga en AL el otro niimero entero de 8 bits soox0106 IMUL CL Ordena multiplicar CL por AL, con resultado en AX sovox10A INT 20 Fin, EJERCICIO 36 : Multiplicacién de dos niimeros enteros de 16 bits cada uno mediante IMUL Multiplicar el ntimero entero que esta en la direceién 2000 y 2001 por el niimero ~6, ara multiplicar dos nimeros enteros de 16 bits, mediante la instruccién IMUL, uno de ellos puede estar en cualquier registro de 16 bits y cl olro en AX, El resultdo, que puede ser un niimero de hasta 32 bits, se encuentra en los registros DX (mitad superior), y DX (iitad inferior) ‘A100 0000100 MOV BX, [2000] Carga en BX el nttmero entero de 16 bits que est en 2000 y 2001. soo0104 MOV AXFFFA Carga en AXelotro mimero entero de 16 bits soox0107 “IMUL BX (Ordena multiplicar BX por AX, con resultado en DX y AX sooex0109, INT 20. Bin EJERCICIO 37 : Multiplicacién de un niimero entero de 16 bits por otro de bits, y uso de CBW Multiplicar el ntimero entero que esté en la direceién 2000 y 2001 por el niimero -6, = FA, El ndimeros entero de 16 bits, puede estar en cualquier registro de 16 bits, y el de 8 bits en AL. A este dltimo se le debe propagar el signo (unidad 4), mediante la instrucciéa CBW (Convert byte to word), para que resulte una multiplicacién centre dos niimeros de 16 bits. Ato voxxxi0100 MOV BX, [2000] Carga en BX el ntimero entero de 16 bits que esté en 2000 y 2001 yocxx:0]104_MOV AL, FA Carga en AL el otro mimero entero de 8 bits yoo 0106 CBW Convierte FA que esta en AL, en FFFA que ocupa AX sox 0107 IMUL BX Ordena multiplicar BX por AX, con resultado en DX y AX socxxs0109 INT 20 Fin 3.29 DIRECCIONES EFECTIVAS Y REGISTROS DE SEGMENTO" Hasta el presente, en una direccién que en el Debug aparecia como 2B16:1723 sélo considerébamos didacticamente la porcién derecha 1723, Ello suponia considerar una memoria (figura 3.22) cuyas direcciones iban de 0000 a FFFF = 65.536, 0 sea una memoria de 64 KB. En modo real’, una direccién efectiva es formada con las dos porciones (2B16 y 1723) que la componen, para lo cual la UCP zealiza una suma binaria, que en hexadecimal es: 2B160 (direccién base) + 1723 (desplazamiento) 20883 (direccién efectiva) Se observa que a 2B16 se le agregé un cero a la derecha (equivalente a cuatro ceros en binario). -«. Lo anterior implica (figura 3.28) que la UCP (80286) direcciona una memoria cuyas direcciones van, de 00000 a FFFEF ~ 1.048.576, osea una memoria de 1 MB. Las direcciones que van de 0000 a FEFF stituyen un “segmento” de 64 KB de la memoria de 1.MB, dentro del, cual el valor 1723 representa un “desplazamiento” (D) u “offset” respecto del origen relative 0000. Este origen tiene por direccién efectiva 2B160 (28160 + 0000), siendo que la celda localizada con desplazamiento 1723 tiene como direcci6n efectiva 2C883 = 2B160 +1723 = 2B16:1723 En el espacio de memoria del 80286 cada programa dispone de cuatro segmentos independientes de 64 KB cada uno, direccionados en su origen por un registro denominado registro de segmento: 1. Segmento de cédigo: donde se guardan los cédigos de méquina de las instrucciones. que constituyen el programa, Cada instruccién es localizada dentro del segmento por medio del IP, que proporciona el valor del desplazamiento respecto del origen del segmento. 5.24), El origen de este segmento es direccionado (apuntado) por el “registro de se céidigo” (CS = code segment register) Por lo tanto, una instrucci6n se localiza en el Segmento de cédigo mediante el par de valores CS:IP, que conforman lo que se denomina el Beir st tomes i En la figura 3.24. se ha supuesto CSAP = 302B:B01C, PENS Segmento de datos: que guarda los datos que el progtama debe operar y los re Bk, que resulten de la ejecucidn del mismo. Cada datos es localizado dentro del segmento mediante alguno de estos tres punteros: SI, Di 9 BX, que proporcionan el valor del desplazamjento en relacién con el origen del segmento (figura 3.24). La direcci6n donde comienza este Segmento es_proporcionada, por. el... “registro, de segmento de. datos” (DS = data segment register) Conforme a Jo anterior, u el segmento de datos medianfe alguno de los siguientes pares de valores: DS'SI, DS:DI 0 DS:BX. En la figura 3.24 se ha supuesto DS: 3. Segmento de pila (“stack”): almacena di latos que se ponen en juego durante I ejecucién dé cada informacién, informacién que es ldcalizada denizo del segmento mediante un regisifo denominado SP” (stack pointsr’), Hl inicio del segmento de pils es direccionado porel “registro de segmento de pila” (SS = stack segment register). Por lo tanto el par de valores 55:SP permite localizar en el segmento de pila informacién dentro de la pila (figura 3.24). En la figura 3.24 se ha supuesto SS'SP = A3232:762A 4. Segmento extra: usado mayormente para guardar datos tipo “strings” (cadenas de caracteres), ‘© como prolongacin del segmento de datos. Cada dato es apuntado dentro del segmento por el rogistro puntero DI (figura 3.24). La direcci6n de inicio de este segmento es proporcionada por el “registro de Segriento ext” (ES = extra segment register). As{, el par de valores ES:DI sirve para localizar un dato en él segmento extra. En la figura 3.24 se ha supuesto ES:DI = £230:5420 Los registros de segmento permiten cambiar de lugar programas, con tan solo cambiar el valor_ contenido en los misimos. = E Si observamos el Debug vemos que normalmente los registros CS, DS, 8S y ES estén con el valor de la parte izquierda de la direccién (2516 en un ejemplo anterior). Ello implica que los cuatro seg- mentos citados empiezan en Ja misma direccién (2B160), sea que estan superpuestos (figura 3.25). {Bate punto es necesario para desarellar os temas siguientes * Desde el 80286 hasta el Pentium, los procesadores pueden operar en modo real en medo preside, Este sltimo ese que se uiliza en muliasking (altiprogramacién). 3-30 Esta es la forma en que hemos estado usando dichos segmentos, como un solo segmento de 64 KB, uitil cuando se tiene un programa pequefto, como son los .COM. En este segmento pueden convivir, en reas separadas, un programa, datos, y una pila (figura 3.25) 64 KB FEFFL__ Figua322 3210. (ss=Ag21) AASSA (A921:762A) E2300 U3.31 LLAMADO A SUBRUTINAS Una subrutina es una porcién especifica de un programa, que puede ser incorporada, para ser ejecutada, en cualquier punto de un programa, La accién de requerir Ja ejecucién de una subrutina que se incorpora a un programa, se conoce como “Ilamnado" (“call”) a subrutina, En general, una subrutina es llamada sucesivamente desde distintos puntos del programa principal para proveer una funcién. En lugar de incluir repetidamente dicha porcién de programa en el programa principal, cada vez que se la necesita se la invoca como subrutina, en cada oportunidad que la funcién se necesite. Asi, una misma porcién de programa escrito una sola vez puede ser ‘usada muchas veces, con la consiguiente economia de memoria, y en beneficio de una mejor estructuracién de los programas. tra razén para usar subrutinas es la divisién de programas largos en _médulos més pequefios. 4. Tas causas mas comunes para codificaar un programa en varios subprogramas separados ~que luego serén combinados en un tinico programa ejecutable~ pueden ser: « Facilitar la solucién del problema que se quiere resolver © Agilizar la fase de depuracién de errores \ * Lanoexistencia de suficientes registros de la UCP para un programa extenso + Ladivision de un programa largo entre varios programadores ' + Elapr 5 ente Existen subrutinas que se escriben como programas independientes. Como tales pueden traducirse, probarse y almacenarse para formaar parte de una “biblioteca de subrutinas’. Esta técnica permite compartir subrutinas entre distintos programas. wvechamiento de subrutinas ya existentes | VISION GLOBAL DEL PROCESO DE LLAMADA A UNA SUBRUTINA (figura 3.26) uGP 1, Cuando desde un programa se quiere sp sae Pasar a cjecutar una subrutina (SR), una P | intruccién [, del mismo denominada de s ‘Mlamada @ subrutina” (CALL en assembler de Intel), debe ordenaar saltar a la primera instruccién ([,) de dicha SR. Previamente (paso 0) 1, ordena guardar en /\ /BxE Gontenide BX =] \ \ ( ) J memoria principal la direcci6n de 1,, \ J} instruccién con la que continuaré” la \ A{Contenide BX] ae ejecucién del programa que lamé a la SR, SS A) una vez que ésta se haya ejecutado. 2. Luego se ejecutan 1, y las siguientes instrucciones de la SR. 3, La tiltima de estas instrucciones I, (RET en assembler) ordena saltar a la direccion de I, del programa lamador de la SR, 0 sea ik (CALL 2000} relornar a este programa i a La direccién de I,,, 0 sea la “direccién de Nove retorno” es guardada -paso 0 de la ejecucion Nes de la instrucci6n I, de Ilamada~ en una zona Ben de is memoria principal denominads pil Fim 326 La pila’se usa durante la ejecucién de cada subrutina que haya sido llamada. Ladireccién de_memoria donde se escribe (0 lee) la direccién de retorno es proporcionada por un registro de la UCP denoniinado “puntero de pila” (“stack pointer” = SP). Como se veré, la denominacién “pila” se debe a que al comienzo de la ejecucién de la SR (2a) instrucciones ordenan guardar en la pila contenidos de registros de la UCP, que venia usando el programa llamador. Dichos contenidos se “apilan” -como una pila de platos~ encima de la direccién de retorno citada. Las tiltimas instrucciones de la SR (2b) ordenan “desapilar”, 0 sea ir V4 } U3-32 pasando ordenadamente, de la pila hacia los registros, los contenidos que tenfan en el momento del Mamado a SR. El registro SP es usado paara apilar y desapilar, en forma ordenada, los contenidos de la pila, EI mismo es manejado autométicamente por la UC, la cual por su intermedio controla la pila. IDESCRIPCION MAS DETALLADA DEL PROCESO. Bjercicio 36: Las siguientes sentencias en alto nivel: Unsigned N=R+O R=PxQ T=NxQ serdn fraducidas a instrucciones en assembler, con lamadas a SR para efectuar las multiplicaciones Siempre con fines didicticos seguiremos usando para multiplicar (on sus limitaciones) la secuencia de la figura 3.5, asumiendo para las variables las sigui R— 4000 1 Q 5000/1 P— 5500/1 T 6000/1 N~ 6500/1 i6n de instrucciones ‘de memiGria’ Entonces, una forma de presentar las instrucciones es la siguiente: A500 xo0%0500 30000504 so00e-0507 3000x0509 soo 050C 00x: 0510 sexx: 0513 sooo 0516 2004x0519 soc 051C 2000 90«%:2000 xx06X:2001 3004%:2003 3000%:2005 x98%:2008 x008:2008 x000%:2009 MOV CX, [5000] MOV AX, [4000] ADD AX, CX MOV [6500], AX MOV Dx, [5500] CALL 2000 ‘MOV [4000}, AX MOV Dx, [6800] CALL 2000) MOV [6000], AX PUSH CX SUB AX, AX ADD AX, DX DEC CX JNZ 2003 POP CX RET Figura 3.27 La variable Q pasa a CX' La vatiable Rpasa a AX Realiza en AX: N=R+Q ‘signa a la variable Nel valor de AX Pasa el valor del multiplicando (P) a DX, pues as lo exige la subrutina Llama a la subrutina que esté en 2000 para hacer PxQ ‘Asigna a la variable R el resultado de PxQ que la SR acumulé en AX Pasa el valor del multiplicando (N) a DX, pues asi lo exige la subrutina ‘Vuelve a llamar a la subrutina para hacer NxQ Asigna a la variable T el resultado de PxQ. que la SR acumul6 en AX Guarda en la pila el valor de CX=Q para poder luego recuperarlo Pone AX en cero Suma el valor del multiplicando supuesto en DX y deja Yesultado en AX Resta en cada ciclo uno a CX, hasta que sea CX=0 Mientras Z sea 0, volver a 2008 Pasn el valor Q dela pila a CX, ast en CX se vuelve a recuperar el valor de Q (que en Ia subrutina se hace 0), para usarlo luego Vuelve al programa llsmador. En el programa llamador, antes de cada CALL, se pasa al registro DX el valor del multiplicando (R 6 P segtin sea), yal comienzo del programa se pas6 el valor del multiplicador (Q) a CX. Esta exigencia surge de observar la subrutina, dado que ésta emplea los registros DX y CX para dichos datos. Asimismo, la subrutina deja en AX el resultado, el cual enel 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 parémetros”. Los pardmetros se han pasado a registros. Existe otra forma de pasaje de parémetros por medio de la pila, que luego se ilustraré. * Esto, como se vers, también lo exge fa subrtina paca hacer el producto. = pee 333 IL. Uso de Ia pila (“stack”) y del stack pointer (SP) Como se planteé anteriormente, la pila es una zona de memoria principal, usada para almacenar tamporariamente direcciones y datos relacionados con la ejecucién de subrutinas. El puntero de pila (SP) es un registro de la UCP que proporciona la direccién del iiltimo dato que se ha almacenado, En lo que sigue veremos cémo progresa el SP desde que se llama a una subrutina hasta que se retorna al programa lamador. Es conveniente seguir este proceso usando ei Debug. ‘Observando el Debug (ejemplificado a continuacién), al comenzar la secuencia, cuando no se usa la pila, permanece SP = FFEE, 0 sea que determina la direccién de memoria FFEE (figura 3.28). Si se ejecuta la instruccién CALL 2000 de Ia secuencia anterior, Iuego constatariamos con el Debug que ena pila se guarda la direcci6n de retoro 0513, y que en correspondencia SP=FFEC (ligura 3.29), indicando la nueva cima de la pila, siendo que se ha apilado el valor 0513. El valor de SP cambia, pues, azfomdticamente, mientras se ejecuta CALL 2000: no es necesaario insertar en el programa ninguna instruccién que modifique el valor del SP. La siguiente instruccién que se pasa a ejecutar es la primera de la subrutina, o sea PUSH CX. Esta instruccién ordena guardar en la pila el contenido (supuesto 0002) del registro CX (figura 3.30). En consonancia con el nuevo apilamiento, el valor del SP pasard al valor FFEA, apuntando al dato que estd 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 instruccién POP CX ordena un movimiento contrario a PUSH CX. Esto es, retomar el dato (0002) que esta en la cima de la pila (apuntado por SP) al registro CX (figura 3.31). ‘Ademés POP produce un desapilamiento, siendo que el SP apunta ahora a EFFEC. Siempre que se desapila un dato, el mismo deja de formar parte de la pila, aunque momenténeamente siga en la memoria. Al desapilar s6lo cambia el valor del SP. La instruccién RET, tiltima de la subrutina también afecta a la pila. El desapilamiento que ocasiona hace que el valor de la direccién de retorno se restaure en el IP, de modo que se puede reantidar el programa en la instruccién que sigue a CALL (figuras 3.27 y 3.32). Asimismo, luego de ejecutar RET, el SP pasa al valor FFEE, que fenia antes que se llamase a la subrutina. Con el Debug, mediante el comando E se examina la pila en distintas oportunidades. wl 051s cxf 0008 ez T f / / rreal (| _/ a/tFe8| Noor] FFEC| & + FFEC, 13 gy Feo) #250) 05 se —-rFee| 98-0 FREE! se FFE gua 328 Finn 329 Figua 330 PL 0543 | r realy — } eB] 90] / FFEC| 13, sFrEC (1) _|_/ jfrr0| os] sre0 Nog) se@ peel pL Free ipa 332 De la descripcién anterior resultan las siguientes caracte icas de la pila: 3-34 a pila guarda temporariamente datos en forma ordenada, mientras se ejecuta una subrutina. Los datos tienen tna restriccién de acceso: s6lo pueden agregarse o eliminarse por un extremo de Ia pila, conocido como “cima”. Eliltimo dato colocado en la pila es el primero en quitarse, cuando se comienza a retirar datos. En inglés esto lo expresan las siglas LIFO: “last in, first out”. Se usa la palabra introducir 0 empujar (“push”) para indicar la operacién de colocar un nuevo dato en la cima de la pila;y sacar 0 tirar (“pop”) para seftalar la operacién de retirar el dato de la cima. El puntero de pila (SP) proporciona la direccién del iltimo dato almacenado en la pila, que es el que esté en la cima de ella. Cada vez que 264 bytes son almacenactos (“apilados”) en la pila, el valor del'SP es previamerite decrementado en 2 6 4, respectivamente. Cuando 2 6 4 bytes son desapilados de la cima, a posteriori el SP es incrementados en 2 6 4, respectivamente. El SP controla el orden de la pila, y el SP es controlado por la UC durante la ejecucién de instrucciones que afectan a la pila (como CALL, PUSH, POP y RET) [A los efectos de vistializar mediante el Debug el proceso indicado en las figuras 3.28 2 3.32 se ejecutard Is secuencia de la figura 3.27, desde la direccién 0500 a 0513, Previamente seré necesario suponer valores para lag variables, Asumiremos: R (4000/1) = 0005, Q (6000/1) = 0002,, P (6500/1) = 0004, Estos valores se eseriben en memoria, en las posiciones de las variables, mediante el comando E, como se hizo en la unidad 1 1-000 D1=0000 \6E. ES=106E $S=106E CS=106E 1P=0S00 NV UP EI PL NZ NA PO NC 106E:0500 8BOED0SO MOV CX, [5000} Ds:5000=0002 T ‘AX=0000 BX=0000 CX=0002 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=106E ES=106E SS=105E CS=106E [P=0504 NV UP EI PL NZ NA PO NC 106E:0504 Al0040 MOV AX, [4000] pS:4000=0005 T ‘AX=0005 BX=0000 CX=0002 DX=0000 SP=FFEE, BP=0000 SI=0000 DI=0000 DS=106E ES=106F SS=106E CS=106E 1P=0S07 NV UP EI PL NZNAPONC 108E:0507 01C8. ADD. AX, CX "FEE. BP=0000 S1=0000 Di=0000 }06E CS=106E 1P=0509 NV UP El PL NZ NA PONC MOV [6500], AX Ds:6500=0000 10 SP=FFEE. BP=0000 SI=0000 DI=0000 O6E CS=106E IP=050C NV UP EI PL NZ.NAPO NC. MOV DX, [5500] ‘DS:5500=0004 OESEDIA CALL 2000 'AX=0007 BX=0000 CX=0002 DX=0004 SP=FFEC BP=0000 S1=0000 DI=0000 DS=106E ES=106E $$=106E CS=106E 1P=2000 NV UP EI PL NZ NAPONC 106E:200051 PUSH CX 3.35 -E FFEC (Examina la pila) 1OGE:FFEC 13. 05, (Se verifica que en la pila guardé en FFED el 05, y en FFEC el 13, de 0513, que es la diceccién de etorno) 1 ‘AX=0007 BX=0000 CX=0002 DX=0004 DS=106E ES=106E $$=105E CS=106E 106E:2001 29C0 SUB. AX, AX EEA BP=0000 SI=0000 D1=0000 =2001 NV UP EI PL NZ NA PO NC -EFFEA LOGEFFEA 02 00, 13, 05. (Se verifica que en la pila guards en FFEB cl 00, y en FFEA el 02, de 0002 contenido en CX, manteniéndose 13 en FREC, y 05 en FFED) ~ 7 AX=0000 BX=0000 CX=0002 DX=0004 SP=FFEA BP=0000 SI=0000 DI=0000 DS=106E ES=106E $S=106E CS=106E IP=2003 NV UP EI PL ZR NAPE NC 106E:200301D0 ADD. AX, DX (Se observa que la pile no cambi6, pues SP eontinga apuntando a la cima que estd en FFEA) 7 AX=0004 BX=0000 CX=0002 DX=0004 SP=FFEA BP=0000 $1=0000 D1=0000 DS=106E ES=106E SS=105E CS=106E 1P=2005 NV UP EIPLNZNAPONC. 106E:2005 49 «DEC CX 7 AX=0004 BX=0000 CX=0001 DX=0004 SP=FFEA BP=0000 $1=0000 DI=0000 DS=106E ES=106E $$=105E 2006 NV UP EIPLNZ.NA PO NC 106E:200675FB. NZ 2003 1 AX=0004 BX=0000 CX=0001 DX=0004 SP-FFEA BP=0000 S1=0000 DI=0000 DS=106E ES=106E SS=106E CS=I06E 1P=2003 NV UP EI PLNZNAPO NC 106E:200301D0 ADD AX, DX : 7 AX=0008 BX=0000 CX+0001 DX=0004 SP=FFEA BP=0000 $1=0000 D1=0000 °* DS=106E ES=106E SS=106E CS=I06E 1P=2005 NV UP EL PLNZNA PO NC 106E:200549 DEC CX 7 . ‘AX=0008 BX=0000 CX=0000 DX=0004 SP=FFEA BP=9000 S1-0000 DI=0000 DS=106E FS=106E SS=106E CS=106E 1P=2006 NV UP EI PL ZR NAPE NC 106E:20067SFB.—JNZ 2003 1 ‘AX=0008 BX=0000 CX=0000 DX=0004 SP=FFEA BP=000 S1=0000 DI-0000 > DS=106E FS=106E $S=1065 CS= 108 NV UP EIPLZR NA PENC 106E:200859 POP. «CX 7 ‘AX=0008 BX=0000 CX=0002 DX=0004 SP2EFEC BP=0000 S1=0000 D1-0000 DS=106E ES=106E SS=106E CS=l06E 1P=2009 NV UP EIPLZR NAPE NC 1068:2009 C3. RET. EFFEC HOSE:FFEC 13. 05. (EI SP pasé a PFEC donde guarda 13, siendo que en FFED guarda 05) 7 AX=0008 BX=0000 CX=0002 DX=0004 SP=FFEE BP=0000 $1-0000 D1=0000 DS=106E ES=106E SS=106E: C: )513_ NV UP EIPL ZR NAPENC 106E:0513 A30040 MOV [4000),AX Ds:4000=0005 (Lucgo de ejecutar RET, el SP volvié a su valor inicial FFBE, y a direccién 0513, guardada en la pila, pas6 a IP) 12 DX=0004 SP=FFEK BP=0000 SI=0000 DI-0000 106 CS=106E IP=0516 NV UP EI PLZR NAPE NC 1OGE:0516 88160065 MOV DX,{6500} DS:6500=0007 3-36 EJERCICIO 38: A partir de la direccién 2000 existe una lista de niimeros naturales de 2 bytes, cuya longitud esté en la direccién 1500. Determinar la raiz. cuadrada de cada uno, sumarle 3, y al ntimero resultante guardarlo en otra lista a partir de la direccién 3000. Este problema se basa en el ejercicio 34. a) Resolucién por medio de pasaje de pardmetros a través de registros (en este caso se us6 BX) A100 xo00«:0100 roox:0104 ocx 0107 roxx:010A, pocxx010C. 200x010 vox 0112, rox 0114 sooex-0116 sooe0119 rox 011 sox OTE o0xx:0120 45000 xa0ex:5000 005001 0x 5002, x900:5003 2exxx:5004 00x: 5006 xoxxx:5008 x200:500B soocc010D xooce'5010 roo 5012 00x: 5014, 00x: 5016 roo 5018, r000 SOLA, soo SOIC sox SOLE xxx: 5020 05022, 0xx5025 2000%5027 sox 502A vo00:502C 10%:502E 100:502F 100xx:5030 20005031 000%:5082 MOV CL, [1500] MOV SI, 2000 MOV DI, 30006. MOV BX, [SI ‘CALL 8000 MOV AX, 3. ADD AX, BX MOV [DI], AX ADD SI,2 ADD DI,2 DEC CL. JNZ 0A INT 20 PUSHF PUSH AX PUSH CX PUSH DX SUB DX, DX MOV AX, BX MOV Cx, C8 DIVcX ADD AX, 2 MOV CX, AX ‘SUB DX, DX MOV AX, BX DIV CX ADD AX, CX SHR AX1 CMP AX, CX JZ 502C ‘SUB CX, AX MP CX, 1 Jz 502 CMP CX, 1 JNZ, 5010 MOV BX, AX POP DX POP CX POP AX POPF RET ‘Carga en CL la longitud de la lista Bl registro SI apunta al comienzo de la lista de datos DI apunta-al comienzo de la lista de resultados Carga en BX (para Ia subrutina) un dato de la lista apuntada por SI Llama a subrutina que esta en 5000 para calcular raiz cuadrada Carga en AX el valor 3 Suma 3 al resultado de la rafz.cuadrada dejado por la subrutina en BX Guarda el ntimero resultante en la lista apuntada por DI Incrementa en 2 el puntero Si Incrementa en 2 el puntero DI Decrementa CL Mientras Z=0, volver a 10A, Bin Guarda los flags (Registro de Estado) en la pila’ Guarda AX en la pila Guarda BX en Ia pila Guarda DX en la pila Leva a cero'el registro DX Carga en AX el nimero N de 16 bits (dejado en BX) cuya raiz se quiere hallar El divisor CX toma el valor C8, = 200, Divide por 200, yel resultado queda en AX ‘Suma 2 como pide el algoritmo Lleva Al (cociente) que esté en AX hacia CX (divisor) Lieva a coro el registro DX Vuelve a cargar en AX el ntimero N de 16 bits Divide por Al Suma N/Al que esté en AX con Al que est en CX Divide por 2 Ia suma antes hallada, para hallar A2 Compara A2 con Al Si-son iguales, terminar Resta Al A2 ‘Compara (A1- A2) contra 1 Sies igual 1, terminar Sino es igual 2 1 determina si es ~1 = FFFF Sino es igual a -1 se hace otra aproximacion Guarda An valida en BX Restaura DX desde la pila Restaura CX desde la pila Restaura AX desde la pila Restaura los flags en el Registro de Estado desde la pila Retorna al programa principal 'b) Resohucién por medio de pasaje de parimetros a través de la pila 1 Bn general, esto es necesario hacerlo, dado que cuando se ejecute Ia subrutina cambiaré el valor de les flags, siendo que se require volvera la secueneia principal con los mismos valores que tenfan los flags antes de llamado a la subrutina, Como fe verd, en cualquier ipo de interrupcién se guardan automdticamente los fags, 0 sea el Registro de Fstado, en Ia pila A100 2000/0100 dooce-0104 xo0x:0107 sooo 010A, xox 500C xooxx010D_ soe 0110 xoxox 0112 sooo 0114 x0xx0116 soe 0119 soo soo OLE x00% 0120 5000 roo 5000 2000%:5001 000-5002 oe 5003 sooo 5004 2000x5005 300%:5007 2000x5009 vo0ex:500C >o0xx:S0OF xxx 011 vox S04 2000x5016 2000x5018 000%: 501B x000x501D xxx 501F vooex5021 xxx: 5023 soo 5025 000% 5027 x00502, ooxx502C soo 502F xo0s5031 000x503 00xx5035 xxx: 5036 0005037 3005038 xxxx:5039 MOV CL, [1500) MOV SI, 2000 MOV DI, 3000 MOV AX, (SI) PUSH AX CALL 3000 POP AX ADD AX, 3 MOV IDI, AX ADD SI,2 ADD DI,2 DEC CL. JNZ 10 INT 20 PUSHF PUSH AX PUSH CX PUSH Dx PUSH BP MOV BP, SP SUB DX, DX MOV AX, [BP+C] MOV CX, C8 DIV CX ADD AX,2 MOV CX, AX SUB Dx, DX MOV AX, [BP+C] pivex ADD AX, CX SHR AX, 1 CMP AX, CX JZ 5031 SUB CX, AX CMP CX,1 Jz 5031 CMP CX, -1 JNZ 5016 MOV IBP+Cl, AX POP BP FOP Dx POP CX POP AX POPF RET 3.37 Carga en CL Ia Iongitud de la lista El registro SI apunta al comienzo de la lista de datos DI apunta al comienzo de la lista de resultados (Carga en AX un dato de la lista apuntada por SI Guarda AX en la pila (es el ntimero N cuya raiz se quiere hallary’ Llama a subrutina para calcular rafz cuadrada que esta en 5000 Restaura AX desde la pila (la raiz cuadrada calculada) Suma 3 a la raiz cuadrada calculada Guarda el ntimero resultante en la lista apuntada por DI Incrementa en 2 el puntero SI Inerementa en 2 el puntero DI Decrementa CL Mientras Zno sea 1, volver a 10A Fin Guarda los flags en la pila (designados REH y REL en la figura 3.33) Guarda AX en la pila (designado por sus porciones AH y AL en la figura 3.33) Guarda CX en la pila (en sus porciones CH y CLen la figura 3.33) Guarda DX en la pila (en sus porciones DH y DL en la figura 3.33) Guarda BP en la pila (en sus porciones BPH y BPLen la figura 3.33) Carga en BP el valor de SP, asi también BP apunta ala cima de la pila Lleva a cero el registro DX, pues los niimeros son de 16 bits Carga en AX el niimero cuya raiz se quiere hallar’ El divisor CX toma el valor C8, = 200, Divide por 200, yel resultado queda en AX Suma 2 como pide el algoritmo Leva Al (cociente) que esté en AX hacia CX (divisor) Lleva a cero el registro DX'~ ‘ Carga en AX el nuimero N cuya rafz se quiere hallar Divide por A Suma N/Al que esté en AX con Al que esté en CX Divide por? la suma antes hallada, para hallar A2 Compara A2con Al Si son iguales, terminar Resta Ai-A2 Compara (AI ~ A2) contra 1 Sies igual a1, terminar Si no es igual a1, determina sies ~1 = FFFF Si no es igual a ~1, se hace otra aproximacién, Guarda An valida en la pila, en lugar del dato cuya raiz se queria calcular’ Restaura BP desde la pila Restaura DX desde la pila Restaura CX desde la pila Restaura AX desde la pila Restaura los flags desde la pila Retoma al programa principal ® Indicada como AH y AL en la base de la pila de a Aigura 3.33, » Este nuevo apilamiento de AX, 0 sea de, indicado también como AHy AL, puede servir, por ejemplo, par hacer {IN +N (en ver de YN +3) en cuyo caso la secuencia principal se podria modificar como sigue CALL 5000 MOV DX, AX POP AX ADD AX, DX » Figura 3.3: el numero N cuya raiz se quire halla est en Ia base dela pila, sienda que ahora BP apunta ala cima, entre stay el comienzo de N en este caso existen doce posiciones (C posiciones en hexa). * Serdn fos nuevos valores que toman los denominadas AH y AL ena base de la pila dela figura 3:33, BPL a. BPH er $/ (oct | eecllox fee / BH. }sx f a }ax i REL / SEH }Rettiags) ae / IPL. ip Dreccion / © APEC! ae reterno) / “ALN ax cn VR) 7 aad } a Figura 3.33 Anidamiento de subrutinas Una subrutina puede llamar a otra, ésta a una tercera, y asf sucesivamente. Este proceso se conoce como “aridamiento de subrutinas’. Cuando la ultima subrutina llamada termina de ejecutarse, se retorna a la subrutina que la lamé, ésta a la que la llamé, y asi de seguido. De este modo los retornos se van sucediendo en orden inverso al de las llamadas. El tiltimo retorno seré hacia el programa principal, que efectué el primer llamado. Conforme a lo visto, el mecanismo de operacién de la pila permite cuidar el orden en el anidamiento de subrutinas. DETALLE DE LA EJECUCION DE INT (INTERRUPCION POR SOFTWARE) En la Unidad 1, secci6n 1.11, se introdujeron los conceptos fundamentals acerca de las interrupciones por hardware y software, habiéndose planteado que en esencia son una forma de lamado a subutina. ‘Gomo se estableci6, la ejecucién de la instruccién INT xx:da Sugar una interrupeién por software, en el sentido que desde un programa de usuario no se llama a una porcién del mismo, sino a un subprograma de la ROM BIOS 0 del sistema operativo. Vale decir, se suspende momenténeamente la ejecucién de un programa, y en su lugar se pasa a ejecutar dicho subprograma de la ROM BIOS o del sistema operativo lamado por el programa en cuestién. Por tal motivo se habla de “autointerrupcién”, provocada por la ejecucién de INT xx Puesto que una interrupcién es una forma de lamado a subrutina, en relacién con el uso de la pila valen las consideraciones hechas al tratar ese tema, como se ejemplificara. Subrutina que utd sive aINT 24 AS04020 PUSH AX PUSH BX ie POP BX Pila POP AX EASO:hhhh IRET @ Free 81 @/ Fre9| 08 / FEA 08. FEB or s FREC x / FFED > sp“ ~ FEE Figures 34 En otros procesadores la instruccién INT siene otros nombres, como SVC, TRAP, ete. 3.39 Dada la secuencia: xoexx0104 MOV AH, 2 yoooc0106 INT 21 yooxx 0108 INC DL. durante la ejecucién de una instruccién INT xx, como INT 21, la UC realiza los siguientes pasos (figura 3.34): 1, Maltiplica por 4 el mimero que acompaita a INT. Por ejempo, (en hexa) 21 x 4 = 84 = 0084 2-

Das könnte Ihnen auch gefallen