You are on page 1of 92
ASSEMBLER DESDE CERO é INTERRUPCIONES MARIO CARLOS GINZBURG INGENIERO ELECTRONICO (UBA) EX DIRECTOR DE LA CATEDRA DE “ESTRUCTURA DEL COMPUTADOR” E INVESTIGADOR EN LA FACULTAD DE INGENTERIA DE LA UNIVERSIDAD D5 BUENOS AIRES INDICE UTILIZACION DEL LENGUAJE ASSEMBLER REGISTROS DE LA UCP A UTILIZAR eductorio ‘so de una instrucein de sltocondsional conditional jump) JNZ jecicio2 mejorado usando JO (Jump if overflow), constantes, IMP y etiquelas FJERCICIO. EJERCICIOS: cémo cambiarin el cetcicio 3sise usora JZ. GENERALIZACION: perfeccionamiento del ejersiio 2 ado en cuenta que M6 pueden vate cero enverde JNZ. struceones de salto condicional: BJERCICIO 6: suma de2 niimeros de 32 bits mediante Is UAL de 16 bis (3 soluciones) ERCICIO 7: lectura y eseriturn de una sueesin de datos conscentivas e EJERCICIO 8: sumar ls clementos de uns lista (vector) moria (sta 0 vestor) EFERCICIO 9: boisqueda en lista usando la nstrucchin comparacién (reste sin asignacién de resultado) EJERCICIO 10. basado en el eercsio By en un paso del EJERCICIO| EJERCICIO 12: neontear el mayor de una Hts de otra variante da ejercicio 09 ntuales usando JA (Jump if above) EJERCICIO 13: diagram l6gco con rombos consecuivosyefecucn del programa com el Debug FORMA DE COPIAR UNA PANTALLA DEL DEBUG EN EL WORD. EJERCICIO 14 eederar alfabitcamcnte2 Histas cuya cana de caractores noes un dat testo EJERCICIO 1S. validacién de enracterss de une lista enya eantida no es un dao directo EFERCICIO 16 intercambio de elementos entre dos Uistas,y variante con nhorro de wn punter@ EJERCICIO 17 redondeo de niimeros von parte entern (de longitu mo imitada) yfracelonaria (an digo) EJERCICIO 18 téenicas para repetir ono a ejccucin de scuencis mediante ind EJERCICIOS 19 A 25 ojercicios varios con eambios internas en los elementos de veetores ESERCICIO 2S 2 28: clerecios eon tradueciones de sentencias IF y FOR a bajo nivel (CONSIDERACIONES GENERALES PARA PROGRAMAR EN ASSEMBLER EJERCICIOS PARA REALIZAR, EJERCICIOS 30 y31: uso de SBE (ump if below ar equal) EXERCICIO 32: uso det instrucetin JPE (lamp if pa EIERCICION ord EJERCICIOS VARIOS CON OPERACIONES ARITMETICAS DIRECCIONES EFECTIVAS ¥ REGISTROS: LLAMADO A SUBRUTINAS INTERRUPCIONES POR SOFTWARE EJERCICIOS BASICOS CON INSTRUCCIONES INT21 INTERRUPCIONES POR EJERCICIO INTEGRADOR DE SUBRUTINAS E INTERRUPCIONES, MANEJO DEL PORT PARALELO INEMONICOS DE LAS INSTRUCCKONES MAS USADAS. seven ~Saltarsila siento de wna sta por burbujeo |ARDWARE at 4039 39040 a “4 4s 46 46 arash st n ” 80 Ps 5 di 88 ourg ~ Assembler desde Cera 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 “ensamblador”) es el programa iraductor de assembly a cédigo de mxaquina, por lo que lengaje sembly puede traducirse como lenguaje “ensamblable”o lenguaje para ensamblador. Siguiendo la costumbre, sepuire= ‘mos mando Assembler a leneuaje simbélico de maquina, y ensamblador al progranya tractor citado, Recordemos (Historia de la Computaci6n, Unidad 1) que Assembler fue el primer lenguaje que usd simbolosalfabaticos, Pennitié usi escribir programas con letras desde el teelado de un computador (snlida eédiga ASCID), lo eual suponia la esistencia de un programa tractor ensambladar, para pasa los simbolos eadifieados en ASCI a eddigo de miquina. Coda modelo de procesador tiene su correspondiente Jenguaje assembler, y su ensamblador. Por lo general, los nuevos todos de un misino fabricante conservan instrucciones en Assembler de modelos anteriores. Asi, on Pentium tiene en su repertario, por razanes de campatibilisad,insiriciones en Assembler del 80286. Si bien eada fabricante de microprocesadores define notaciones y aspectos particulars para simbolizar instueciones en assembler, con un poco de prictica no resulta difiell para quicn sabe programar un determisade assembler, pasar 2 oir, Dado que la mayoria de las PC usa procesadores de Intel 0 AMD, y que desde una PC se puede programa eémadamente ten Assembler, desacrollaremas el Assembler de Intel coro Lenguaje representative, En el presente, se programa en Assembler para cistitas aplicaciones. Lo més corrieme quizs sea programar porciones dé un programa que necesitan ser cjecutadas en corto tiempo, siendo que la mayor parte del programa se desarrolla con snguaje de alto nivel (C, Prscal, Basi, ete), Esto se debe a que un Compilador para CISC (Unidad 1} al pasar de alto 1 eddigo de miquina genera eddigo en excese, en comparucién con ef obtenido a partir de assembler, 10 eval redunda en mayores tiempos de ejecucién de porciones de programa cuya tiempo de elecuetin es critica, Como ccontrapartida, en general leva mis tiempo programar en assembler que en alta nivel, También suole usarse el assembler para desarrollar manejadares de peririens,y para controlar direcamente el hardware daa la exibilidad de este Yenguaje, que permite mangjar recursos eo general no accesible a lenguajes dealt nivel El lenguaje Assembler, por ot parte. es una herramientaimprescindible para deminar a fondo ef fun ‘computador (wsualizar movimizntos temas que deben tener hugar), y para saeats el mximo provecto. REGISTROS DE LA UCP A UTILIZAR REGISTROS ACUMULADORES REGISTROS PARA DIRECCIONES ___ sits Bits aX AH SI BX BH a Bx ox cH ia Ct DI x BX. ES EI UNICO REGISTRO QUE PUEDE USARSE Dx DH poe oe: COMO ACUMULADOR 0 BIEN COMO PUNTERO. [BP PUEDE USARSE COMO PUNTERO EN COM Figura 3.1 En las unidades 1 y 2 se actaron distinios ejemplos que empleaban el registro AX, de 16 bits, de 1a UCP como acunulador, y para operaciones de entrada y salida, Ese registro tamibign es indispensable usarlo cuando se multipliea 0 divide, segin se verd. Pero en Ia UCP existen otras rogisiros de 16 bits que pueden elegirse indistintamente como seumnuladores, como BX, CX. y DX (figura 31). Tambign se dispone en la LICE de los rogisros SI'y DI para euardar exclosivament de memoria (registro puntos), como se ejernplifiea a partir del ejercicio 7 BXesel dnieo ncamulador que también puede ullizarse eomo regisira puntero (ejemplificado en el ejereieio 13), Et repisto IP {inseuction pointer) es nfectado por las intrueciones de sito Gump). Si se necesita eperar datos de & bits, los regisios de 16 bits: AX. BX, CX o DX (o sea los teminados en X), pueden Aiviirseen dos reistros de 8 bits. Por ejemplo, AX scdescomponc en AMI y AL; BX en BH y BL, cle [Las letras H (de high’), y L (de “low acon referencia ala parte ala y baja de un repistro de 16 bit direcsiones que apunten a posicionss Us. MGinzburg - Assembler desde Cero ntonces, en assembler, cuando se necesita definir un registro parm datos 0 resultados de 16 bits, e Tetra terminada en X; y en ens0 de set necesario emplear un regis para datos resultados de 8 bts se usar ua mitad del mismo, la cual se identfiearé por ser su segunda letra una Ho una L, segin se eli En los procesadores 386, 486 y Pentium, los fegistrascitados pueden tener 32 bits, indicindose EAX, EBX. EIP. La etn E hace referencia a “extended. Dichos repstros también pueden elegtse para auardar 16 u8 bits, simbologia antes definids, El Debug sélo permite deftnir registros de 16 u 8 bits. EI siguiente ejercicio basico, analizado y realizado directemente en cédigo de miquina, sin usar Assembler fen le Unidad I de esta obra, muestra los pasos necesarios que se deben tener presente en los restantes ejer cios que se planteardn. Asimismo eonviene 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 lenguae de alto nivel sete Codifearla en lenguaje Assembler ‘ycémo podeia tracucela un pro la semtencia R = P + P—Q para operar nimerus enteros (variable “Inegers") To cual tambidn servi para poner en evideneia edmo se conereta a nivel de nt Lrductor tipo Compilador cuando sealiza ta raducei a) Cualguier secueneia de instrucciones a desorrollar operant mimeros (valores de las variables) que esiarin en memoria principal, por lo. que primero siempre deven clegiess dieeciones de memoria arbinariae dénde se neventran ls valores de [as varinbles (R, Py Q). Como se vera esa cleccisn arbiraria se utiliza luego cn Ia eadificn S En lo que sigue, supondremas que las variables tipn “Intescrs” ocupan 2 cele das eonseculivus de memoria, salvo que se indique otra cosa. Asignaremos (fig 2)a R, Py Q hs ditecciones 5010/1 1,5000/1 y $006/7 respectivamente. ‘No interesa en esta elapa el valar de PG Q. pues los programas se desarrallan para valores eualesquisra dels variables, dentro de cies limites 1b) La figura 3.2 también sirve para plantear la secuencia de los movimien- tos y operaciones que deben ordenar las insteuceiones a codifica, para i He- vido cabo en orden los pasos necesarios para coneretar la suma algebraiea que ordena la sontencia R = P + P — Q teniendo presente que dichos movie tientos y operaciones son los que puede efvetuar ipieamente un computador. Estos bltimos, como se planted en a Unidad Ids esta obra, pueden compren= dderse conceptvalnente en relacidn con Jo que puede hacer una. simple < sustraendo 1) FARA NUMEROS ENTEROS (POSITIVOS 0 NEGATIVOS) Cuando en un pape! restanis dos nimeros enteros A ~B, sabemos qu s el signo del resultado es positive (lag ‘A 2 By sies ncgativo (S=1) es A Bd A Si SI y Y=0 estibien que sea $1 y por lo tanto se dedhuce que A < yes por haber sido V=0. Inidad 1 de esta obra, 1 de los fags S y V permite detsrminar Si $+0 y Val debi haber sido S1_y por lo tanto se dedace que A Si SI y V=1 debi haber sido S-0 y por tanto se dedace que A De os easos anteriores resulin que (Si SyV tienen igual valor (SV )osA B By yal SyV Wnen diaino valor SAV J.raula A=. 1 {utente pa debe hacerse antss A para conocer Z lenido de CX era igual 0 n0 & cero, para lo cual antes de JZ. que pregunta por aa vee si el eon valor del flag Z, se hizo la resta CX'~0. ‘A continuacién se tratan todos los casos posibles pata saber como es A respecto de B, siendo A y Benteros, - Ds aw, - sox Gap senp if Zoo Sump iC Greter Jump if Greater L * ocaemy Senate ggpenote Ce yrene wie cota) aL * (48), a ENDS sm, Dai eaS aap temittn SG 0) a Staton) Fgura 3.5 sios diagramas también sicven de wecordatorio que si no se cumple Ta condiciOn plantead, jempre debajo del rombo debe seguir otra instruceidn, o sea que no se puede sata. Esto tito solo es posible s a siguiente es IMP (ejreicio 3) Si bion cuando se ejecuta una insirccién de salto condicional ka UC lee en el registro de estado el valor de uno 8 varios fags, en Assembler la condicién puede establecerse con dos o tres letras fciles de recordar (ya hemos usad 12, INZ 10), para preguntar si un ndimero es mayor, igual, © menor que oo, como sparecen a lado de los rombas en In fig 3.85, 312 M.Ginaburg - Assembler desde Cero Eno permite desentenderse de los flags, especialmente sila comibinacion de flags es compleja, y es futible poder eodif- car una instraccién de salt de dos o ms maneras (yer meu ques al final de esta ob Por ejemplo, la instruceisn 12, Gump if Z=1) used en el sjercicio 4 es equivalente a JE (Jump if equal) ss piensa en la instrucida anterior de res, pues sie resultado de ésta es cero (Z=1), implica que los némeros restadas son iguales, 2) PARA NUMEROS NATURALES [Estas nimeros son usados pera cusnlificar magnitudes (ites, metros, ..) @ para codificar earacteresen ASCH, ete comparien con Ios entros el ag Z en las insueciones 12 v INZ, pues el cero se codilica igual para enteros o naturales. Con los naturales no se pueden usar los flags S y V, usados para enteros, so pena de resultados con errores inadmisibles. El iinica Dae que os propio de nimeros naturales es el ‘Su significado para una resta A ~B de naturales con n bits, tes-que i C=O se “pediria 0 presindo” si In resta contiquarfa con n+ bits, lo cual implica que A B: y si C=1 se “pediria 1 prestado” en dicha resta, fo cual implica que A B. Sia hacer A~B essa C1 implica gus cn esa esta se pido" prestado, prio que A its SUMA ADD AX, {2002} Suma al valor (1 60) de AX ura copia del dato que est en 202 y 2003, s. ‘ADD AX, 200A) Sumara AX eopia de dato que esti en 200A y 2008 ¥ Mov (202), Ax cansferr a 2012 y 2013 de memoria unw copia del contenido de AX La INT 25 Finaliza ALFA MOV AX,1 Como es C-1, poner en uno el registro AX IMP SUMA Salar incondicionalmente a a insewceién que est. ex SUMA r Solucii bp: conforme a ta figura 3.17b, luego de [2010/11] CAN sigue AX € (2002f para llevar hacia AX una copia dela mild superior de M (par estos dates FFD?) “pisaado” la sua parcial anterior exstente en AX @2B2C). Como exe J pasa, como cl anerior((2010/I1] AX) sampaca cambia el valor dl flag C. pues en é no interviene la UAL, se pregune ac MOV AX, [2000] Levar a AX una copia del dato que esti en memoria en 2000 y 2601 ADD AX, [2008] Sumar AX una copia del dato que esti ea memoria en 2008 ¥ 2009 MOV 2010), AX Transfer a 2010 y 2011 de memoria una eopia dsl contenido de AX R MOV AX, [2002] Llevar a AX una sopia del dato que est ea memoria en 2002 y 2003 j JING SUMA| C=O salar aa insruceibn qu est en SUMA ADD AX, 1 Si C=I simar ano al registro AX este SUMA ADD AX, [200A] Sumaral valor de AX una copia del dato que esti en 200A y 2008 iala ‘MOV (2012), AX Transferra 2012 2013 de memeria una copia de} contenido de AX INT 20 Binalzar ‘ies Variante menos efeciva dels solucin b) segtin cl dingrama Iopico des figura 3.17.¢6) as Yeremos eémo se modifica Ie solucidn b) sien cl ormbo se plantea C=1 en vez de C=0 como aparece en la figura nS 3.1746). Entoness si C=I so debe salar a gla seeuencia con el paso AX € AX +1, soguido por un salto incondiconal a in ‘AX € AX + [2009/A\}, sua que sigue al rombo si u3-14 M.Ginzburg ~ Assembler desde Cem MOV AX, (2000) LLlevar 8 AX una copia del dato que estd en memoria en 2000 y 2001, ADD AX, [2008] Sunvar 8 AX una copia dot dato que esti en memoria en 2008 y 2009 ‘MOV (2010), AX Transferie a 2010 y 2011 de memoria una copia del contenide de AX MOV AX, [2002] Lievar 8 AX una copia del dato que esté en memoria en 2002 y 2003 JC ALFA SI.C=) salar ala instruccidn que esti en SUMA SUMA ADD AX, 200A] Si.C-0 sumar al valor de AX una copia del dato que est en 200 y 2008 MOF (2012), AN Transfer a 2012 y 2013 de memoria una copia del contenido de AX INT20 Finalizar ALFA ADD AX,1 sumar uno al registro AX IMP SUMA, Salta incondicionalment ala inst da que esti en SUMA, Rewlia T quc e1 hecho de haber elezido en un rombo como condeiin de salto la eonirara a Ta de In solucion 5) Tajo aparejado la spericién de una nueva secuencia y ur. salto incondicional, Por lo tanto, si kisag de elesir una condicidn de salto aparoce una nueva secuencia que (ermina en un salto iacondicional hacia Ja pone inferior de dicho rombo, esta seuencia puede eviarse si se carabia en el rambo a lx eoadicion eonuaria, eon lo cual como gn In Solucién b) los pasos ju estaban en la secuenicia nueva pasit& una seeuetieia niga. y se aprovechi i insimuecion de salto para evitar IMP, ‘Soluctén e): no emplea instructi6n de salto, Las 4 primeras instrucciones son las mismas que las de la soluei6n b), pero no se pregunta por el valor del flag C, dado que la instruccion. ADC (“Add with Carey") ws Uistinta de ADD, pues ordena sumar a AX el cootenido de dos posiciones consecutivas de memoria (200A. y 2008) mas el imo valor que tenfae} ‘ay C antes de ejecutar Ia inslruceién,o sea que aulomlicamente ineozpora sta suma el valor 06 1 del diche acarres. MOV AX, [2000] levar a AX una copia del dato que esti en memoria en 2008 y 2001 ADD AX, [2008), mar a. AX una copia del dato que est en menvoria en 2008 ¥ 2009 MOV [2010), AX “Transferir a 2010 y 2011 de memoria wna copia del contenido de AX MOV AX, [2002] LLlevara AX una copia del dato gue est en memoria en 2002 y 2003 ADC AX, [200A] ‘Sumar a AX copia del dato que esti en 200A y 2008 nis Carry anterior MOF (2012), AN Tronsferira 2012 y 2013 de memoria una copia del contemsdo de AX INT 20 Con cualquiera dle las solucioncs planteadas se duplica por software el formalo eon que opera wna UAL de 16 bits (hardware) en una sursa mulibyte {CICIO 7: Lectura y eseritura de una sucesién de datos consecutivos en memoria (lista 0 vector) En memoria se tiene un vector conformado por una lista de n elementos Ni, N2, Ns... Na, que son niimeros de 2 bytes cada uno ordenados sucesivamente en posiciones consecutivas de memoria. La lista (figura 3.18) comienza en la direecién 1000, siendo que en 1300 se da la cantidad n de elementos dela lista. Esta cant todas los ejercicios se asumiri siempre mayor que uno, para evitar su veriicasion oon la metodologis de ejercicio Se pide copiar la lista a patti de Ia direccion 2000, a figura 3.18 indica (para N1) Jos dos movimientos que permiten pasar cada elemento de una lista ala otra, usando AX rmediatio. Se han dibujado las dos lisias a a par, siendo que en memoria estin una ébaj de otra. Con las instruceiones que eonoeemes hasia ahora, por un lado no existeninstraceiones core MOV [2000], (1000] para el pasaje de una copia de N) hacia la ctea lista, Para tal fin (figura 3.18) primero se debe pasar una copia de NI hacia AX, tusando MOV AX, {1000}: y luego una copia de AX hacia 2000/1, mediante MOV [2000], AX. Por otra parte, si con esas instrucciones eodiieacamias Ios pasos para pasa los n eleinentos que estén en memoria en te primer lista hacia la otra se tendria que escribir n veves cada par dc instrucciones MOV: Una copia le Nt que esti en 1000/1 pasa a AX. MOY [2000], AX Una copia de Ni qus.esté en AX pasa a 2000/1 (primer par de instrucciones MOV) MOV AX, [1002] Una copia de N2 que esté en 1002/3 passa AX MOV [2002], AX Una copiade N2 que estien AX pasa 2002/3 (Segundo par de instrucciones MOV) MOV AX, II. MoV [2. Una copia cle Na que estien 1... pasa AX ‘Una copia de Na queestien AX pasa a2 {enésimo par de insteuecionss MOV) ef eorchete de cada instuccién MOV AX, [hi] hay wn niimero de valor fja (Uh, que es Ini dde memoria, Lo mismo en MOV [Zhhhi}, AX. Este nimero forma parte de la instrucsion, Ast, el cd MOV AX, [1000] en hexs es: A1 0010 (0010 codifica a 1000). Con el fir. de evitar coma en este caso repetir n veces In escritura de instrucciones, para localizar datos que estin ea ivas de memoria so usan Ios reeisiros SI. DT y BX definidos en fs figural sistas SI ("source indexation") y DI (“destination indexation”) son los gue se cligen en primer lugar eomo punte= 1s, y Come BX lambign puede usurse como acumulador, conviene utilizaro sélo en ol caso que haya (es lista a puntear én de wea celda 9 de méquina de MGinzbure Assombler desde Cero 3-15 orrespondencia coa el uso de estos reisirs para direccionarceldas de memoria, exisien instruceZones para poner anise corcietes el nombre del registro que proveet la direccidn de memoria a aeeeder, camo ser MOV AX, [SII Coma siempze tos corcketes sinbolizaa memoria, y la direeeién a accede es el valoz que en este caso tiene $1 MOV AX, [SI] ordona pasar 9 AX una copia del nimere contenido en fa cella euya direeciin indies (aputa) ene cor hates el registro SL y tambigr una copia del ndmero contenido en la eel sigente, pues el registto AX es de 16 bi Si al registro $1 se le da el valor inicial 1000 mediante la instreeién en modo inmediata MOV St, 1000, rsuliaré ‘SI=1000; y si después se ejecuta MOV AX, [SI], seri equivalentea sjecular MOV AX, [1000], para que N1 pase'a AX. Dado que el elemento siguiente a pasar esi en 1002, este valor se halla surnando 2 a $I (SI-€SI+42.~ 1000 § 2 = 1002), 18s ndexando en 21 SI se pueden determinar ls dnecciones (1004, 1006, ...), de los siguientes elementos a pase, ‘Ahora sé se vuelve a ejecutar MOV AX, [SI], seri equivaleate a ejecutar MOV AX, [1002], como se neorsta eualmente, si a DI se le da el valor inicial 2000 mediante MOV DI, 2000, las suces Seeidas de sumarls 2 a DI, son cquivalentes a MOV [2000], AX ; MOV [2002]. AX : MOV [2004], AX , ete. Entonces, si cepeidamente se eecutan n veces 4 instrucciones: MOV AX, [SI] y MOY [DI], AX scguidas por el par de sums ADD SI, 2 y ADD DI, 2, se habrin copiado todas los elementos de una lista en la otra Pare ograr la repetiién de esos 4 pasos, en cl diagrama logico deta Figura 3.18 que luego desastollaremos se arms un loan semgjente al de la figura 3.6. is eleeuciones de MOV [DI], AX izando, hasta ahora hemos usado los registros AX, BX, CX, DX para cootener va este eerciclousaremas SI, DI y BX para contener nimeros que son dizceviones de datos o resultados. Las regis- ‘ros, al fgual que a, se corresponden con variables, cuyo valores el eantenida de los mismo Las instrucciones del tipo ADD AX, [St]; MOV AX, [BX]; MOV [Dl], AX; ete, correspondeo all modo de direc- elonamiento indirecto por registro, Esto es, ln dineecin de una celda de memoria se da indirectamente a teawes de un isto, como SI, DI, o BX, que soi los nicas reisiras que pueden aparecer entre corchetes, Estos renistros sen indexados gan insirucciones, a diferencia del IP qus es aetualizade autumitieamente por Ia UC. as insiruceiones en modo inlirecto por registro permiten recarvar uno tras ofro « dates contenidos on postevones scesivas dle mennoria, como esl caso le una liste 9 vector. i @| cu -— 11500) |, : Re O-- XL Fen e- C14 veces & CHS] zea sia) 0 SZE2-+iea Fin lores de dates o resuludos, ya |_ ax — 18h iB == AK (Se deben ejecutar Sf 4 1 dos instrucciones. &) | MOV nveces | hasta que CL=0 $f ®) sl — si42 1 Sl 1000 te a Di+2 \\too2 1 @_o— o- TJetant (Cleo) 71ST (C10) it 1800 Figura 3.18 El iagransa dela igura 3.18 ene la misma concepeién que de la figura 3.6 para repetir un proceslimientay se basa en squema que lo aeompaia En este caso en cada vuelta (cielo) del laze se copia un nuevo elemento de una lista ofr, En el primer paso G1) deta iniciaizicidn, en el esquema y en el diggrama ldgico se elgié ordenar que wna copia del agmero n que esta en 1500 pase a los & bits de CL (mitad inferior dz CX que puede eontener hasia HN1I1111 = 253), Esta asigngcign del nimero a jen cn elercicios siguientes. por si hace falta usar CH. es el numero de veces que se repetra el lazo. Siguen los pasos 2 y 3 con la asignacidn de los valores 1000 a SI, ¥ 2000 a DI. El procedimienta (14, 15,16 c17)son los 4 pasos antes plamteades. Comienza con I, que en el prime eiclo ordena que una copia de NI, que es en 1000/1, pase a AX. En este ciclo el paso 5 luego ordena que Ni pase de AX hacia 2000/1 U3-16 ig Assembler desde Cero LLuego de los pasos 6 y 7 Jos registros SI y DI quedan apuntando a 1002 y 2002 direcciones necesarins para copia a N2 Con DI € Di'+2 termina e) procedimiento a reper, y om en el gjeeciea 2 se resta uno al contador tegeesive de cicios (CL € CL~ 1), y se pregunta al final de cada cielo si Z=0 o sea si CL20. De ser asi se vuelve a repeti el eilo para gue el elemento siguiente se copie de un lista ala ova. En caso de ser Z=1 (CL=O) se finaliza el programa Esia forma de repetrciolos para operar elementos de una lista serd sada en Tos ele cos que sen ete tpodededos | ‘Com direcci6m inicial de la lista y la cantidad m de elemenios son datos, no haee flia dar la direce6n-Gnalde fa misma, A continuacién se dan las instrucciones correspondientes al MOV CL, [1500] MOV SI, 1000 MOV DI, 2000 OTRO MOV AX, [SI] MOY [DI], AX ADD SI, 2 ADD DI, 2 DECCL JNZ OTRO INT 20 iagrama l6gico dela figura 3.18, Llevar a CL una copia den que esté en 1500. evar Stl valor 1000. LLievara DI el valor 2000, [Lievar hacia AX una eopia de un nimero de 2 bytes dela liste apuntado por SI LLievar hucia la direceién apuntada por DI el aimero de 2 bytes contenido en AX. Samar? al contenido de Sh Samur? al contenido de D, Restare uno s CL para que cambien los fags SZVC. Mientras Z=0 volver al procedimiento que empieza en OTRO. Fin de secuencia, Es importante mangjar eorcectamente el uso d= los corchetes. Si en vez de MOV CL, [1500] eseribimos MOV CL, 1500 al registro CL itd el valor 1300 en ver de ir n. Y sl en lugar de MOV Sl, 1000 se escribe MOV SI, [1000], hacia el registro SI inde elemento NI en vez de 1000, EJERCICIO. ‘Sumar los elementos de una lista (vector) uaje de ato nivel con variable “enteras” se escribié la sentencia: R(n) N() + NQ) +NG) +... + NEO) que ordena sumar los valores (de 2 bytes cada uno) de los n elementos de un vector, localizados en celdas Consecutivas de memoria, conformando una fista a partir de la direccidn 1000 (figura 3.19). La cantidad n de mimeros de la lista esté en la direcclén 1500. La variable R esta en las direcciones 2000/1 Sial sumar un nuevo nimero de la lista se produce overflow, no seguir sumando y sélo enviar a la direccion 2002 la cantidad Kk de elementos que faltaban sumar. En caso de que se sumen los n niimeros, enviar a R el resultdo y escribir en 2002 el valor de k que en ese caso seri cero, como indicative de resultado correcto. Codificar en Assembler un programa que obtenga los resultados requeridos. dingrama de la figura 3.19 tiene la misma estructura que el de la figuias 3.6 y 3.18 para reper un procedimiiento y se bsa en el exquema que Jo acompafa. En este caso en cada vuelta (eel0) del lazo se summa tn neva elemento de la lists. Como siempre a la derecha de los rectingulos se indican os valores resultantes corespondientes ala primera vuelta En el cjereicio 2 se codified R= 0+ M-+M +, .(N sumas); y ahora so codiffcard: R= 0-+NI-+N2-+N3++..(n sum). El registro ST iri apuntando (aientras no haya overflow) al elemente sigu rte a sumar, Para ta fin (1) a Sse le diel valor 1000, luego (12) c1 nimero n se llevé hacia CL, y después (13) AX fue levado @ cero (pues R= 0+ NI +... El procedimi Enel primer lo comienza (I4) eon AX € AX-+ [SI] que ordena sumar s AX una copia de las 2 bytes del mimero que {sti en la direccién indicada ent iclo se tendria AX cid (19) que ordena copiar el valor de CL (gue indi corehetes por SI; y dejar el resultado en AX. En Assembler es ADD AX, [SI]. +NI=NI. Le sigue Ia pregunta (15) si V1. Si es asi (fig. 3.19), se sila a ia instruc a eantidad k de clementos que falta suinat) en la dreccign 2002, para después finalizar la cjecucion del programe, sin guerdar lo acummulado en AX. Si no hay overflows (V=0) prosiaue el ciclo (1) sumando 2a SI, que Sigue el control de las veces que se ejecutaré ct laza: se se saliaaejceutar olra vez a comienza del Cuando sea el primer cielo quedaria en 1002, spuntanda a N2, cresia uno a CL (2), y se pregunta si Z=0 (Ia). Micnas asi sea, lo donde est ia instruccién (Id) que sums el elemento siguiente, (C10) si bien ST esti epuntando a un supuesto elzmento n=1, ésic no se suma, dado que is seewenci continsia con dos almacenamientes: primero se guarda (I) una copia en 2000/1 (R) la sua total que est en AX, y luego (9) se guarda en 2002 una copia del valor k de CL, que abr debe Ea definitiva si k~ Oc resultado presente en 2000/1 est bien, y sik £0 ef mismo es errado por que antes fae V=I Debe consignarse que en el eereiio 2 se operd con enteros positives, y si era atv, que empezaba con uno, 1o cual indicaba que estaba mal, pues ello noes posible N1,N2 sustituye a NI en AX. Deno serasi, en AX sigue NI. SiN3 > AX, N3 sustituye al mayor gue indicaba AX Asien AX debe ir quedanda el riimero mayor encontrado a medida que se recorre Ia lista, mientras no sea superado por slvaler de otro elemento. Ea ia 2da vuelta de In Ler solucidn (esquema de la fig 3.24), N2 reemplaza aN en AX. uce @|_ou — [1500) ®[_S! 1000]. 1000 € XK +— [SH IAD one AB Jum me) z sce Bl AX -ISI) = Ni GE CL-4(n veces) 2 g Nisin 2207 i a eget 7 ZN 7 Dia] SarRicm, OP AX — (SI) Jaxsmayor ve Sl -— SI+2 al CL+—Cl -1 Claret ve z: Pe |sie1002, Figura 3.24 us Ginzburg - Assembler desde Cero Para conoeer en esa 2da yucita si N12 N2 se hace (ver figura 3.16); Ni=N2 = AX —Nz (paso 4). y si C=0 es Ni 2 Na, De ser as (paso 3) de la iguca 3.22 se debe salar al paso 7, salteando el paso 6 que ordena reemplazar el valor (Ni) que contenia AX por usa copia del valor (N2) contenido en la dtsecién de memoria (1002) apuntada por Sl SiC=0 es Ni para ‘etualizar el contenido de SI, coma se codifieé en las dos soluciones anteriores, MOV CL,[1500} Carga.en CL ta cantia!m de elementos que esti en 1500 MOV Si, 1000 SI apunta al eamienzo de la lista de datos MOV AX, [SI] LLievael primer nimero de I lista a AX, suponiendo que es el mayor DEC CL Decrementa CL, pues ya con MOV AX, [SI] se tom un nimero de la isa (et 110) OTRO EMP AX, |SH2] Resta al valor supuesto mayor, indieade en AX, et nimero apuntado por SI JA BETA Saltar a BETA si AX es mayor que el valor que apunta SI, sino seguir eon MOV AX SH MOV AX, [SH2] _Cargaen AX el nuevo nbmero mayor apuntado por St BETA ADD SI,2 ‘Summa 2 $1 preparindolo para que apunte af préximo elemento DEC CL Decrementa Ci JNZ OTRO Mientras Z sea 0, volvera OTRO MOF 2000}, AX Guarda en 2000 cl niimero que results ser el mayor INT20 Fin lee desde Cora jico con rombos consecutivos Se tiene una lista de nimeros enteros que comienza en la direecién 2000, siendo que Ja cantidad total n de dichos niimeros esté en la direceién 1500, Contar cuintos negativos y pasitivos hay (los ceros no se cuentan) y separarlos en dos listas que empiecen en 3000 y 4000, respectivamente. La cantidacl de negativos y positi- ‘os hallads guardaria en las direceiones 1600 y 1700, respectivamente. Desarrollar en Assembler un programa que permita obtener los resultados requeridos. Luego, usando el Debug, escribirlo en memoria y ejecutarlo con los valores dados para las variables (datos). ‘AX - 0 (veces) 1B D Hot — 11800] DSi 5505 sn aby S17 [ior so00] veo S207 O-aXansd ir ap a 2 [Bx-— 4000 21-01 = wy Rhee? oxox Dxforcomso _ GpSlesie Bac si | Mientras Gl clz0) Bo ae ane Beda | Cor Gaara) Baro) one Bef) Boor Bsrsive eS am 1500] 1600] Ba—a-1 1700 ae vig gsso00 a Ww 1 fr1600)-—OL Ss002) = Figura 3.25 Exe gjercicio cuyo esqueima de pasos a electuar y diagrama l6giea corresponclicme aparceen en a figura 3.25 sc asa en los Sercicios 7 y 9. En los 5 primeras pasos se iniealizan: CL. con el niimero w: SI, DI y BX con las direecianes insitlescleidas en el esqueme para Ins 3 Vistas a utilizar: y DX se pone en cero paca que sus mitades DH y DL queden tm eco como contadores de eantiad de nbmieras posiivos ¥ negatives, respectivamente ar siher si cada numero entero de la lista (apuntado por SI) es postive, negativoo eero, se debe restar N— 0, (Como para ordenar esta resia noex'ste la istruccidn CMP [SI]. primero (paso 6) se debe enviar N fapuntado por S1) dca AX, con fo cul AX = N: y ego (paso 7) hacer AX -0=N=0. Si ch el paso & se detceia 2-1 implica (ig. 3.13) GieN=0.=0, 6 sea que N-0, encuyo caso ese cero no se debe guardar, sein se pid, y se deben hacer los pasos 12 13 cto; y si Z=0 (cero no) implica que el resultado de N—0 no es eer, por lo que N tampoco es cer. ve para deierminar scl valor de N que se analiza es igual o distinio de cero. En este ditimo caso 3.24 MGinzburg ~ Assembler desde Cero fee eben central inferior de la figura 3.15 para nimeros entero sire de modelo para deter si A- 0 y- N= Como se solicita, este ejercicio ademis de ser codificado con el Debug, luego se ejecua ' supuestos para las variables (datus). Para ello prin comando A el programa, aunque el orden es indistnto, Setaen jos dtetivas par uso del Debug dadas en la Unidad | de ein obra. Los caractees que debe pear a operador ‘esin en negita itilica, mientras que la respuesta del Debug se mucsiia en negiia normal, CAWINDOWS> debug Con ct comando E se esert -E 2000 xxx122000 BE.25 €9.00 E1.00 ACO AAG3 OA.80 C042 75.001 En 1500 se escribe Ia eantidad de oineros( £1500 excel 500 E804 4 nediante el mismo, eon vale- 0 con el comando E se entrarin los dates, y luego con el i un numero postive (0028), un cero, un negative (8033), y otro positive (0042) Mealiante el comando A se esriben las insrueciones ex. Assembler correspondients ala figura 3.2: ada insiruccién, con el Enter (~) cl traductor Ensamblador pasa los e6digas ASCH de la migui “401001 S20%:0100 MOV CL, 11500). Cargaea CL xxxx:0104 MOV SI, 2000 Luego de eseriie sma a cédigo de antidad de mimeros de la lista El reuisio St apunta al eomienzo de la lista de eateros sxx:0107 MOV DI 3000-1 Dt apunta.al comienz0 de a lista de negativos 1A MOV BX, 4000 J BX spuntaal eamienza dela lista de positives xxxx:010D SUB DX, DX DX se leva a coro, para poner a cero los contadores DH (+) y BL () AxNKcOLOF MOVAX, /S1f Carga en AX una copia del numero entero de la lista apuntado por S| saxcOll CMPAXO oJ Al nimero entero contenido en AX le esta 0 para que los Nags tomen valor sasncO114 JZ 0100 Sil resultado d= Ia esta es coro soli a una insuruevion de esta misma sccuencl wxsxOIN6 JE 01307 Si dicho resultado es negativo sllar a una secuencia que empieza en O1307 xeec01I8 INC DH Si dicho resutiado no es negative (o sea es positivo) inerementa el contador de + eae Oy exh AX <1 Guarda ana copia dl nim entero contenido en AX enka list de posivos XXNR:OLIC ADD BX, 27 Seaciualiza BX sumindole 2 para guard el préxime positive xeaxOlIF ADD S12) ‘Se acivaliza $l en2 por si hay que pedir ota ninvero entero de a sta xxxns0122 DECEL J Se decrementa CL por haber considcrado un elemento de fa lista xxxncOI24 JINZO10F Mientras 20 volver « 0100 aaxx:0126 MOV /1600}, DL-1 Guarda la eantidad de negativos en 1600 Nxxx:012A MOV 1700), DHT Guardia camtidad de positives on 1700 O12E INT20 1 sone Oe ein on Asser hz el dasa ligio (Iga 325), end io a ven nto aa ER GSE Insaco ern i 2 ribo dca wsiuccin qe cuando asl aga reckn se vst ue ela tn nave IP Ipsreciin JZ esribe 0100 dreeioncucana fla ave eg s ores, cuando mi abajo se vise ADT IA aaa Te {N(}neerTaego U 0100 para revisor el progam, se verifica quc odo To csi en AsssemDler ot Bi dddans amament 130 camo ne drecein creased qu cr una intends oo Se puede salar 12 (80 en xa) ‘asa done expresad en decimal (6128 hacia ts) en lacie la deci dela nseueidn gigas ena ake M,Ginzburg — Assembler desde Cera “AOS t (para corcegir In instruceion de salto que esté en 0114) xxaxsO14 JZ O1TF of Se corrige 12.0100 por JZ. 011F suxxil16 -A 0130 + (para escribir la secvencia a Ia que se sala con JL. 0130), Cada sezvencin lnteral exige un comando A xwwe:0130 INC DL J Se increments el contado de negativos xxwe0132 MOV [DI], AX A Guards una copin del ndimero entero contenido en AX en la lista de negativos axws:0134 ADD DI, 2 Se actualiza DI sumndole 2 para guardar el préximo negative xxex:0137 JMP OLIF 2) Salta O11F xxee0139 Para ver si una secuencin a ejecular estd bien eserta, se usa el comando U scguido por la direceién donde comienza -wo100 Programa escrito usaiido etiquetas xxxc:0100 BAOEOOIS MOV CL,[1500], xxrx:0104 BE0020 xexx:0107 BEOO30 xexx:0104 BROOD xexx:010D. 2902 xan 010F 8804 xxxx011T 3D0000 xexxs01 Md 7409) xec0G 7C18 xereDII8 FECE ven DILA. 8907 xxx DIIC 83302 xe DILF 830602 MOV SI, 2000 MOV DI, 3000 MOV BX, 4000 SUB. DX, DX MOV AX, [SI] CMP AX, 0000 12 Our JL_ 0130 INC Dit MOV [BX}, AX ADD BX, +02 ADD SI, +02 *U (para seguir viendo inctrucciones restates) woxs122 RECO von0124 7582 88160016 verso xxxx:0130 FEC2 xexx:0132 8905 rox: 0134 83CTO2 vex0137 EBES DEC CL INZ O10F MOY (1600), DL. MOV [1700], DIL IT 20 INC DL MOV [DIL AX ADD D102 IMP OF ena inquiorda in MOY. CL. [1500] MOV St, 2000 MOV Di, 3000 MOV BX, 4000 SUB _DX.Dx MOV AX, [SI] CMP AX; 0000 IG alfa "(Si AN>= (SI) INC DL MOY (DIL, AX ADD DI, 2 CMP AX, 0 JZ beta" (Si N= {Sip INC DH MOV [BX], AX ADD BX, 2 ADD SI,2 DEC CL INZ otra MOV /1600), DL ‘MOV [1700), DA INT 20 an otras instruceiones que acroja el comands U, pero que no ura”, Este comands realiza lo que se denomina “disassembler" o “unassembler”, Esto es, a partir de la direscibn dada (0100) interpreta los cédigos de wiquina en sus cortespondientes instrucciones en assembler, efestuando el proceso eonrrarioal que realiza el progranatradcior Ensamblador La scouencia de la derecia, AIP win HO100-R 1 AX®025 BN ue viene de la pagina anterior, es otra forma de resolver el ejrcieio mediante una sole Secuencia, sin usar insiructiones jump (“go 10") En la coditieaeién se han usado etiquetas. ‘Acontinuacin se ejecutardel programa arriba cadifieado con A.0100 y ean fechas se detllan los movimientos, $00 CX=0000 DX=0000 SPAFFEE MP=00U0 St=2000 PI-3002 ‘Tener preset que el coniando T cet a instraeion que se ve eseriaariba del mismo, com indi a primer Neha haa Ia deresha DS-104D ES=16D SS=106D CS=1060 Menton saris wIoy Ct, 150] - 1P=D100_ NV UP EL PLINZ.NA PO NC DSAS00=D4 (indice que ‘pasa de icmoria aL) es de e)eeutar MOV CL.[1S00} en memoria 1500 hay 04) AXEONS BX=10O0 COOK DXAOOUN SPAFFEE BP=0000 Sl-2000 DI-3002 Dsel06D ES=106D SS=106D CSe1060 IP=0104 NV UP EL PLNZ.NA PO NC eeD:0104 BEND MOV SI, 2000, “re c tanstrceion pasa ai) 2S BX=4000 CX=GOO4 DX=OO00 SI DS=106D ES=106D SS-106D CS=106H 1P=0107 NV UP EI PLNZRA PO NC 1090-0107 BROS MOV. Di, a AXSU2S BN=4000 CX=0004 BX=00H0 SP=FFEE BP=0000 SP 000 DS-106D ES$106D $8=106D CS106N IP=diOA NV UP EI PLNZNA PO NC {o4b:0104 BROOK. MOV IX, 40 3.26 M.Ginzburg - Assembler desde Co “To AN=UU2S BX=A000 CX=0U04 DX=0UOU SPAFFEK BP=U000 SI-2000 DI=3000 DS=106D ES*i06D SS=106D CS=iN6D IP=A10}) NV UP EIPLINZ NA PONC 1w6p:0100 2902 SUB DX, DX DS=10GD ES=106D SS=106D C5150 IP 10GD:010F $HO1 MOV AX, ISI (nts de ejecutas MOV AX, [SH] en memoria 29001 hay 0025) ra pass hain AX aa cop de 0025 apna por S-2000) Ax=O025 ‘BP-0000 Si-2000 DI DS=106D ES=106D SS=106D CS=106D IP=G1LL NV UP ELPL ZR NA 10GD-0111 3D0000 CMP. AX, 0000 (se orden restr AX 0= 250 para ver el valor de os Mas) 2rd AX=25 in0 St=2000 DI=3000 D5=106D ESH1UGD SS=1UGD CS=106D IPaO114 NV UP ELPLNZNA PO NC HOGD:01147409 JZ. OLLP Con Jz sesaltasi ZI; como foe NZ (2-0 8 seae resullado de AX — 00 po fue eer ma se sat AN@D025 BX=4U00 CX=UOW4 DNeOUO) SPEFFEE: MP=CU00 SI-2000 DI=3000 DS=106D ES=106D SS106D CSH1N6D IPAOING NV. UP EI PLNZNA PO NC 1WGD:O1IG 7CL8-L 0130 Con AL. saa si $2¥: come en AX —0 fe NV (NED) y PL (SO) 0 sca S=V no se To ‘AX“0025 X=s000 CX=UNO4 DX-QOOD SPAFFEE nP-pHn9 SI-2000 HI-3000 DS=106D ES=106D SS=106D CS=I6D IPAOLIS NV UP ELPLINZ NA PO NC WADI FCG INC Dit ra CDH pass de 00201 puss se enconte un psi) ANSO025 BX=s000 CX=004 DN=OION SP=FFEF, BP=DN0N S1=2000 Dt=3000 DS=104D ES=I06D SS=106D CS=I06D 1P=OL1 NV UP EL PL NZ.NA TO NC WOGD-O1LA#907 MOV IBX].AX. [Senden guards en menoca gpentada por EX=1000 el mimeo positvo 225 lado} ;Xe4W0 CNAOGM DNAOIOU SPAFFEL BP=D0 S200 D1=5000, 16D CS=16D IP=O1IC NV UP EL PL NZNA PO NC ADD_BX,+2 2000-1 wob:2000 * 25, 00, (Asis verifies de ejecular ADD BX+02, que desde AX, en 2000/1 de memoria se escibi6 0025) AN=IN2S lIN=1002 CN=0004 DN=O100 SP=FFEL BP=O00 S=2000 D1=3000 DScI0GD ES=106D SS=106D CS=1UGD IP=DILE NV UP ELTLNZ BA PO NC 16D:011F C62 ADD S102 (1 pasb de 2000 3 2002) CX=HONL DX=0100 51 000 DS=10GD ES=106D SS=106H CS=10GD 1P=D122 NV UP ELPLLNZNA PO NC W60:0122 FECD DEC QL. (Seonlena hacer CLECL- 1-8 s8a 4-1) “Fe (CL pas dos 203) AXS0025 HEX-~4002 __CX-UHS DN-OLUD SP=FFEE Br=00UD St-2002 DI=3000 DS*106D ES@106D SS=106D CS=106D 1P=012} NV UP EL PLNZNA PE NC WGD:0124 75E9 NZ MIO (20) ried que Cl.~ 1 4— Tn fe ceo, ye salar, pes INZordena hace ses Z=0 “Ta ( sa ds 0124 3 OL0F como ordena INZ O1DE) ‘X05 NX-—1002 CN-0003 DX-o100 SP-FFEE NP-a00 St-2002 I-3000 DS=IGD ES=1U6D SS=106D CS wap ip NV UP EIPLNZ NATE NC 106D:010E8BD MOV. ANSI) DS (aates de ezzutar MOV AX, [I] en memoria 20023 hay 000) “To {Dememoria pas hacia AX una copia de 0000 que est spunado por SI=2002) x00 E0008 EF HP=0000 SI-2002 D1=3000 10GD ES={06D SS=I06D C: 111 NVUPELPLNZNAPENC {W6D:0111 30000 CMP AX, O00, Go ordsna estar AX =O O= Opa vere valor de los Mags) Pa AN=UND0 MIN=I002 CN=O009 DN=O100 SP=FFEE MP=0000 St 00 DS-I06D ES-106D SS-1U6D CS-10GM IP-OL14 NV UP ELPLZR NA PE NC WGD0114 09 -JZULLE Zt (Z=1) indica que AX O= OO ue ceo, yse sols, pos J orden hacerlo ies Z=1 Ta (UP sia de O114 3011 convo orden JZ O1FF) ANGUDDO BNAO02 CN=0003 DN=O100 SI Ue DI=3000 DS=106D ES-106D SS-1U6D CS-106h 1P-BLLE APENC 1WGv:011F 83602 ADD 1,402 Tt (si pas de 2902 2004) AN=INOO HXeIOO2 CN=00S DN*OI0 SP“FFEE. NP-O000 SI-244 I-00 DS=106D ES=IU6D SS-106b CS=106D 1P=0122. NV UP EL PLZ NA PONC looD:0122 ECD DEC GL CL (Seordena hoger CLECL=I 6 s8a 31} To (CL pasa de U3 302) ANSOD00 BXeWOO2 —_CX=068E DN@DIO0 SP=PFEE, DS-106D ES-106D SS-1U6D CS-106D 1P-0124 NV UP EI H0GD:O124 7569 NZ UE NZ (=O) inuica ue CL —1 MGinzburg— Assembler desde Cero AX=W000 BX=4on2 0100 SP=FFIE BP=0000 SI-2004 DI=3000 NV UP EIPLNZNA PONC MOV AX, [Si 1033 (antes de eeeutar MOV AX. [SI] ex memoria 2004/5 hay 8033) ‘Dermemoria nas hac. AX unm copia de B033 gus esta aunt por SI=2003) ‘CX=U002 DA=O1WN SPAEFEE MP=aG00 S1-2008 D1—3000 J0SD SSH1UGD CS=106D IPI NV UP EL PLNZNA PONC W6D:0111 300000 CMP AX, UOOD (se ordeaa estar AX -O~ 8034 ~U para ure! valor de os Mags) ea, AX“8033 BN—JOO2 CN=0002 DN=0100 SP-PFEE BP=0UDD SI-2004 DF=3000 DS-106D ES=106D SS=106D CS=106D IPE NVUPEING NZNA PE NC WansO1147409 IZ OL Con kz sesata si 21; como fue NZ (Z=0 9 sea esd de AX —00 yo fe cero) no se sata Ta 33 BN-4ON2 CX=0002 DN=0100 SPALFEE BE=UUOD S1-2004 DI=3000 16D ES=10GD SS=106D CS=1U6D IP=tf1G_NV UP ELNGNZNA PENC Wan:O1167C18 JL W130 ConJL se stabi SzV; eomo.en AX —0 fue NV (V=0)y NGi(S=1) oea SPV se sot a 0130 ru. (UP sala de 116 a 030 conte orcena JZ. 0130) AX=8039 BN=J002 CX=U0U2 DN=O100 SPAETEE BPG) Sl=2004 D1-3000, Ds=v6b ES=106D SS=106D on Wel “NV UP EING NZNA PENC OP sad fe como crdens JZ 0108) Wansis0 FEC? INC DL Ta (DL psa de 00 4 OL pcs se encomd un nspaivo) AN-BO3S BNAOU2 ‘SP=FFEE. B=0000 St=2004 I Dse106D ES=1060 OGD 1P=U132 NY UP ELPLNZNA ONC. Wan:0132 8995 MOV [DI}, AX. (Se rdeta garda en memoria aparads por DI el nimero negative BERS halo) ae ANSBU33 BNe“OUZ CNO002 DN=UIDT SP 0000 St-2004 1-300 DS=106D FS=106D SS=106D CS=1060 1P=O184 NV UP ELPLNZNAPONC 106D:013483C702 ADD. Dl, ~B2 (Antes de ejecutar ADD Di, 02 se pos hacer E3000 para ver sien 3000/1 est 8033) Ty ANSHUBS BN=sO02 CA=0OHR D} DS-106D_ES=106D SS=106D CS=106D TP=G137 NV UP ELPLNZNA PO NC W6D:0137 EMES IMP OIE (Se ordena ltr incondicioashnente 901 F) Pa. saltade 0137 3 001F com onlena MP O11) ANSHOND BN=AHO2 CN=O002 FEE BP=O000 S1-2004 D302 DS-1NGD ES=106D 1 NV UPELPLINZ [iA PO NC WeDALIF3C6n2 ADD slr02 to Si pass de 2004s 2008) ANSWS3-BN=1002 CX=0ON DN=O10F SPAFFEE BP=0000 St-2008 DIE3002 DS-106D ES=106D SS=106)) CS=10GD 1P=0122_ NV UP EIPL NZNAPENC Wopsn122 FEC9 DEC [CL (Seordens hacer CLE CL~1 6 sea 2=1) {C:-pasa de O2 1 ingicanéo que solo queda un mknet sin nalva x ita) CXeOOT DN-UIOL SPMFFEE RP=0000 S1-2006 D1=3002 SS=IUGD CS=16D 1P=012} NV UP EL PL NZ.NA PO NC “NZ OLDE NZ (20) indica fue CL 1=2~1 ao fe coo, ys alo, pcs INZ orden havo ses 20 0 sala de 0128 a 10 como ordena JNZ. 910F), AXSHNI3 BN-4U02 CA=OUOL DX=OI01 St 2006 DI-3002 sie ES=I06D €S=106D IP=Q10E NV UPEIPLNZNA PONC ope se ANSI] _D5:2002-0052 (antes de deci MOV AX, [SI] en memoria 20067 hay D042) pas hacia AX una copia de 042 Que est spunado en memela poe SI ‘BP=0G00 St=2006 Di=3002 D FS=T06D SS=106D CS-106D IP-OL11 NV UP EL PLNZNA PO NC 1060-0111 300000 CMP AX, ODDO (se order restar AX —0= 0042-0 para ver el va Ta axa 1006 DI-sonz DSeI6D FS=106D SS=1060 CS=106D HP=OIL4 NV UP EL PL NZNAPE NC ToGD:0114 740942 OLE Con.z se saa si Z=1; como fue NZ =D o8sa el resultado de AX ~0 no fins cer) no se star re] AN=0042 BX=4002 1 SP=FFLE Bi=0u00 $1=2006 Di=3002 DS=10GD ES=106D $S=106D CS=116D IP=O116 NV’ UP EL PLNZ.NA PENC W6DH1N67CIS “SL 0130 Con JL se sala si SAV: como en AX —O Tue NV (V=0) y PL ($70) o sca SAV no se sth 2 0130 ot DX=W1N E BP=nGad S1=2006 Di=3002 DseIU6D ES=106D $8=106D CS=fO6D IP=OIIE NV UP EL PLNZ NA PE NC MeDsOLS FECG INC DU (D1 pasado 01 02 ps se encom otro poiivo) 002 CX=000L DN=W201 SP: 2006 DI-3U02 106D:OLLA 8907 MOV [ENKAX Pe AXDo42 BX=4002 CX=000L DN=€201 SP=FFEE HP-00O0 S1-2006 DDi=3002 DS-I06D ES=i0do S$=106D CS=106D IP-O11C_NV UP EPL NZ. NA PO NC MGD-OLICASCIOE ADD BXA02 (Anes de ejecutar ADD BX, 02 se podia hacor hacer E4002 para ver sien 4002/3 exh 42) 3.28 M.Ginehurg - Assembler desde Ceo ro esx pasa de 4002 2.4004) ‘AX“O042 WNedOMfe CX=HOOL DX=O201 SP=FFEE, DS=106D ES=105D SS-106D CS- INGOs — ADD Sls (Mp CS=106D 1?=0122. NV UP ELPLNZ.NA PO NC 10gp:012 FEC) DEC |CL (Seondena hacer CLE CL~1 6 sea 1-1 =0) Ts (CL pasa d2 011 0 snieando que yao quedan nimeros sin snazar en In st} ‘xctod2 BX=4oos Cx-volh DN-O2N SP=FFEE BP=0000 SI-2008. DI-3002 DS=1U6D ES=I06D S5=106D CS-106D 1 NAPENC M6D:0124 75H) INZ. O1OF Coo JNZ sell si =O, com fie (seas esllado de CL.— 1 fue ceo) wos sara | ‘ANS0042 BX—4004 CN-0000 DN=0208 SP-FFEE BP=0000 ST=2008 DI=3002 DS-INGD ES=106D SS=106D CS=106D 1P=0126 NV UP 106D:0126 A30016 MOV [1600], AX | bong st-2008 DI=sou2 | UPELPLZUNATENC | DS-I06D FS=106D $81 196030129 430013 MOV [1300], AX Fu ANU2 BX=J004 CX-0000 DN=0201 SPAEFEE Br=0000 SI-2008 DI-3002 DSctUD FS=NGD SS=1UGD CSH106D TPAO12C NV UPELPL ZRNAPENC I 16p:012C. C20 INT 20 £3000 J. saan resulradas: lista de negativas rwaxs00 33.80 “E4000 J Exainina resultados: lista de pasitvos Jonst000 25. 00, 82.00, *E 1600 Examine reeultadae: contador de negatives sexe 1600 0 “E1700 f Examina resultados: contador de positivos xsx1700 02. Forma de copiar una pantalla del Debug en ef Word ‘Cliquear con ei botén derecho del rouse en Ja barra superior azul de le pantalla del DOS. Cliquear eon el bot6n izquies it. CCliquear con el betén izquierdo en Mark y aparecerd un punto luminoso en el incu superior iaquierdo, ‘Mover la lecha del mouse sobre dicho punto y ampiarlo ean cl bot6n izquietdo apretado, hasta abarear Ia parte de ta pantalla que se guiece copiar. Lego aprctar Enter, con le cual desapareeera la parte iluminada de In panala 5. _Abrirun archivo en el Word (u otra) y pulsar Cul V para copiar lo scleccianado en el punto anterior. vez mediante el comande G Forma de ejecutar el programa de una so -G= 0100 O28 1 (También puede primero hacerse 1P=0100 mediante RIP y luego hacer G= 0100 ) AN=0042 BX=1002 CX-0000 DNO1D2 SPE=FFEG BP-FFES SI=2008 DI=3004 Ds-t06D ESe106D SSID CS-1060 IP=OI2E NV UP DIPLZR NAPE NC twon:0126 cba INT 20 EJERCICIO 14 Con listas enya cantidad w de caracteres que las conforman no es un dato directo. En las diteeciones 1000 y 2000 eomiertzan dos listas de caracteres ASCII de mayisculas que corresponden a nombres de personas, las eusles pueden ser de igual o distinta longitud, siendo que cads lista termina con el caractsr ASCII corres ondiente al Enter (0D), como se ejemplifica, Determiner en eval de esas dos listas correspondientes a nombres, est Clnombee que va priniero por orden alfabético, escribiendo en Ia dreccién 3000 la direccién donde eomienza Gita lista, ‘Se supone que los nombres han sido bien tipendes, con earacteres ASCII de mayiisculas, y que terminan con Enter 100041 (A) 2000 4D(M) 1000 41 (A) 2000 41 (AY 1900 41 (A) 2000 41 (A) 4E () 45 (A) AE (N) ic) 4EQ) 4E(N) 41 (A) 52 (R) 41) 2B) L(A) 14a) 0D (4) aL) ow 4) oD) 48H) oD 0D 49) oD) jgura 3.26.0 Figura 3.26.0 Figura 3.26.0 [Este ejrcicio, por desconocerse de entrada In eantidad n de earacteres que componen cada lista, no empezard como otros anieriores con MOV CL, [...]y terminata con DEC CL. y JNZ..... forma tipi que usamos part las estructura tipo FOR en allo nivel En este caso el cielo se repetri mientras (“while”) no se detecte un final de nombre (caricter OD) 0 no bien se detecle que son diferentes los cidigas ascii de dos letras que seestin eomparando. ssde sth ist + tipo MGinztos 1rg~ Assembler desde Cero DBX+— 1000 fax-1000 (Box 2000 IDxX=2000 (3) S| -— OF FF (0 iF Dit FFF 5 Si--Si+4 ISleoFFF L=asciiA =P ZEA (AL=00) Fin eta 1000] 7=0(A.£0D) AH +=IDM |p aseina (AL=AHD CL=0 (AL AH) cL (aceary| ©ffg000 2 "(Z=0(A4AH) eee ‘OTRO Gast capt Kay Bis0001 sIeK |[3000]=1000 © Figmszr MOV Bx, 1000 MOV Dx. 2000 MOV St, OFF MOV DI, IFFF INCSI Ine DI MOY AL, [SI] Pero en la cuarta vuelta, por ser OD el euario eédigo d CMP ALD dicho céuigo indica que ése nombre terming, y en el paso U1 serie AH — OD = OD ~01 Z=1. Fi paso (2 detector JZ. GASI yy por lo ian 3.29 n el inicio del diagrama de la figura 3.27 en BX y DX quedan los ndmeros 1000 y 2000 que se usarin (uno u ote) para indiear al Final del programa la ireecidn de Ia Ista que es primera por orden alfabetica, como se pie Asi enel caso de ANA y MARA deberi queda en la direecién 3000 el vale 1000, indicundo que la lista eomenzada en 1000 es primera alfabatie Lucgo (pasos 3 y 4), los punteros SI y DI de ex liste se inci OFFFy IFFF, de modo que cuando en los pasos 5 6 se ordene y DI €DI+ |, en laprimer vuelta del procedimicnio resulte: SI= OFFF + 1 = 1000 y DI = IFFF + 1 = 2000. De este modo, en el caso a) de Ia Mgura 3.26 los registros SI y DI en fa primera vuelta apuntarin a le ce6digos ASCII de las letras A y M que estin en 1000 y 2000 en las Fists datas. Dichos eédigos Iueyo de los pasos 7 y 10 pasarin hacia AL y AB, Para determinar si uno u otro de esos efdigos corresponds o no al cédig> ASCII DD de la tecla Enter (41), Jo cual indicaria que es el fin de una u otra lista (o de ambas si tienen igual eantiad de letras), primero se ordena (pases 8y {1} las estas AL—OD y AH —OD, pata luego (pasos 9 y 12), pregunter siZ=1, eomo en el ejercieio 9. En caso que sea Z=1 implica que AL = OD, > que AiT = 0D, 0 sea que una u ora lista na terminado, Si se asume que cada nombre tiene al menos una letra, en ta primera vuelta Uichas restas sOlo pueden generar Z=0, pus las listas no pueden terminer con una sola vuelta (Con la testa del paso 13 comienza estin en igual posicidn en ambas lis Sieen el paso 14 se determina que Z=1 significa que esas dos letras comps dlas som iguales (esto se supuso para la primer letra A en los easos by €) de Ie figura 3.26, lo cual se detectaria en ambos casos en la primer ‘wuelts Deser Z=1 (figura 3.27) se ordena salar al paso 5, con Jo cual comienza ure segunda vuelta donde nuevamente se comparan los dos eSdigos siguientes para delectar si alguna de ellos (0 ambos) es de fin de Hist, o bien si corre pponden a leas distintas 0 iguales Sion Ia segunda wielta las letras son iguales, como gcurre eon ANA y ANAHI implica que hasta las segundas letras hay “empate” on et orden alfabtico pues dichas letras son N, por lo que se debe seguir con una tercer cn ka que ola vex“empatarin”. Enseguida se verde} paso siguiente nda vuelta de ANA y ALBA en el paso 13 la resin no daré cer, porlo queel paso 14 detectart 20, Elo signitiea que las dos letras (N y L) no son igual, fo cual implica que no seri necesaria una tercer vuelta, y permite determinar en el paso 15, per serC=0, gue AL > AH (ver fig. 3.16), detectindose asi que el eddigo ASCII (Ge la N) que esti en AL es mayor que el ebdigo (de la L) que esti en AH, Por Jo tanto, si bien las ds primera letras fueron iguales (Ay A), fs segundas na lo son, y por ser eédiga N > cédigo Les suiciente para deter minar que ALBA va primero por orden alfabéico, por lo que en la diteceién 3000 debe ir la direccién 2000 que aportar’ DX, donde eomienza ALBA (paso 17); y ast terninaria et programa para el caso b). Proceso para compara dos 35 ou En cl easo a) de ANA y MARA ya en el paso 1 de la primera vuelta result 2n0 (AL#AN),y se sigue con e! paso 15 que detectaria C=1 (AL < AH, © sea: ebdigo A < eSdigo B), por lo que ANA va primera por orden, y su dig in 1000 la provee BX para que se guards en 3000 (paso 16), ‘Con ANAHI y ANA en el paso 14 de ls tes primeras vuelas se detectae la lista de ANA (Figura 3.26: 0 =I ordenari saltar al paso 16, donde BX pasa a MOV AH, [DI] _Iasceldss 3000/1 Ia ditceeién 1000 como indicacién de que ANA va antes que ANAHL CMP ALD] Siambos nombres son idéntics, y par lo tanto de igual ndimero de letras, et Ios pasos § y9 Jz GADI de la vuelta en que primero se dotecia el fin del nombre de la Hista que empieza en 1000, s CMP AL,AH saltaria a! paso 16 que ordena llevar 1000 (que esta en BX) a la direseién 3000. Como las JZ OTRO dos listavestin en igual orden, no importa que Ia primera sea siempre la que esti en 1000 JA GADI Dbsérvese que Cama inicialmente na se eoncce el nimero n de earacteres que MOV [3000],Bx INT20 MOV [3000],DX INT20 {que componen cada lisa, I secuencia no termina con DEC CL y JNZ. 3:30 M.Ginebure = Assembler desde Cero EJERCICIO 15 Otro caso de w Dado 4 (CX + 0000 1 DX + FFFF| lox-0000 D) FEE ®Isi — - [St —OFFF Js, one TAL=0D) (aLzoby{Z-0 @LaAL- 4 SEI @[p000}—cx sta no valida Ei a @[[8000}-— 0x Ta valida Figun 3.28 Tista enya ean al tipear caracteres puede haber errores, ASCH de una lista que empieza en In direceién 1000 y termi corresponden a caracteres alfabéticos, ya sean maydsculas © Asimismo contemplar la posibilidad que el eardcier OD (Enter) de fin de la lista esté errado 0 no esté, en cuyo caso controlar que un nombre pueda tener hasta 20d dad n de caraeteres que Ia componen no es un dato directo. iacer un programa que valide (verifique) si los cédigos con el eddigo OD de Enter, realmente inisculas indistintamente, y no a otros. 14h letras, pucs caso contrario cl programa podria no terminar nunca. Va sea que se encuentre un cddigo que no corres onda a una letra 0 que no esté el cédigo OD, escribir 0000h en direcefones 3000/1. Si la lista de letras se valida, escribir FFFF en esas direcciones. No se da la cantidad n de caracteres de la lista el cuacto de los pasos de inisio (Figura 3.28) se pone a cero el registro AH, que serd usado para contar el nimere de ebdigos ASCH que han sido ‘analiza, eyyo valor no puede superar 21d = Sh como se deduct El procedimiento comienza (paso 5) incrementando dicho contador AH, ‘ues en cada vuclta sc empieza a analizar un nuevo cédigo y se ordena la festa AH -I5 del paso 6 para constaar si AH = ISh= 214, para el caso que ya se hayan anatizado de lisa 0D. ‘Como en la primer vuelia es AH=I. en el paso 7 se detectarh Z=0, 0 sea AUL#IS, y mieatras sea Z=D se sigue en cada vuella con SI €S1+1 (paso 8) para que SI apunle al siguiente eSdigo que en esa vuela eorresponde analizar. Luego (paso 9) con ALL€- [SI] se lleva hacia AL. una copia del eidigo ASCI! apuntado por $1 (SI 1000 en la primer vuelta). Sia partir de la direceion 1000 se tiene 4C (L) 69 (1) 61 (a) OD (1), 0 sea suponiendo el nombre Lia cadificado en ASCII, en AL se tendria #C en lt primer vuelta, En Mien AL puede se 1) OD de fin de nombre; b} de una maySsculs; c) de una miniscula; 4) un cédigo incorrecto, en cuyo caso s¢ debe escribir 000 en Jas dirceciones de memoria 3000/1, segin se pide en el enunciad. Primero se verfien sel céigo que eg6 a AL. es OD (Enter de final) ‘Atal fin el paso 10 ordena AL—OD; y sien e} paso 11 se detecta Z=1 por se AL=OD, ello implica que eo esta vaelia se detectd dicho eédigo de fia ‘de nombre, y que en las vuelta anteriores se validaron todos los cédigos ‘analizados como correspondientes a letras mayasculas o mindsculs, Por lo tanta si Zm1 se ordena saltar (figura 3.28) al paso 21 paca escribir PFFP=DX. en 3000/1 y luego finalizar el programs En nuesiro elemplo por ser AL = AC # 0D a0 sigue ean los patos que ddoterminan si el cédigo es de una letra mayéscula o mindscula, Sives us ‘su cadificacide: ASCH debe estar comprendida entre AL (letra ATW SA (let Z); 0 sea debe ser 41 41, (ig. 3.16) 0 sen 41 < AL. Para determinar si tl codiga que esté en AL es el de una letra mayiscula (41< AL < $A) falta versi ALS 5A, Con este fin se ordena AL. ~ 5A (poso 14) que en el cjomplo duo seria 4C~ 5A. Si en el paso 15 se dotecia que AL. 5A pe- nerd C=1 6 Z=1 implica ALS 5A, determindndose que es una mayiiscula Esto sucede en el ejemplo dado, pues luego de hacer AL ~ SA=4C~ 5A resullaté CI y ZO, siendo que 4C es el codigo de Ia letra mayiscula L, Por lo tanto se ordena saftar al paso 3 part analizar el eédigo ASCIL siguiente, que para cl nombre Lin seri 69 de a letra i, Ast comenzaré una segunda woeha similar a a primera, salve que en cl paso 9 va hacia AL. ieho cédigo 69. Igualmente eomo en la primer vuelta, e procedimiento sigue por los pasos 10a 15.

You might also like