Assembler Desde Cero Mario Ginzburg

You might also like

Download as pdf
Download as pdf
You are on page 1of 92
ASSEMBLER DESDE CERO e INTERRUPCIONES MARIO CARLOS GINZBURG INGENIERO ELECTRONICO (UBA) EXDIRECTOR DE LA CATEDRA DE “ESTRUCTURA, DEL COMPUTADOR” E INVESTIGADOR ENLA FACULTAD DE INGENTERIA DE LA UNIVERSIDAD DE BUENOS AIRES INDICE UTILIZACION DEL LENGUAJE ASSEMBLER REGISTROS DE LA UCP A UTILIZAR EJERCICIO 1 introduetoria EJERCICIO: so de una intracein de salto cond (conditional jump) INZ. EJERCICIO3: ¢jerccio? mejorado usando JO (Jump ifoverfow),constantes, IMP y etiquetas EJERCICIO4: perfeccionamiento del eerccio 2 teniendo en cuenta que M 6N pueden vale eero EJERCICIOS: cémo cambiar el ejercicio Fi se usara JZ en-ez de INZ GENERALIZACION: instrucciones de salto condiciona: EJERCICIO 6: suma de 2 mvimeros de32 ‘mediante la UAL de 16 bits (3 soluciones) EXERCICIO 7: lecturay esertura de wna suetsin de datos consecutives en memoria (lista 0 vector) ERCICIO 8: sumar los elemes de una sta (veto) EJERCICIO 9: bvisqueda en lista usande la instruccin comparac o (resta sin asgnacign de resultado) EJERCICIO 10. basado ene ejercicio8y en un paso del EJERCICIO 11 otra variante del eersicio EJERCICIO 12: encontrar el mayor de una lista de nimeros naturale usando JA (Jumnp i sbove) EJERCICIO 13: dis 5 consecutivos y ejecucion del programa con FORMA DE COPIAR UNA PANTALLA DEL DEBUG EN EL WORD. EJERCICIO 14. ordenar alabticamente 2 Tistascuya cantdad de cracores no es dat diteto rama ligica con rom 1 Debug EJERCICIO 15. validacin de earateres de 3 cuya cantidad no es un dato directo EJERCICIO 16 intercambio de clementos entre des 5. variants con ahorro de un puntsro EJERCICIO 17 redondeo de nimeros con parte entera (de longitud wo Wnitada) yfraccionaia (an digito) EJERCICIO 18 téenieas pi - repetir 0 no a ejeeucin de secuens medante indicadores de pasta EJERCICIOS 19 A 25: ejercicios varios con cambios internos en Ios elementos de vectores EJERCICIO 2S a 28 cjerccis con traducciones de sentencias IF y FOR bajo nivel ‘CONSIDERACIONES GENERALES PARA PROGRAMAR EN ASSEMBLER EJERCICIOS PARA REALIZAR EIERCICIOS 30 y31: EJERCICIO 32: uso det instruccinJPE (Jump if party i ev 130 de JBE (Jump if below or equal) =sa sila paridad es par) EJERCICIO34 ordenamiento de una lista por burbujeo EJERCICIOS VARIOS CON OPERACIONES ARITMETICAS DIRECCIONES EFECTIVAS Y REGISTROS DE SEGMENTO EN MODO REAI LLAMADO A SUBRUTINAS. INTERRUPCIONES POR SOFTWARE EJERCICIOS BASICOS CON INSTRUCCIONES 1NT21 INTERRUPCIONES POR HARDWARE EJERCICIO INTEGRADOR DE SUBRUTINAS E INTERRUPCIONES MANEJO DEL PORT PARALEL MNEMONICOS DE LAS INSTRUCCIONES MAS USADAS. 6 atase 3040 M.Ginzburg ~ Assembler desde Cero U3-1 UTILIZACION DEL LENGUAJE ASSEMBLER Conviene aclarar que se suele hablar de programa “en Assembler”, siendo que en realidad el lenguaje se denomina “Assembly”, Assembler (“ensanblador”) es el programa traductor de assembly a e6digo de maquina, por lo que lenguaje assembly puede traducirse corra lengua ie" © lenguaje para ensamblador. Siguiendo la costumbre, mos llamando Assembler al lenguajesimbélico de méquina, y ensamblador al programa traduetorcitado, Recordemos (Historia de la Computacion, Unidad 1) que Assembler fue el primer lenguaje que usd simbolosalfabéticos, Permitié asi eseribir programas con letras desde el teclado de un computador (Salida eédigo ASCII), lo cual suponia la {xistencia ce un programa taductor ensamblador, para pasar los simbolos coditicadas en ASCII a eédiga de miquina, Cada modelo de procesador tiene su correspondiznte lengunje assembler, y su cnsamblador. Por lo general, los nicvos modelos de un misino fabricante conservan instruccfones en Assembler de modelos anteriores. Asi, un Pentium tiene ea su repertorio, por razones de campatiilidad, instrucciones en Assembler del 80286. Si bien cada fabricante de microprocesadores define notaciones ¥ aspectos partiulares para simbolizarinstrucciones en assembler, con un poco de prictica no resulta diffe para quien sabe programar un determinado assembler, pasar a oto Dado que la mayoria de las PC usa procesadores de Iniel © AMD. y que desde una PC se puede programar edmodamente ‘on Assembler, desaeollaremos-el Assembler de Intel como lengusje representativo, En el presente, se programa en Assembler para distinias aplicaciones. Lo mis corriente quizis sea pro de un programa que necesitan ser ejecutadas en corto tiempo, siendo que la mayor parte del programa un Lenguaje de alto nivel C, Peseal, Basie, etc) Esto se debe a que un Compilador para CISC (Unidad 1), al pasar de alto nivel a eSdigo de méquina genera cddigo en exceso, cn comparacién con cl obtenide a partic de assembler, lo cual redunda en mayores tiempos de ejecucién de porciones de programa cuyo tiempo de gjecucién es ertieo. Como contrapartda, en general lleva mis tiempo progeamar en assembler que en alto nivel Tambign sucle usarse el assembler para desarollar mancjadores de perifticos, y para controlar direclamente el hardware, dada la lexbilidad de este lenguaj, que permite manefa 31 no accesibles a lenguajes de alto nivel EE lenguaje Assembler, por ot parte. es una herramienta imprescindible para dominar a fondo el funcionamiento de un computador (visualizar movimientos internos que ceben tener lugar), y para sacatle el mésimo provecho. REGISTROS DE LA UCP A UTILIZAR REGISTROS ACUMULADORES REGISTROS PARA DIRECCIONES : obits ss A6bis 7 Bite 7 Ax AHS AL. st Bx| BHO: BL BX ox cH ch. Di BX ESEL UNICO REGISTRO QUE PUEDE USARSE px| DH DL COMO ACUMULADOR O BIEN COMO PUNTERO [BP PUEDE USARSE COMO PUNTERO EN COM Figura 3.1 En las unidades 1 y 2 se trutaron distintos ejemplos que empleaban el registro AX, de 16 bits. de la UCP como scumulador.y para operaciones de entrada y salida, Este registro tambin indispensable usarlo cuando se multiplica © divide, segin se vers, Pero en Ia UCP existen otros registros de 16 bits que pueden elegirse indistintamente como seumuladores, como BX, CX y DX (Figura 3.1). Tambign se dispone en la UCF de los registros SI y DI para guardar exclusivamente direcciones que apunten a posiciones de memoria (egistrs punteros), como se cjemplifien a partir del ejercicio 7. BX'eseltinico acumulador que también. puede uilizarse como regisira puntero (ejemplificado en el ejrcicio 13). Elregistro IP (instruction pointer es afectado por las instrucciones de salto (jump). Si se necesita operar datos de & bits, los regstros de 16 bits: AX, BX, CX o DX (0 sea los terminados en X), pueden Aividieseen dos reisios de 8 its. Por ejemplo, AX se descompone en AH y AL: BX en BH y BL, etc, Las letras H (de high”), y L. (de “low") hacen referencia a la parte alta y baja de un registra de 16 bis. u32 Ginzburg - Assembler desde Coro Entonces, en assembler, cuando se necesita defini un registro para datos o resultados de 16 bits, Teta terminada en X; y en easo de ser necesario emplearun registro para datos o resultados de 8 bits, se usar na ‘mismo, la cual se identifica por ser su Segunda letra una Ho una L, segin se el. En os procesadores 386, 486 y Pentiun, los registos citados pueden tener 32 bits, indicdindose EAX, EBX, ..., EDI, ES} EIP. La letra F hace referencia a “extended”. Diehos regisiros también pucden elegise para guardar 16 w 8 bis, mediante la simbologia antes definida, ET Debug s6lo permite definir registros de 16 u 8 bis El siguiente ejercicio bsica, analizado y realizado directamente en cédigo de maquina, sin usar Assembler cn la Unidad I de esta obra, muestra los pasos necesarios que se deben tener presente en los restantes ejer cios que se planteardin, Asimismo conviene aclarar que un desarrollo en Assembler puede realizarse en una infinidad de formas, Las que se presentan en este texto s6lo pretenden ser una guia, y no un modelo que limite potencialidades creativas. EJERCICIO 1 En un Lenguaje de alto nivel se tiene la sentencia R= P + P ~ Q para operar ndmeros enteos (variable “Integers” Codificaria en lenguaje Assembler, lo cual también servid para poner en evidencia emo se conereta a nivel de hardware yy e6mo podria traduciria un programa traductor tipo Compilndor cuando realiza la raduecidn en sewdo assembler, Ja) Cualquier socuencia de instueciones a desarollar operari. iimeros (valores de las variables) que estarin_en_memoria principal, por lo que ‘primero siempre deben eleois direeciones de memoria arbirarias dénde se ‘encuentran los valores de las variables (R, P y Q). Como se veri esta eleccion arbtraria se uiliza huceo-en In cadificaeién de las insrucciones. En lo que sigue, supondremos que las variables tipo “Inlewsis” ocupan 2 cele das consecutivas de memoria, salvo que S= indique otra cosa. Asignaremos (ig3.2) aR, P y Q las direcciones 5010/1 1,5000/1 y 5006/7 respectivamente No interesa en ‘valor de P50, puss los programas se desarollan ara valores evalesquicra de la variables, dentro de cieros limites ita 500 1b) La figura 3.2 también sirve para plantear la secuencia de los movimien- tos y operaciones que deben ordenar las insirucciones a codificar, para i He= vvando a eabo en orden los pasos necesarias para coneretar la suma algebraica soosf_ fos a fue ordena la sentencia R'= P+ P= Q teniendo presente ue dshos movi s007| Inentos y operaciones son los ae pi picamente un computador J Fats ilimos, como se planed en Unidad Ide est obra, pueden eomprsn: sol &—] ders coneeptusimente -alaciin gon To que pusle hacer una simple S011 aleuldors de bolsillo, Asimiaremas su visor-acumulador al n procesador arriba definido, y sus circuitos para sumarirestar a la Unidad Aritmetico Logica (UAL). En un computador los nimeros que se suman provienen directamente de su memoria principal en vez de ser generados desde un teelado como en la ealeulador, y los resultados que aparecen en AX pueden ser guardads en dicha memoria, Eso lo indican las lechas dibujadas en la figura 3.2. Figura 3.2 Si en una caleuladora qusigramos hacer P + P—Q los pasos en esencia serian: 1) Llevar el valor de Pal visor. 2}. Sumar a P el valor deP, el resultado de P + P queda en el visor. 3) Restar al resultado del paso 2c! valor de Q, y el resultado final de P-+P—Q queda en el visor. [En un computador los pasos equivalentes serian ordenados por 3 instrueciones que designaremios I, Ip ¢ Ih: ordena llevar hacia AX (registro de 16 bts) una copia del valor (P) que esté en memoria en Ins direcciones 5000/1 Tf ordena sumar en la UAL. al valor (P) presente en AX una copia del valor (P) que esti en memoria en las direcciones 5000/1 y el resultado (P + P) dejario en AX. 1 ordena restaren la UAL al valor (P + P) presente en AX una copia del valor (Q) que esti en memoria en las direccio- nes 5006/7 y el resultado (P + PQ) dejarlo en AX. Puesto que R= P+P=Q ofdena guardar el resullado de P+ P ~Q donde esti la variable Res necesaria una instruceidn Ti. que ordena llevar hacia las ditecciones 010/11 (donde est R) una eopia del valor (P + P ~ Q) que esti en AX Obsérvese que las variables R, Py Q definidas en alto nivel pasan a ser ahora contenidos de direeciones de memoria. Exios movimientos v operaciones se indican en la figura 3.2 en relaciOn con Jo que sucederia si ns correspondientes se elecularian, sin que aparezcan por simplicidad los movimientos para pedir esas instrueciones. En dicha figura sobre el registro AX aparecen los nuevas contenidos (P-+P_y P+ P~Q)que AX va tomando. 2). Habiendo elegido las dircesiones de las variables en memoria, el registro AX como acumulador, y planificado todos tos pasos (Futurasinstrucciones) necesarios, se debe seguir con la realizacién de un diagrama lgico donde se codifique lo que ordena cada insiruceién, con vistas a ayudar a la codifieacin final de Ins instrucefones en lenguaje Assemble, {Asi (fig, 3.3), lo que ordena lyse ha indicado AX € [5000/1] pudiéndose tambicn escribir AX € MSOOO/, con M signi= da lel M,Ginzburg — Assombler desde Cero 33 3000/1] prepara! esseno para codificar esta instrucein en Assembler (ver abajo). [Los corchetes siempre sinbolizan men vez entre corchetes se indian di ficando memoria, pera la simbolo dan na o mis eeldas sueesivas de memoria, Si bien esta eeciones de? eeldas, bler siempre se codiliealadireeeién de In primera ced A la derecha de controtanda 1s resultados pariales esperados, como AX =P. ‘No es necesario en los 3 indicar el valor conercto de las variables P y Q, pues en general un programa se sdesarolla para una amplia gama de valones de sus variables. Pero puede ayudar a depavarlo si nies del paso siguientes hace una prueba sottorio” con nimeros, para verficar que una secuencia funcionari corrcetamente, a paso 2s muy conveniente ae 3) Mediante ef comando A del Debug se pucden escribir programas TAX == (5000/01) | gx. en assombler. AI lado de la Iera A se debe eolocar ln dineeo (on iieiaceetaigieacemee general arbitraria) a pated n cual se quiere esribir el programa, afAX= Se ha clegido és en 0200, yen jericios siguientes usarcinos 0100, PRESETS] ax p4P Eomibicres ncomimacy co scab ne oe, Ss tkucsiones que se eocrespondea una sua con 1 21 de la figura 3.3, Dax -— AX - [5008 07] Altipear A 0200 1 spareeerd xxxx : 0200, y el Debug esperaré que EPPO tinge MOV AX, [5000] luego de lo cul aparece sao 0208 z In espera de otra instrciéa, y asi sueesivamente. Sse tipea mal una MLEOTOANES AC “Hesorcrin] =A insrwceon, proce una incacion de eur papa set ntre corchetes sblo se eseribe [a primer direecidn de eada variable, Figura 3.3 Las insitucciones donde aparece AX (6 BX, CX, DX) implican que los datos a operar son de 16 bits. AX es un “recipiente™ que recibe necesariamente el contenido de 2 celdas sucess Cada instruceiGn ondena ura operacion (MOV; ADD, ete), se resultado con una coma final, Laggo continia otf campo con el lugar de origen de un dato a operat. El entarios dela derecha es optaivo, 0200-5 xx4x:0200 MOV AX, [5000] 1? AX una copia del dato (P) que esti en 5000 y SODI de la memoria, xxxs0203 ADD AX, 5000] 1 Sumara AX una copia del dato (P) que esti en 3000 y 3001 de la memoria, xxxx10207 SUB AX, [5006] J Resiar a AX ua copia del dato (Q) que esté en 3006 y 5007 de la memoria, xxxx:020B MOV [5010], AX J Transferira 5010 y S011 de memoria una copia del contenido de AX. SxX020E (Se vuelve a pulsar para salir del eomando A) (£1 guidn indica el Debug espera otra comand), ‘Con xxx se ha querido indear 4 simbolos hexadecimales a talar, cuyo valor puede ser distinto en cada PC. Cuando se tipea MOV AX, [5000], a partir de Ia dreecién 0200 quedarin en celdas sucesivas de memoria coifieadas en ASCII cada uno de los earaeterestipeados. Al tipear J el programa Ensambladar del Debue MOV AX, [5000] «en la instevecign de méquiaa 10100001 00000000 00000101 = A1005U que se escribir en 3 celdas a panir de dicha Aireecibn 0200, desapareciando as todos los earacteres en ASCII antes tipeados desde 0200, y a dtcecién que aparece Dara eseribir la segunda insiruccin seré 0203. El e6digo Al y el eédigo ASCII se tratan en la Unidad Ide esta obra, ‘Al erminar de tipear las 4 instrucciones, las misnas queylarin tradueldas en eédigo de mguina listas para ser ejecutadas, Si se quicre ver estos eéigos en hexa, se debe tipear el eomando U 0200 J ) Como se siemplifica lngz0 del eiescicio 13 y al igual que en los ejemplos de la Unidad 1 de esta obra, antes de eje= «utar con el Debug esta secuencia de instracciones, se dcben escribir en memoria con el comando B los datos procesnt (alores elegidos para las variables P y Q). De seguido, con el comando RIP se debe dar el valor 0200 al IP: con el ‘comando R se debe veritica que todo esti en orden: y con 4 camandos T (uno por instruccidn) se ejecutaré la sccuencia OTRA FORMA DE REALIZAR EL EJERCICIO 1 En un computador R= P+ P~Q se puede hacer de milkiples maneras, como ser (Figura 3.4): 1) Llevar hacia AX una copia del valor (P) que esti en memoria en las drccciones 5000/1 2) _Ilevar hacia BX una eopia del valor (Q) que esti en memaria en las direcciones 50067. 3) Realizar la suma AX © AX + AX. o sea sumarle a AX su propio valor, y el resultado P +P defarlo en AX. 4) Realizar AX € AX ~ BX, 0 sea restar a AX el valor de BX, y el resultado P+ P—Q dejarlo en AX. 5) Llevar hacia la dreceiones 5010/11 (donde esti R) una copia del valor (P + PQ) que esti en AX. esti presente en Ia mayoria de ls PC, vineulado al DOS. Ya fue wsado por su simplicidad didictca en fa pra codificaren memoria datos e instrucciones en eddigo de mquinay luego ejcutales una a una. Aor lo os también para programar divetanente en Assemble, pues no race Wrelivas para el waductor Ensamblador, como eon Debug. mis ptentes (como el MASM o el TASM) que penile en oa cos usar nombres dé variables en ligar de dcocen umerias, aeercando al Assembler a lenzuaes de alto nivel, Sin necesdad de usar ni pensar en esas deci, ef sumo dade mjenzo centr su esfuerzo en snsrurdrcetaenteseeuencits de istructiones en Assembee Si una instrucién tiene tn mimero ene cores se dice que esti en “md direct”, o en modo de ireceionamienlo directo, dado 4ve directamente dicho nimeros la ditcccin para locilizar en memoria el dat 4 proce. U4 MGinzburg - Assembler desde Cero Las $insirucciones correspondientes en Assembler se MOV AX, [5000] (AX=P) MOV BX, [5006] (BX=Q) AX (AX*P+P) BX (AX=P+P-Q) MOV {S010}, AX A laderecha de cada instruccin se indica qué ocurre cuando ella se ejeeuta. En lugar de utilizar el registro AX como acumlador, podriamos haber usado BX, CX © DX; solo hubiesen cambiado los eddigos de msquina de fas instruceiones Por ejemplo: MOV BX, [5000] MOV AX, [5006] ADD BX,B: SUB_ BX, AX OV {5010}, BX En ninguna de lasts seeuencias de insirucefones anteriores se planted la posibili- 599g dad que por los valores de los datos puestos en juego, un resultado en el registro AX 5997 de 16 bits supere alguno de los maximos +32767 6 ~32768 que AX puede contener (eterminados en la Unidad 1 de esta obra), situacién considerada en el ejercicio 3, -— En i codifieacign de dichas secuencias se pudo veritiear que la eleccion arbiaria — S010[ {de las direcciones de las variables no interesa, dado que al formar parte esas diree- SOIT clones de las intrueciones, éstas permitfan localiza las variables en las direeciones clepidas. Memoria {CICIO2: uso de una instrucei6n de salto condicional (conditional jump) non tenguaje de alto nivel se escribié la sentencia R= M x N para multiplicar nimeros enteros positives CCodifearia en lengugje Assembler, suponiendo un microprocesadorbisico que no tiene insrucciones para multipliar,y ‘para plantear Ia eorrespondencia entre las estructuras tipo "FOR i= | to i= n....”y su equivalencia en Assembler. Este eerecio es esencial, pues empezaremos a usar las instrucefones de sao condicional, en este c2s9 para repetir la ejecucién de una secuencia, sirvctura que seri usada en muchos ejereicios para repelir n veces un procedimiento. [Emplearemos una instuecién de salto eondicional para R=MxN, repitiendo N veces una operacion de suma, NE AP AB eliza el producto Por definicion de producto es R=MxN=M+M+.. . . + M expresién con N sumandos iguales a My N— 1 sumas Si bien puede partie de esia expresin, a los fines didicticos haremos R=MxN=0+M+M+, ... +M; 6 sea mediante N sumas eon sumanklo M, en vez de N — 1 suas. es Mx4=0-+ MMM +M (N= 4 sumas con el sumando M) lla, supondremos: que My N son n eros positives de das bytes. que N es distinto de cero, y que es £32767. En el ejercicio 3 se trata cémo detectar si se supera este maximo, yon el ejereicio 4 In detecein de si MON valen cero. 1) Asignaremos (Figura 3:5) a Ja variable M. tes diteccio 13300 y B30; a Ia variable N las direeciones B310 y B31; y ‘do B320 y B321 para cl resultado R. es de memoria Para evdenciar fa necesidad de wna insirucein de salto, coliiearems en ssembler R= 0+ M+ M+... gonerlizando lo aprendid en el ejerccio | Memoria tia Mura 3.5, pensada para el eerie 2, muestra cl paso para llevar una Nemora copia del valor de M al stro BX (podia haber sido AX, CX, 0 DX); y el p80 pata initalizaren ceo el rezistro AX ws como aeumiladorseorde con el cero presents en R= 0-+ M+ M+ TR in de realizar las N sumas necesilas, un stmando es aportado por AX, el oro por BX, siendo que el resultado “pis” el anterior valor exitene en el acumlador AX, como en una caleuladora. nla primer Suma se hace 0+ N Una vezrealzads las N sumas en AX quedarae estado de Mx N, cl val debe ira como indica la esha Con ls instrucciones definidas en cl eerciio 1, una scoucneia para realizar Nsumas repetdas sri: Figura 3.5 M,Ginzburg — Assembler desde Coro 3-5 MOV BX (8300) Leora um gids queen B30 i= bey cg tiene nga reap er TAD AX, BX ' oer AXY BN y dja eatado cn AX 709 ~(Cx40) ir yes ADDAXBX lm 7 a ADD ADD AX, BX em 2 (CX=0) ira} LADD AX, BX En AX estd acumulado el resultado Noriason ne Sa ates en mao aie Tambien se podria haber hecho laseeuencia: MOV AX. [300] se ‘ltime MOV [8300], AX, pero seria mis lena de ejecutr, pues en cada suma hay que aceeder a memoria a buscar el dato La dnia instcci6n nueva es SUB AX, AX usada para llevar el registro AX a ceo (lo mismo puede hacese para linpiar cualquier registra). Tambign exist otras armas de hacerlo, ‘Como aparece en el programa eserito mis abajo, la instruecién de veces ADD AX, BX, pemmitendo escribirla una sola vez. Conforme se discard en Ia etapa 2), cuando se ejecute este programa, INZ. posibiltara repetir N veces In eiscucién de ADD AX, BX eserta una sola vez por BX TBO POINTE exam estar ésia dentro de un “Iazo o secuencia corta de intrucciones aque tambita se ejcutar repetida N veces. QRS ATA Te9 2) cota sauindcadn 1) ignon decones a i aan y se plantearon todos los movimientos y aeciones que deberin dia por ADD AX, [B300] repstida N 1 veces, y por CX — [8310/11] i AX — AK FBX Suceder, por fo que ahora se consteuicé cl diagram Iépico de la OR cone 13.6. En general éste se puede dividir en ls siguientes fases lect einilaltzaetén de registros: para preparar el contol OO oan et mimeo N de veoes que e rept a ejeucion del azo ita, en un primer paso (11) se levard un registro una copia del valor de N, que estd en B31O/I1. Es usual usar con este fin el registro CCX al eual se le restari uno cada vez que se eeeute dicho lazo. El paso siguiente (12) es initalizar BX (podria haber sido DX) con ORBEA econ LRN MAMEReTT TEN te Figura3.6 En general el onden de la inicializacién no es ctucia 2b) Procediniento en este caso (14) es la operacin de sumar cada vez al registro AX el valor de M, dejando en AX el resulado, n que Se repetiaN veces, y ue constituye el cuarto paso, 28) Conrrel: come hay un lazo que se repetriN veces, al registro CX (que contiene el valor N) se le debe luego de cada vez que se ejecuta la instruceidn de suma. Cuando sea CX = el lazo se habe eieculada N vs esto no ocurra, (micntres CX +0), se deberin seguir eecutando una y ot vez las insrucciones de fz, y eada vezen la UAL se le resta uno a CX. Asi CX controla las veces que se repte la gjecucion de fs insirucciones del azo, [Er timo paso (16) que forma pers del lazo de ejecucién repettiva es la insituceiin de salto Cjump”), simbolizada por un ombo donde se pregunta indinceamente” a wavés del fag Z.* generado por Ia UAL (figura 35.3). sie resultado de Ia ‘ue ella hizo (restarle uno a CX fue cero 6 distnto de coro. Si esto tltime se cumple, esta instruc ‘idm ordenasaltar a ejecutar otra vez la suma (14), como indica la linea que sale del rombo hacia esa insirucein. Mis en detale siZ = 0 (que debe entenderse como si Zero “no”, o sea si el resultado de CX ~ I que qued en CX no es ero)" a instruc de salto ordena un salto en el valor del registro Punter de Instruceiones (IP) para que indique que direceiin de memoria de la préxima instruccién a pedir y ejecutat sea la de suma citada (Id). Con ese fin, la insiruccién desaltocontiene el valor que debe restarse al IP para que la ejecucin reroceda ala drecein de la instrucein de suma, Cuando sea Z'= 1 (0 sea si Zero "si". es decir si es cero el resultado de hacer CX — 1, con lo eval CX'= 0), se tende a suacién contraria ala condieién planteada en el rombo que sea Z = 0. Entonces, la instuceién de salto ordene no salter, sino seguir con el pedido y ejecucién de la insteuecidn que le sigue en memoria (17), camo en una insiruecién coriente, sia insirucion (16) en Assembler es JNZ hhh, siglas de-lump if Not Zero (sallar si zero no) a Ta dieocion hhh, 24) Almacenamienio: por to general los resultados alcanzados en la UCP se guardan en memoria principal, como ocurre con el paso (17) que sigue en el dagrama al combo, cuando se almacena en B320/l el resultado final de Ia meltplicacién, Cando el dato a opear no estéen memoria sino nun registo dela UCP, y el resultado va ambien a un registro deka UCP, node de dreeionamitto se denomina "modo registro", Como plates eel Unidad! do etna la Und de Contl (UC) no puede vernal cone cone de un registro, n este e980 CX, por lo queclprogramador se debe verdes flags que ener la gomtenido es © noes cero, Mediate I insrcin de salt UC que lea el valor de Z y que = 5 El tema de los flags se desaoll:en dae cla Unidad {desta obra, en el capt sobre repres No confundirel hecho de que un esuliado no sea eo, con la indian de la para exe “Tense presente que cuando un estado si es ee, A 3-6 M.Ginzburg - Assembler desde Cero ‘Al lado de cada rectangulo del diagrama logico de la figura 3.6 se indica el resultado a obre sjocuci6n de las cuando ocurra Ta primer sirucciones del lazo: y abajo los pasos que modifican el valor de los flags SZVC. {a seeueneia en assembler correspondiente al diagrama dela figura 3.6 ser A 0100 xvoo:0100 MOV CX, [B310] Llevar a CX una copia de N que esta en B310 y B311 xxwx0104 MOV BX, [8300] Lievar a BX una copia de M que esti en B300 y B301 xxwc0108 SUBAX, AX, Poner acumulador AX en cero, restindolo de si mismo. « swxc0l0A ADD AX, BX Sumar a AX el valor de M que esta en BX sexc0l0C DEC CX Restar uno a CX (con fo cual pueden cambiar los Mags SZVC), xexx0l0D NZ 010A Si luego de Ia instrucetn anterior 2=0 (CX no zero) saltar a O10. sxxcOl0F “MOV [6320], aN LLievar a B320 y 8321 de memoria, una copia del valor de AX. sxxx0l12 INT20 Insiruccién de final de seeweneia Al igual que en el diagrama légico de la figura 3.6, se dobe repetir N veces Ia instruccién ADD AX, BX. Cada ver que se realiza esta sum, la instruccidn siguiente DEC CX deerementa uno al contenido del regisiro CX (que inicialmente es N); y la instruccidn JNZ.sitve para detefminar por un lado si el nimero contenido en CX aleanas o no el valor cero niimero en CX no sea eero (not zer0 = NZ), o sea mientras ol resultado de restr uno & CX le corresponda 2=0 (condicién de salto de JNZ), se salla a ejecutar otra vez la insiuccién ADD AX. BX de inicio de la Secuencia a repetr. Ladireccién de esta insiuccidn a la que se quiere sltares el nimero que acommpaa a INZ. En definitiva, Ia instruccion de saltar si resultado anterior no es eero (JNZ hhhh), ordena saltar a la iustruceidn de ircecion hhh sélo si Zm0 (e210 10): easo contrario (Z=1) ordena continuar con la instruceién que sigue a INZ. Esta mal escribir debajo de JNZ Ia instruccén_1Z hhh (saltar si Z=1), pues esto ya esté contemplado en JNZ. También puede decirse que JNZ hhh ordena saltar ala instruceién de direceisn hhhh si es verdadero (cierto) que Z=0, y que si es falso que Z=0 (0 sea si Z=1) ordena continuar con la instruceién que sigue a INZ. Debe observarse en ln seeuencia dada, © en cualquiera con una insiruccién de salto eondicional que debaj Ue ta fast tuccidn de salto debe eseribirse aquella que hay que ejecutar en caso de que NO se eumpla la eondicion que ela estipul, que era N, se le habri estado N veces uno, La ditima testa que 0, con fo cual serd Z=1, en eorrespondencia con C: Despugs de realizar N veces el lazo, cl contenido de CX, efectuari la UAL eon el valor de CX seri 1 En consonancia se habran realizado N sumas. ‘Axa altura del proceso, el siguiente salto con la condicign que sea ZO n0 sete y la sccuencia continuard con MOV [1320], AX eserta a continuacion Si fitera R= MxN = 3x4, puesto que Ne, se ejecutard 4 veces el lazo, realizndose ‘operaciones que ondenarin ls instrucciones indicadas, con los rsultadas en hex liza, por no verificarse esa condicién, cada oportunidad las sigu al que aparecen. ADD AX, BX DEC CX NZ OIA Iraves: AXEO+3 AX CXE4=1 CX*3 (20) Salta 2 O10A pues Z=0 2daves: AX@3+3 AKG CXE3-1 CX#2 (20) Salta a O10A pues Z=0 Braves: AX@6+3 AK CXE2-1-C Salta 810A pues Z=0 Maver: AX@943 AX@C CXEN-1 CX=0 ZAI) [No salt, sigue, pues Z=1 Esto puede verificarse paso a paso, ejecutando la [Ea secuencia en Assembler, como cualquier o sie yadmacenamiento, de syencia anterior en Assembler, mediante el eomando'T del Debug. 1. puede dividirse en las lases de inicializacién, procedimiento, control de suerdo con ls lines horizontales que aparecen en esa secuencia,planteadas en el diagrams, [Est tipo de seeuencia para repair un procedimento ser muy wlllzada en eercicios posterior Resultaiustrativo analizar qué sueede si se eambia el orden de alguna de las instrucciones de la presente seeuencia, Las wes instrucciones de Ia iniefalizacién pueden eseribrse en evalquier arden, pues no ata al dessollo si Vale Ia pena sefalar que las instrueciones ipo MOV, como no ordenan operaciones en la UAL, no afeetan el valor a {cia los Maes SZVC antes desu ejecucién. Sélo pueden cambiar el valor de ls flaws las instructions que usan la UAL Si bien fuego de ejecutar SUB AX, AX resulta AX*0, y por lo tanto salto que pregunte por el valor deZ, sino. {Qué pasa si se imereambian los lugares de DEC CX y ADD AX, BX. 2, Sucederi que como ADD AX, BX cambia el valor de los fags. y INZ pregunta por el valor de 7 luego de la operacion anterior de la UAL. (como indi Ia flecha que va del flag Z al rombo), se estaria preguntand por el valor de Z de dicha summa, en vez del que resulta de DEC CX {Qué sueede si MOV [B320], AX se coloca denteo del laz0 2. Si bien el resultado final en R seria correcta la seevencia tararia mas en ejecutarse, pues en cada vuelta habria que acceder a memoria para escribir eada suma parcial como Ia instruceisn siguiente no es una de ie es ADD AX, BX, no interesa que sea Z=1 "esta instruceiin no conviene ejecutarla mediante el comando T del Debug pes puede hacer perder el programa tipo, Su uso indica que una secuencia termina, pero que lt UCP no se detiene, pues INT 20 es una instruceion que ordcna tn intrrupeen pra qe Se pase a ejcutar el malo del sistema operative que determina cule lsiguieme program que se sea gjcutanda a coninsacion, de MGinzbur Assembler cesde Cero U3 {Los pasos desarrollados en la (igura 3.6 ordenan que una suma (y en general un procedimiento) se repita un nidmero N de veces conocido de antemaro. Se los puede hacer corresponder con la siguiente esiruct FOR i=1 «@ N R=R+M EJERCICIO 3: Mejora del ejercieio 2 usando JO (Jump if overflow), manejo de c nstrucclin JMP, y uso de etiquetas en un Tenguaje de alto nivel: istantes, empleo de OX — [8910/11] ever Gebers) mise ue ils eee eel ebe BX -— [8800011 fro de 16 bis como ot de tl tros AX. BX, CX. DX. existe = flow si por semplo, una suma de AX AX = AX tnterospositivossupera dl valor 32767 SS 06 De ser alla UAL genera la indication Aes ee ‘ fa pec uri. | Modificaremos la secuncia ds ee cio anterior para que si por los valores M y N alguna suma parcial o total excade 32767, con lo cual Ia UAL. Ia indicacion V=, se eseriba como : = ae resultado en B320 y B321 el entero cx cx - 4 AX FEF ative FEF (que comienza con bit lo (7 SSSSTAGFFF ny esulna inssii pra Mi eo | [score ax sede My N sou ese povon Para tal fin (Figura 3.7), se modifica la [ES20T}=FFFF fig 3.6 para preguntar si vale no el flag moe — ax YV gencrado luego de hacer la sun Si V=I se crea otra secuencia que pasa cl niimero FFFF hacia AX; y que des- pues en otro paso el valor FFFF de AX Figura 3.7 Jo copia en 8320 y B321 No hay problema que se “pise™ eon F el resultado acumulado por AX, dado que éste 6s errado por ser V=I. Si V=0 (resultado parcial o final correct) el curso de gjccuctén sigue por los mismo pasos del diagrama de la figura 3.6 Las dos secuencias eodifiendas en Assembler que se corresponden con las ela figura 3.7 son las siguientes A 0100 sxsxs0100 MOV CX, [B310} xaxxi0lDl MOV BX, [B300} en B310y BSI IX una eopia de M que est en B300 y B301 xANX0108 SUB AX.AX. Poner acumulador AX en cero, restandolo de si mismo SAXXO1VA ADD AX, BX Sumar a AX el valor de M qu sanx010C JO 0130 Si dela suma anterior resulta V=I, sltar a 0130 (seguir si V=0) xaxs010E DECOY Reslar uno a CX (con lo cual puede cambiar el valor de los Nags SZVC) xaxsiOlOF — JINZ 0704 ‘Si luego de In instruceidn anteriores Z=0 (CX no zero) saltar a 010A, sxaxOI11 MOV’ (8320), AN Llevar a B320 y B32! de memoria, una copia del valor de AX sxaxOlld— INT20 Insteuecin de final A130 ssaxi0130 MOV AX, FFFF sxa0133, MOV [B320}, AX xxaxi0136 INT 20 evar a AX una copia de la constante PPEF 18320 y B321 de memoria, una copia del valor FFFF de AX Instraceiin de final Figura 3.8 Entonees la seeuencia que empieza en 0100 es Ia del ejercicio anterior con el agregado de JO, La instrucen de saltar si f resultado anterior gener overflow que en assembler se escribe JO bhhh, ordena saltar @ la insiruecién de direccién hhh sao si V=1; caso contrario (V=0), ordena continuar con la instruccién que sigue a JO. En definitiva, si luego di secuencia que empieza e 30 0130 ordena saltar (si V=1) a otra instruceién que en Por ello mediante el comando A 0130 hubo que eseribir otra se ‘ordena pasar el ndimero FFEF hacia AX. y MOV [B320],AX ord 310 y termina en 136, conforme al diagr es V0 se ejecuta In Secuencia del cjorcicio anterior: y pa dela Figura 3.7. ‘aso no forma parte dela secuenecia dande JO se encuentra {que empieza con MOV AX, FFFF, Esta dltima ar a memoria lo que esti en AX, o sca FFF V=I se pasa a gjeeutar Ia U3-8 M.Ginzburg - Assembler desde Cero Nosaisis una insiruceiOn como MOV (3320), FFFP que ordene pasar dirctamente una constante a memoria. Esto obliga a pasar primero FFFF a.un regisira (en este caso AX), y luego de éste a memoria. Ta direccién 130 fue elegida arbitrariamiente pero dentro de los limites miximos permilidos para salar, tema a ratar 10.0111 (salto a MOY (8320), AX). al queda dste en B320/1, su signo neo, lo cual implica que Nueva mejora: se puede obviar In sseuencia de 0130 MOV AX, FFI ado que con enteros positivos si V=I el resultado errénco siempre es nezaliv ( negativo es sufeiente para indicar al programa que lo utilizar que ese resultado es er GENERALIZACION: Instrucciones en modo “inmediato” con un operantio que siempre tiene ef mismo valor (constante) Obsérvese la diferencia entre MOV AX, FFFF y MOV AX, [FFF]. La primera ordena cargar en AX el nimero fio FFF, mientras que la segunda ordena cargar en AX el nimero que contenga entonees la direecign de memoria FFFF. MOV AX, FFF al igual que todas ls instrucciones que despuss dela coma de! medio sigue un nfaero (sin corcietes) ‘se dice que estin en modo “iumediato”, Esta denominacién puede explicarse observando el eédigo de mquina de una instruccin en este modo de direeeionamiento, Mediante el comando U del Debug podemos hallar por ejemplo el eddigo de maquina dela instruceién MOV AX, FFEF (Iuego de haber eserto la secuencia en assembler donde eila se encuentra) = V0130 sweu0130BEFFFF MOV AX, FFFF xaxx:0133 A323 MOV [8320], AX sxax0136 CD20. INT 20 Se observa que en memoria, {uego del cbdigo de operacién BS inmediatamente focmando parte de la insicuceién sigue cl icra fijo FFFF que pasar a AX enando BSFFTF se ejecute, de donde proviene el nombre “inmediato” de este modo. También pertenecen aeste modo por ejemplo ADD BX, 2 (sumac siempre 2 al contenido de BX, y el resultado dejarlo en BX), 0 MOV AX, 0 (llevar el niimero cero 2 AX, lo eual es otra manera de evar un registro a cero, ete En todas las instructiones en modo inmediato de un programa, un nimero que ellas operarin (cuando sean ejecutadas) forma: perle (en memoria) de estas is\rueeiones. Cuando cada una de ellas sea ejecutada y se acceda a memoria para pedirla, dicho nimero Megari-a Ia UCP desde memoria junro con Ia instrueciin, pues el mismo esti incluido en ella 1 sea que este tipo de instrucciones proveen a fa UCP el valor (constant) de un niimero que intervendr en Ia operacién que ordenan, y por lo tanto no ser neces cr ota ver a memoria {mayor tiempo de ejecucién) para obtener, Por consiguiemt, los valores fijos (onsiantes) que operari un programa forman parte cn memoria del mismo y estin eon las insirucciones en modo inmediato en lugar de estar en memoria en la zona de datos variables de ese programa, por ser datos, conoeidos de antemano se hallan en la zona de instrucciones. Cambiar el valor de uno de estos nimerosfijos, que fe usan tipicamente para inerementar 9 deerementar el valor de un registro usado como puntero de datos de una lista, © para dar valores iniiales a variables en registros al comienzo de un programa, implica modificrto. EJERCICIO 3 bis: Mejora del ejercicio 3 empleando la instruccién JMP. Uso de etiquetas El programa de la figura 3,8 puede eserbirse eon menos instrucciones, como en la figura 3.9 dado que Jas seeuencias que ‘empiezan en 100 y en 130 fine las mismas des dltimas instruccfones en comin, En el diagrama de la figura 3.7 aparece tina linea grisada en punteado que va desde abajo del paso AX. FFFF hasta el comienzo del paso [B320/1] € AX. (sea que est linea indicario sallar sin condiciin alguna, de una secuencia a otra (o dentro de una misma seeuencia) Asi. luego de ejecutar la primer instruceién que esid en 0130 se sallaria incondicionalmente a ejecutar las dos élkimas ‘nstrucciones de Ia secueneia que empieza en 0100, que son tambien las dos dltimas de la secuencia iniciada en 0130. La instruccién JMP O11T de salto (jump) de la figura 3.9 eumpliri este cometido, No es necesatio indicar eon un rectingule la existencia dela instruceién JMP, aungue en lo sucesive por razones didkcticas lo haremos (ver figura 3.11). ‘iionalments Calo f°) a la nsiruccion que esti en la direceiGn hhh, sin “gue a IMP en memoria. Eguivale a un “GO TO” en lengunies de alto nivel Fageneral IMP hiikh ordena salar in posibilidad de seguir con lx instruccién qui Conforme al uso de IMP, las sectencias dela figura 3.7 con la linea en punteado quedarian como indica la figura 3.9. A 0100 sxxx0100 MOV CX, [B310] MOV CX, [8310] xxxs:0104 MOV BX, [8300] MOV BX, [300] xxxx:0108 SUB AX, AX SUB AX, AX Sxxx:010A ADD AX, BX OTRA ADD AX, BX sxxx:010C JO0130 JO ALFA xaxxiQlOE DEC CX DEC CX NMxN:O10P NZ 10 NZ OTRA xxxxOLIL “MOY (8320), AX BETA MOV’[B320), AX sxsx0l 4 INT20 INT20 40130 xxxxi0130 MOV AX, FFFF ALFA MOV AX, FFFF saxxi0133 SMP ONT MP BETA 103.10 Figura 39 Fi M,Ginzborg~ Assembler desde Cero uso La figura 3.10 repite la sccuencia de la figura 3.9 pero sin las direcciones, Fn lugar de éstas aparecen las etiquetas (labels), como “otra”, “be”, “alli”, que son admitidas por otros traductores, pero que no son permitidas por el iraduetor que provee el Debug. Esti claro que dichas ctiquctas se usan para indicar direcciones simbélicas a las que spuntan ls instrucsiones de salto. Para desarollar programas en Assembler con papel y lapiz sin usar el Debug usaremos etiquetas, De esta rma podemos independizamos del Debug y de las diceccioncs. EJERCICIO 4: perfeccion: nto del ejercicio 2 teniendo en cuenta que M 6 N pueden valer cero, En el ejercicio 2 se plante6 que si N=O el lazo con <— [Bat la suma se repetria indefinidamente pues munca CX -—~ [8310/11] oe Esto iltimo no sueederiaen el ejercicio 3, pues al repetirse cierto nimero de veees la suma,legaria tun punto en que en AX no entrain el resuliado ‘como resultado (errado) en vez de cero, y el programa terminaria, Ahora completaremos et ejercicfo 2, pata que si M SN valgan cero inmediatnmente sea R=0, sin efeetuar ninguna sama MOV CX, [B310} MOV BX, [B300}, SUB AX, AX SUB CX,0 JZ BETA SUB BX, 0 Wz. BETA OTRA ADD AX, BX JO OVER DECCX JINZ OTRA BETA MOV’ (8320), AX INT20 BX -— [8300/01] OVER MOV AX, FFFF IMP BETA Antes de que se realice el laz0 detectaremos si vale cero M 6 N, que en Ia inicalizaciéa fueron puestos en BX y ‘CX. [8320/21] — ax La Unidad de Control, encargada de ejecutar las instrucciones, no esti capacitada -como podemos estar nosotros- para conocer por sus unos y ceros, Figura 3.11 el valor de cualquier nimero que esté en un registro 0 en memoria, Si se quiere conocer si una ‘arable que esté en el registro DX tiene por ejemplo el valor $0, se debe ordenar mediante instrucciones primero hacer la ‘esta DX — $0 , y luego inditettamente mediante una instruccién de salto preguntar si el resultado de esa resa fue ceo (Z=1, 0 sea c2r0 *si"). De ser Z-0 (0 sea cero “no") dicho resultado serd un nimero que no interes, pero no sera 50. Tgualmente (Figura 3.11) luego de la inicializacién de rogistros, para saber si N que esté en CX vale cero, primero se ‘ordena hacer CX ~ 0 y luego preguntar si Z=1. Si Z=1 implica gue R= MxN = 0. Entonces como antes de hizo AX=0 aprovecharemos aste cero que esti en AX para pasaro a In variable R que esta en B320/1 ‘tal fin mediante un salto condicional se ordena que si Z=1 saltar a la insteucci6n [B320/1] © AX que esti al final. Si 0 indica que N no es cero, por lo que se pasa a evaluar si M=0 con los mismos dos pasos empleados para N. Asimismo, siZ=0 implica que M tampoco es cero, y por lo tanto se puede seguir con el lazo para realizar las N suas. Sise eserbs con el Debug JZ BETA (con salto hacia adelante), el nomero con la direccion que va en vez de BETA no se ‘onoee, pues'ain no se ha escito MOY” (8320), AX’ can esa dieceldn (a diferencia de un salto hacia atris, donde esa icon se ve en panalla). Enel uso del Debug que acompana aleercicio 13 se indica cémo proceder en esos casos. EJERCICIOS: eémo cambiaria el ejercicio 3 sise usara JZ en vez de JNZ. lector puede preguntarse qué ocuriia sien lugar de poner la condicin qu hhubiese puesto que Z: En se caso (diagrama de la figura 3.12), se saltaria cuando sea CX = 0, pues recign entonees seria Z=1, y se pasaria ecu Ia eeuencia que empieza con [B320/1] AX, a ln que sigue el fin de secuencia Hasta que no sea Z=I. cada ver (ue se le resta uno a CX_y mientras no sea CX = 0 (o sea Z=0), no se salta, sino que se contin con la insiruccian Stuinte que en este caso es de salto incondicional Gump en el diagrama logico de la figura 3.12) hacia lain AX€ AX BX. Asi se vuelvea arma un lazo como en Ia figura 3.6 U3-10 M.Ginzburg ~ Assembler desde Cero Esto es, puesto que el rombo que repress sn alto condicional, so sdosus vériees laterales:v siendo que su vértiee inferior est lieado necesariaments a la continsacién de la secwencia, éta ‘se comtinda con una insiuceién que ordena saltarincondicionalmente, “si o si, a otra instrueci6n, En la figura 3.12 el salto condicional no se realiza sobre la misma secuencia, como en la fig. 3.6, sino que se salta @ otra ‘eeuencia, compuesta por dos instrucciones. Con el comando A 0130 del Debug esta secuencia en Ia fig. 3.13 se escribe pare. a patie de Ia diroccién 0130, elogidaarbitrariamente, pero que no supera el valor limite permitido para un salto. Por le tanto, el “precio” de elegir el valor conirario de un fag, es una destructurseion del diagrama légico, por la icin de una secuencia nuova, innecesaria con i consiguiente complicacin de Ia codificacién con e] Debug. indo se ellge [a condicidn de saliov aparece IMP. se dehe probar qué pasa sis elive la condicion conan HI A 0100 Lex [esto | xxxx:0100 MOV CX, (8310) xxxxi0l0d MOV BX, [B30] {_ BX — [8300/01] xxxxi0108 SUB AX, AX ——— XxxXO10A ADD AX, BX. xxxxOl0C DEC CX xxxxOl0D JZ 0130 xxxxO10P—-JMPI0A A 0130 xxsxi0130 MOV [B320}, AX sxxxi0133,INT20 Figura3.13 (cx=0) [8320/21] AX Figura 3.12 ® GENERALIZACION: Insirucciones de salto condicional: En los ejercicios anteriores hemos ejemplificado el uso de este tipo de instruccianes, sin las cuales no se podria repetir awtomiticomente sin intervencién humana a veces una secuencia, ni pasar automticamente de una seeuencia a or 1 detectar si se superd un formato de representacién de datos, Una insiraccién de este tipo en eseneia permite, en funcidn del valor de los las gen scion que hizo la UAL, que la méquina, después de gjecutae esta insiriceién, pueda seguir [a ejecucién con una ente sivas: 1) situno o mls flags tienen el valor planteado en la instrueién (condicién para que ocurra el salto), Ia UC sigue con la sjecucién de la insiruccion a la que se ondenasaltar (euya dieceiGn permite determinar la instruccién de salto) 2) si uno o mis Nags no tienen el valor por el que preguna la instuccién, la UC continia con Is instruceidn que sigue e ‘memoria gla insirucsin de salto (como ocurre ea las instrueciones que no son de salto condicionado), [Una instruceidn de salto so pregunta por los valores de los flags, pero no los modifica, pues en ella Ia UAL no opera La decision de saltar al comienzo de otra secuencia © de continvar eon la secuencia que se venia ejecutando, como wna alternativa entre das camines posibles, no depende de la UC (que no tiene intelivencia alguna para devi nada), sino {que depende que el resultado anterior que generd la UAL sea 0 no cero, sea 0 no positiva, sea © no representable en un fomato dado, etc, resultado que se sintatiza en el valor de los lags que también genera la UAL. Es el programador quién «stablece,alelegr Ia eondicida presente en wna instrucein de salto, en qué condiciones se va.a produeir (0 no) et salto. Estas instruceiones primero prevunian por el valor de los flags presenies en a condicion de salto, y so siesta condicién se cumple, ordenn saltar ala instrucesbn cuya direceinellas permiten determinar. Una instruceién de salto condiefoualvélo difiere de otra en la condién establecida para sata Codificacién y ejecucién de una instruccidn de salto que tipeada luego de A 0100 es xxxx = 0100 JNZOL12 -1 Codifcacidn: como desctibimos anteriormente, lucgo de tipear ~ el roi 3 de] Debug reemplaza los caracterestipezdos que quedaron codifieadas eo ASCII a partir de D100 por el ebdigo de miquina de INZ. 112, que es (011 10101 00010400 = 75 10 h,codifieasisn que puede verifiearse si se tipea el comando U 0100. 78.s el cédigo de operacién correspondiente a INZ, y cl 10 que lo acompaia es Ia diferencia 0112 ~ 0102 = 10, o sea la ireccién (0112) dénde se ordena saltar si se cumple que Z=0 menos la direccién (0102) de la instruccién que sigue a {INZ, que es la instrueeién que se ejecuta luego de Ia instruccin de salto si direceiones 0100 y 0101), Ginzburg ~ Assembler desde Cero U3-1L Ejecucién: cuando la UC pide de memoria Ia instruccién 7510, el registro IP (Instruction Pointe) tiene el valor 0100, Durante Ia ejecucion de 7510 primarm se ordena sumar 2 al IP, pucs 7510 ocupa 2 bytes. Con IP = 0102 el IP apunta le slireccion de la insttucei6n que sigu: a 7510 por si Z=0. Luega 75 ordena leer el valor de Z. $i Z=0 al IP st le sua 10, ‘0sea IP = 0102 + 10 = 0112 (dircecién de saltoy;y si Z=1 no se hace nada, con lo cual el IP permancee en 102, Dado que 0112 se obtiene sumando 10 al valor 0102 que tiene el IP, el O12 esté en retacién, es relativo al valor del IP Por tal motivo se dice que las insrucciones de salto condicional estan en modo de direccionamiento relative, y todas las reciones de esa case se ejeeutan dela misma manera ilustrada para JNZ. y todas ocupan 2 bytes de memoria, EI modo relative no requiere que Ia direceiGn 0112 forme parte de Ia instrceién, lo cual implicara que Ta instacclow ocuparia 3 bytes, y en general el Lamato de ella dependeria del nimero de bits que tienen las ditecciones de memoria Asimismo, siempre se deberia saltara 0112, con_lo cual los programas no se podrinn cambiar de gar en memoria ET nimero (T0h = 99010000) que seompana al cOdigo de operacion (75 para JNZ) ocupa un byte y puede ser poslivo (empieza con 0 como en este ejempio) para saltar hacia delante, © negative si se salta hacia as (coma en el ejereicio 2), Segin se vié en Ia Unidad 1 de est: obra, un némero binario entero de un byte tiene los valores extremos +127 -128, que serin cl nimero maximo de posiciones de memoria que se puede saltr hacia delante yatris (1Fy_ 80 en hexa), se tiene presente ios limites citados, el traduetor ensamblador del Debug no aceptari a instruccion de cal, Por ejemplo, si se eodifien 0500 JNZ 0600, la diferencia de casi 100 posiciones entre 600 y 300 en hexa (0 sea 256 on ‘ecimal)supera el valor maximo +127, por lo que en este caso JNZ. 0600 no seri aceplada por el ensamblador del Debug Insiruceiin de salto condicional que sigue a una de resta para determinar si minuendo >< sustraendo 1) PARA NUMEROS ENTEROS (POSITIVOS 0 NEGATIVOS) Cuando en un papel restamos dos n(meros gnteros A ~B, sabemos que sie s A Brysies negative (S=1) es A B 8 A B; y si C=! se“pediria 1 prestado” en dicha rsta lo cual implica que A JAE sop 2a sit samp iors at damp Abr ok crea JRE, dnp ites aNz. Por ejemplo (Figura cenital superior il hacer A ~ B resulta C=D implica queen esa resta de naturales se pid "0 pesiado” por lo que ‘AS B.y'siadeids Z=0 implica quel resultado noes coo, 0 Sea qus no puede ser A = B (lo eual acura si C=O y Z=1). or o que en efinitvaes A>. Sial hacer A~B resulta Ca implica guc en esa rest se pidid "I prestade, por lo que A its vy isto M.Ginaburg~ Assembler desée Coro 3-13 AX TRDOOAT Jaxesore P= POTOT | yco070 TE nn aa... oronti—ax | (ont ae aio ax S44 —_ Ax (2002/81 |axere27 ‘AX 12002/8) Jaxatrar mo <=>" Se 5 [WT rcs a8 per Sa PERT DOR © © @ UAL luego de AX € AX + [2008/9] y que no cambia luego del paso [2010/11] € AX, en el cual Ia UAL no opera), (como ocurrrfa con estos valores de M y N), mediante AX € I se debe pont cn uno AX (“pisando” a 2B2C resultado del paso AX € AX + [2008/9)) Luego se debe saltarincondicionalmente al paso AX < AX + [2002/3] que en este caso seria AX € 1+ FFD7=FFDS, para sumar el uno de acarreo de la posiién en grisado de la sua binata citada SiC#0 se debe poner AX en cero, mediante AX € 0, luego de lo eual ahora Seria AX < AX + [2002/3] = 0 + [2002/3] Sigue AX € AX + [2009/A] para suntar al registro AX los 16 bits superiores de N, y luego [2012/13] © AX para alma- ‘enar el resultado de esta suma (0009 en este caso) en 2012/13. Estos dos pasos seri comunes a las 3 soluciones, La coditicacién correspondiente al diagrama lopico de fa figura 3.17 resulta: CCodifearemos en Assembler I secuencia correspondiente alos pasos del diagrama, con les siguientes instrueciones: MOV AX, [2000] Llevara AX una copia del dato que esti en memoria en 2000 y 2001 ADD AX, [2008] ‘Sumar a AX una copia del dato que esti en memoria en 2008 y 2009 ‘MOV [2010), AX ‘Transferir 2010 y 2011 de memoria una copia del contenido de AX JC ALFA Si Cet saltara la instruecion que esti en ALFA MOV AX, 0 ‘i C=0 poner en cera el rogistto AX SUMA ADD AX, [2002], ‘Sumar al valor (1 60) de AX una copia del dato que esté en 2002 y 2003 ADD AX, [200A] Sumar a AX copia del dato que esié en 200A y 2008 MOY [2012], AX Transferira2012 y 2013 de memaria una copia dl contenida de AX INT 20 Finalizar ALFA MOV AX, 1 Como es C=1, poner en uno el registro AX IMP SUMA, Saltarincondicionalmente a la instruecién que esta en SUMA, Soluci6n by: conforme a la figura 3.17.b, luego de [2010/11] AX sigue AX (2002f para llevar hacia AX una copia de lamitad superior de M (para ests datos FFD7)“pisando” la suma parcial anterior existent en AX (2B2C). Como este ‘is. como el anterior ([2010/:1] AX) tampoco cambia el valor de flag C, pues en él no interviene la UAL, se pregun- paso siguiente por el valor de C._$i C=0 no se suma uno al valor de AX, se “puentea” este paso, y se sala alos limos pasos de de Ia solacidn a). Si C=1 (0 sca si no se cumple la condicién =0) se debe sumar uno (de acarreo a la segunda mitad de la suma) a AX con cl paso AX € AX + I (en este caso FFD7 + 1). Luego siguen los dos sltimos pasos de la solucin a), Las instrucciones que se corresponden con los pasos del diagrama de Ia figura 3.17.b son: MOV AX, (2000) LLlevar a AX una copia del dato que esti en memoria en 2000 y 2001 ADD AX, [2008], ‘Sumar a AX una copia del dato que esti en memoria en 2008 y 2009 MOV [2010), AX Transferira 2010 y 2011 de memoria una copia del contenido de AX MOV AX, [2002] Llevara AX una copia del dato que estd en memoria en 2002 y 2003, JNC SUMA ‘Si C=O saltar a la instruceida que esti en SUMA, XI SiC+I sumar uno al registro AX x; [200A] Sumar al valor de AX tina copia del dato que esté en 200A y 2008, MOY [2012), AX Transferir 2012 y 2013 de memoria una copia del contenido de AX INT20 Finalizar ‘Variante menos efectiva de Is solueton b) segin el diggrama lbgico dela iguea 3.17.6) Veremos cémo se modifica la solucién b) si en el rombo se plantea C=1 en vez de C=0 como aparece en Ia figura 3.178) Entonces si C=I se debe saltar a otra szeuencia con el paso AX € AX + seguido por un salto incondicional a AX € AX + [2009/A\, suma que sigue al rombo si C0.

You might also like