Assembler 1

download Assembler 1

of 126

Transcript of Assembler 1

CAPITULO IINTRODUCION AL LENGUAJE ENSAMBLADOR Enestecaptuloencontraraselfundamentoparaaprenderaprogramarenlenguajeensamblador,programacin, procesadores, lenguajes de computacin, sistemas de nmeros y software para desarrollo de herramientas. Nuevos trminos Procesador.Elcircuito,enlatarjetaprincipaldelamquina,queejecutalasoperacionesbsicasdela computadora. Conjuntodeinstruccin.Elconjuntodetodaslasposiblesinstruccionesqueelprocesadorpuede ejecutar. LenguajeMquina.Elconjuntodeoperacionesbsicas,ejecutadasporelprocesador,ademsdelas reglas para usarlas. Lenguaje de alto nivel. Un lenguaje cuyas instrucciones estn muy lejanas del lenguaje mquina. Lenguaje de bajo nivel. Un lenguaje cuyas instrucciones estn ms cercanas al lenguaje mquina. LenguajeEnsamblador.Esuntipodelenguajedebajonivelenelcualabreviacionesmnemotcnicas representanoperacionesmquinayalmacenanlocalidades.Ellenguajeensambladorhaceposible programar al procesador directamente sin usar lenguaje mquina. Compilador.Unprogramaquetraduceprogramasdealtonivelalenguajemquinaparaqueestos puedan ser ejecutados. Interprete.Unprogramaquetraduceprogramasdealtonivelalenguajemquina,unalneaalavez, conforme se van ejecutando. CompiladorIncremental.Unprogramaquecombinacompilacineinterpretacinparatraducirun programa de alto nivel a una forma intermedia (pseudo-cdigo) que es despus interpretado. Pseudo-Cdigo.Laformaenlacualunprogramadealtonivelesparcialmentecompiladoporun compilador incremental. Ensamblador. (1) Un programa que traduce programas de bajo nivel a lenguaje mquina. (2) Un trmino usado para nombrar al Lenguaje Ensamblador. Coprocesador.Unprocesadoropcionalusadoparaejecutaroperacionesmatemticas,especialmente clculos de punto flotante. Modo Real. Un estado de operacin en el cual un 286, 386, o 486 se comportan como un 8088 rpido; en elmodoreal,lacomputadorapuedeejecutarmuchosprogramasescritosporlosmiembrosviejosdela familia PC. Modo Protegido. Un estado de operacin en el cual un 286, 386, o 486 pueden tener acceso a una gran cantidaddememoria;esteestadotambinpermitelasmultitareas,particularmenteparatrabajosen sistemas operativos y otros softwares sofisticados. 1Memoria Virtual. Un sistema de administracin de la memoria en el cual la memoria del disco es usada para simular grandes cantidades de memoria regular interna. Multitareas.Ejecutarmsdeunprogramaalmismotiempopormedioderpidoscambiosentrelos programas. Modo Virtual 86. Un estado de operacin en el cual unprocesador 386, o 486 pueden correr mltiples programas, donde cada uno tiene su propio procesador 8086. Cdigo.(1) Usado como verbo el trmino se refiere a un programa escrito. (2) Usado como sustantivo el trmino se refiere a las instrucciones de un programa. Editor. Un programa que permite teclear un programa y hacerle cambios cuando sea necesario. Enlazador(Linker).Unprogramaqueprocesaunprogramatraducidodeensambladoraunaformaen que puede ser ejecutado. ProgramaFuenteCdigoFuente.Unprogramaenlenguajeensambladorquevaasertraducidoa Ensamblador. Los programas fuente son almacenados en archivos con la extensin ASM. ModuloObjeto.Latraduccinalenguajemquinadelprogramafuente;losmdulosobjetoson almacenados en archivos con extensin OBJ. Modulo Cargable (Load Module Run Module). Una versin ejecutable de un modulo objeto, tambin llamado un run module, producido por el Enlazador. Los mdulos cargables son almacenados en archivos con la extensin EXE (o algunas veces COM). Depurador (Debugger). Un programa que provee un ambiente para probar load modules. 1.1 Orientacin. En trminosinformaleselcerebro de la computadora es el procesador, un chip electrnico que, en muchas computadoras, se encuentra en la tarjeta del sistema principal, las computadoras personales IBM usanprocesadoresdelafamiliaIntel86.Estosprocesadoressonconocidosporunnmerodemodelo, desde los menos poderosos hasta los actuales, estos son: 8086, 8088, 186, 286, 386, 486, Pentium, etc. Dentro de cada nmero de modelo hay variaciones, por ejemplo existen procesadores 386 SX y 386 DX. LamsimportanteideadeIBMesquetodossusprocesadores,menosalguno,corranlosmismos programas,asegurndosequelosmiembrosdelafamiliaIntel86seanmutuamentecompatibles.Las habilidadesqueaprendasdellenguajeensambladortepermitirnprogramarcualquierPC,sinimportar que procesador uses. 1.2 Lenguaje Mquina. Lalistadetodaslasposiblesinstruccionesquecadaprocesadorpuedeejecutaresdenominada conjuntodeinstrucciones.Latabla1-1muestraeltamaodelconjuntodeinstruccionesparavarios miembros de la familia Intel 86. 2 Tabla 1-1ProcesadorTamao del conjunto de instrucciones 8086/8088115 186126 286142 386200 486206 Pentium216 Elconjuntodeinstruccionesqueelprocesadorpuedeejecutardirectamente,ylasreglasparausaresas instruccionessellamalenguajemquina.Enlenguajemquinacadainstruccinestacodificadaconun nmero. Si t ves un programa en lenguaje mquina veras una gran cadena de nmeros. Lossereshumanosnopuedenprogramarenlenguajemquina,debidoaqueunprogramaconsistede cientosdemilesdenmeros.Deunaformamssimplenosotrospodemosescribirprogramasusando lenguajesdecomputacin.Nosotrospodemosdividirloslenguajesdecomputacinendosgrupos:alto nivel y bajo nivel. Los lenguajes de alto nivel tales como C, C++, Pascal o Basic, estn muy lejanos del lenguaje mquina. Cuando t usas un lenguaje de alto nivel, te concentras en el problema a resolver, y no necesitas saber nada acerca de como el procesador ejecutar el programa. Por supuesto antes de ejecutarlo este tiene que ser convertido a lenguaje mquina. Sin importar el lenguaje que uses, este debe ser traducido a instrucciones en lenguaje mquina, el cual es elquecomprendeelprocesador.Existentrestiposdesistemasparatraducirlenguajesdealtonivel: Compiladores, Intrpretes y Compiladores Incrementales. Loslenguajesdebajonivelsonunarepresentacindellenguajemquinadeformaquelaspersonas puedan trabajar con el. El Lenguaje Ensamblador es un lenguaje de bajo nivel, cuando usas un lenguaje debajonivel,ttienescontroldirectosobreelprocesador,otraventajaesquelosprogramassonms pequeos y ms rpidos. Cuandotrabajasconlenguajesdebajonivel,elprogramaquetraducetucdigoalenguajemquinaes llamado Ensamblador. 1.3 Lenguaje Ensamblador. UnEnsambladorleeunprogramaenlenguajeensambladordebajonivelygeneraunprograma equivalente en lenguaje mquina. Paraprogramarenensambladordebesconoceralgunosaspectosextra:debescomprendernoslolas instruccionesquevasausarsinotambinlaarquitecturadelamquina,necesitassabercomose almacenan los datos, como el procesador manipula los datos, etc. Cuando programas en lenguajes de bajo nivel debes hacer ms que solo describir la solucin formal del programa, debes dividir el programa en pasos pequeos y bsicos. Estos pasos le dirn al procesador que hacer, una instruccin a la vez. 31.4 El Programador de lenguaje Ensamblador. Paraprogramarencualquierlenguajedecomputacin,necesitasbuenashabilidades organizacionales. Fundamentalmentenecesitassercapazdeconceptuarunplandeaccinbasadoentiempo.Estoes,la habilidaddetomarunproblemaydisearunasolucinqueinvolucreejecutarciertospasosencierto orden. Para programar en lenguaje ensamblador necesitas ms, debes tener una personalidad que disfrute atender losdetalles,ytenerbuenashabilidadesaritmticas,enalgunoscasosdebetenersemuchacalmapara rastrear los problemas del cdigo (conocidos como bugs) Larecompensadeaprenderypracticarconellenguajeensambladoresdesarrollarunaideaslidade como opera una computadora, adems de escribir programas rpidos y pequeos para ejecutar tareas que no son practicas (demasiado lentas) o no son posibles o demasiado complejas en lenguajes de alto nivel. Los mejores programadores de ensamblador son obsesivos, esto no es necesario pero ayuda. 1.5 Procesadores y Coprocesadores. Yamencioneanteriormentequeelprocesadoreslapartedelacomputadoraquehacecasitodoel trabajo. Lascomputadoraspersonales IBM y compatibles usan el procesador de la familia Intel 86 o un procesador compatible de otra compaa, (ver tabla 1-1). Los procesadores de la tabla 1-1 son de propsito general. Existen tambin coprocesadores matemticos especialesquepuedenserusadosparaaumentaralprocesadorprincipal.EstosCoprocesadoresejecutan operaciones matemticas, incluyendo aritmtica de punto flotante, y son extremadamente rpidos. Losprocesadores486yPentiumtieneuncoprocesadormatemticonterconstruido,elcuales funcionalmente equivalente a un 387. As puedes considerar un 486 como un mejorado 386 + 387 (en la tabla 1-1, el tamao de las instrucciones no incluye las instrucciones matemticas). LosCoprocesadoresmatemticostienensupropioconjuntodeinstruccionesyrequierendeuna programacinespecial,parareferencialatabla1-3muestraeltamaodelosvariosconjuntosde instrucciones matemticas. Tabla 1-2ProcesadorCoprocesador Math 8086/80888087 1868087 286287 386387 486--- Pentium--- Tabla 1-3CoprocesadorTamao del conjunto de instrucciones 8087 77 28774 38780 486/48780 Pentium80 4 1.6 Programando para los Procesadores Intel 86 LaTabla1-4muestraelnmerodetransistoresenvariosmodelosdelchipIntel86.Elnmerode transistores de cada tipo de procesador se ha incrementado cuantitativamente, aunque es difcil definir lo quesignificauntransistor,sinembargo,elnmerototaldetransistoresesunbuenaindicacindela complejidad de un chip. Programar en lenguaje Ensamblador en 386, 486 o Pentium es casi lo mismo que programar en el 8088. ConcadanuevoprocesadorqueIntelhace,seaseguraquelosprogramashechosparalosprocesadores anterioresfuncionen.Estosignificaquelacomputadoramsrpidaymodernapuedecorrerlos programas escritos para la IBM PCoriginal (la cual usaba el procesador 8086). Tabla 1-4ProcesadorNmero aproximado Ao de Introduccin de transistores 8086 29,0001978 8088 29,0001979 186100,0001982 286134,0001982 386375,0001985 4861,200,000 1989 Pentium3,100,000 1993 Una de las ms grandes limitantes de los primeros procesadores 8086, 8088, 186, era su incapacidad de usar ms de 1 megabyte de memoria. El 286 resolvi ese problema operando en dos modos diferentes. En modo real, una 286 acta como una 8086, 8088, o 186. El modo Real da la compatibilidad para todos los programas de DOS que dependen de la arquitectura original de la 8088. En modo protegido, la 286 ofrece tres funciones importantes: Primero, la 286 pude utilizar 16 megabytes dememoria.Segundo,la286puedeusaralmacenamientoexternodediscoparaproveer1gigabytede memoriavirtual,lacualesmemoriasimulada.Finalmente,el286ofrecehardwaremultitareas,la habilidad de cambiar rpidamente de un programa a otro. Infortunadamente, pocas personas podan tomar ventaja de las avanzadas facilidades del 286 debido a que casi todos usaban DOS y DOS est basado en el viejo 8088. Esto significa que para propsitos prcticos, se usaba el modo real y tenamos efectivamente rpidos 8088s. Elprocesador386fueunimportantecambiodebidoasunuevafacilidadaadidallamadamodovirtual 86. Esto permiti al procesador correr ms de un programa DOS a la vez, cada uno de los cuales pensaba quecorraensuspropiamquina8086.Adems,un386enmodoprotegidopuedeusarmsde4 gigabytes de memoria real y ms de 64 terabytes de memoria virtual. El486yPentiumcombinanlafuncionalidaddeun386conunprocesadormatemticonterconstruido comotambinuncontroladordecache(elcualcontrolalamemoriaespecialdealtavelocidaddel procesador).Asdesde el puntodevista de programacin, podemos considerar al 486 y al Pentium casi iguales al 386. 5Sin embargo todas las instrucciones extra que fueron adicionadas despus del 8088 son para programar en modo protegido. A menos que t hagas software avanzado tal como un sistema operativo, un dispositivo de driver o un compilador, no es factible que necesites esas instrucciones extra. As casi todos los programadores en lenguaje ensamblador, programan para cualquier procesador de Intel igualquecomoprogramabanparael8086original.Estoesespecialmenteciertosithacesprogramas para DOS. 1.7 Cuando usar el Lenguaje Ensamblador. Te puedes preguntar: Cuando debo usar el Lenguaje Ensamblador y cuando puedo usar el Lenguaje de alto nivel? Los lenguajes de alto nivel son menos detallados y ms conceptuales, y ellos deben ser tu primeraopcinlamayoradelasveces.ComparadosconlosprogramasenlenguajeEnsamblador,los programasdealtonivelsonmsfcilesdecomprenderymodificar.Tslodebesusarensamblador cuando sea necesario. Laraznprincipaldelporqueusarensambladoressiquiereshaceralgoqueesimposibleomuypoco prcticoconunlenguajedealtonivel.Debidoaqueelensambladortedacontrolcompletosobreel procesador, puedes hacer cualquier cosa que la mquina sea capaz de hacer. Los lenguajes de alto nivel no te dan este tipo de control. La segunda razn del porque usar ensamblador es acelerar un programa lento. Los programas hechos con lenguajes de alto nivel se ejecutan ms lentamente que sus equivalentes en ensamblador. El que tanto ms rpidoseejecutanlosprogramasdependedequetanbuenoseaelcompiladorparagenerarcdigoen lenguaje mquina eficiente. En ciertas situaciones, necesitas acelerar cierta parte de un programa de alto nivel que es demasiado lento, enestecasopuedesanalizarelprogramaparaencontrarlospuntoslentos.Comoreglageneral,los programasgastanel90%desutiempoejecutandoel10%delasinstrucciones.Usualmenteestas instruccionessonlasquenecesitansermejoradas.Siesposiblemanteniendolamayoradelprograma como alto nivel, rescribiendo partes seleccionadas en Lenguaje Ensamblador, y uniendo todas las piezas juntas. La tercera razn para usar Ensamblador es para disear programas tan pequeos como sea posible. Ahora lamemoriadelacomputadoraesmsbarata,yahorrarespaciodememorianoesmuyimportante.Sin embargo, cuando tienes que meter un programa en espacios de memoria pequeos, usar el ensamblador eslamejorsalida,puedesdisearunprogramaqueusemenosespacioqueunogeneradoporun compilador. LaltimaraznparaescogerLenguajeEnsambladoreslamsimportante:pordiversin.Muchagente prefiere lenguaje Ensamblador a los lenguajes de alto nivel debido a que les divierte trabajar a nivel del procesador. 1.8 El Sistema Operativo. Elsistemaoperativoeselcontrolmaestrodeprogramasquecorrelacomputadora.Como programador en Lenguaje Ensamblador, puedes usar el sistema operativo de dos maneras: Primero, sinimportar quecomputadora uses,usascomandos queejecuta elsistema operativo: comandospara copiararchivos,iniciar unprograma,listar un directorio, etc. 6 Segundo,t llamas alsistema operativodentro detus programaspara hacerciertas tareas; por ejemplo: entrada/salida, acceso al reloj, trabajar con archivos y directorios, etc. Estas tareas pueden ser muy complicadas para hacerlas por ti mismo. De hecho, puedes llamar al sistema operativo para que haga el trabajo por ti. LamayoradenosotrosusamoselsistemaoperativoDOS(DiskOperatingSystem),sitestas programando para Microsoft Windows, tambin puedes trabajar bajo DOS. 1.10 Desarrollo de un Programa en Ensamblador Una vez que diseas un programa en Lenguaje Ensamblador, hay varios pasos que debes hacer antes de poderlo ejecutar. Primerodebesmeterelprogramaalacomputadora.Parahaceresto,puedesusarunprogramallamado editorysalvarelprogramaadisco.Unavezqueelprogramaestaalmacenadoenunarchivo,usaun Ensambladorparaejecutarlatraduccinalenguajemquina.Sinembargounprogramaenlenguaje mquinanopuedeserejecutadodirectamente;estedebeserprocesadoporunenlazador.Elenlazador creaunaformadeprogramaqueestlistaparaejecutarse.Tambinpermitequehagasprogramas separados que sern unidos juntos para ejecutarse como un todo (de ah el nombre enlazador). Bajo DOS existen ciertas convenciones para nombrar a los archivos: ASMArchivos de cdigo fuente. OBJArchivos producidos por la conversin de cdigo fuente a cdigo mquina. EXE Archivos generados por el enlazamiento de archivos OBJ. Por ejemplo si creas un programa fuente llamado TEST.ASM, el ensamblador lee el archivo, generando unmoduloobjetollamadoTEST.OBJyesteasuvezpuedeserledoporelenlazadorparagenerarel programa ejecutable o el load module llamado TEST.EXE. Cuando un programa esta totalmente terminado, puede ser probado bajo los auspicios de un debugger. Un debugger es un programa que provee un ambiente para probar load modules. Usando un debugger, puedes desplegarunprograma,ejecutarlounainstruccinalavez,verlosresultadosdecadainstruccin, desplegar reas de la memoria, etc. 1.11 Que Software necesitas. Sistema DOS en cualquier versin o Windows versin 3.x o 95. Programa editor de textos. De preferencia el EDIT de DOS. Programa MASM TASM (MacroAssembler TurboAssembler). Programa LINK TLINK (enlazadores de MicroSoft Turbo). Programa DEBUG. Nota:Noutiliceseditoresdetextossofisticados(amenosqueseaenmodotexto),paratecleartus programas ya que estos adicionan informacin extra a los archivos que ocasionan problemas al ensamblar el cdigo fuente. 7 1.12 Que Conocimientos necesitas antes de empezar. Hay ciertos prerrequisitos para programar en lenguaje Ensamblador: Primero,debesconocercomoutilizarelsistemaoperativo,nonecesitasserexpertoperodebesestar familiarizado con las funciones bsicas, tales como manipulacin de archivos y uso de discos. Segundo, debes conocer como usar t editor. Tercero, debes tener alguna experiencia de programacin, no debes ser experto, pero debes tener alguna ideadecomousarlacomputadorapararesolverproblemas.Sinohasprogramadoantesmejorempieza con un programa de alto nivel como Pascal C. Finalmente,nodebesescribirprogramasenEnsambladoramenosquecomprendaslaarquitecturayla memoria de la computadora y la aritmtica hexadecimal, que se vern en los siguientes captulos. {_____________o___________} 8 CAPITULO 2SISTEMAS NUMERICOS Nuevos Trminos. Bit.Abreviacindedgitobinario.Launidadfundamentaldealmacenamientodelamemoriadela computadora, un bit tiene uno de dos valores 1 0. Byte. Una unidad de memoria que contiene 8 bits. Word. Una unidad de memoria de contiene 16 bits (2 bytes). Doubleword. Una unidad de memoria que contiene 32 bits (4 bytes, 2 words). Quadword. Una unidad de memoria que contiene 64 bits (8 bytes, 4 words). Paragraph (Prrafo). Una unidad de memoria que contiene 128 bits (16 bytes, 8 words). ASCII.AbreviacindeCdigoEstndarAmericanoparaIntercambiodeInformacin.Uncdigo estndar,usadoparaalmacenarcaracteresdetextoenlamemoria,enlacualcadacarcterest representado por un patrn nico de 8 bits. Sistema Decimal Base 10. Nuestro sistema aritmtico de todos los das, basado en 10 dgitos del 0 al 9. Sistema Binario Base 2. Un sistema aritmtico usado por las computadoras, cuya base son los dgitos 0, 1. SistemaHexadecimal(Hex)Base16.Unsistemaaritmticousadoconlascomputadoras,queest basado en 16 dgitos. Para representar 16 dgitos, el sistema hexadecimal usa 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. Kilobyte K byte Kb. Una unidad de memoria que contiene 1024 bytes (210). Megabyte M byte MB. Una unidad de memoria que contiene 1,048,576 bytes (220). 1 Mb contiene 1024 Kilobytes. 2.1 Bits y Bytes. Parapropsitosdeprogramarenlenguajeensamblador,pienseenlamemoriadelacomputadora como en una secuencia larga de nmeros, 0s y 1s. Por ejemplo: 100100110110010111001001000100010011101011... 9 Cada 0 y 1 es llamado un bit, las computadoras almacenan informacin como una secuencia larga de bits, cada grupo de 8 bits es llamado un byte. Existen otras agrupaciones, como se puede ver en la tabla 2-1. Tabla 2-1Nmero de bits Nombre 8Byte 16Word (2 bytes) 32Doubleword (4 Bytes) 64Quadword (8 bytes) 128Paragraph (16 bytes) 2.2 Como son almacenados los caracteres. Siunacomputadoraslopuedealmacenarsecuenciaslargasde0sy1sComopuedealmacenar informacindiferenteaesa?Existenvariasmaneras.Eltexto,elcualesinformacinconsistentede caracteres, es representado por un cdigo. Como sabemos, cada byte contiene 8 bits y cada uno de estos bits puede ser un 0 un 1; entonces hay 28 256 posibilidades diferentes. Esto es, existen slo 256 patrones diferentes. Estos 256 patrones son usados para formar un cdigo. Un patrn es un smbolo. Por ejemplo la letra A es 01000001; el patrn para la letra Q es 01010001. Este conjunto de patrones, con todos los caracteres que lo forman es llamado American Standard Code for Information Interchange, o ASCII. As,siquieresdecodificarunacadenalargadebits,hayquedividirlosengruposde8paraverque patrones forman. 2.3 El Sistema Binario. Silacomputadorasloalmacena0sy1s,tiene sentido que la aritmtica que la computadora usa estebasadoenestosnmeros.Nosotrosutilizamosnormalmenteelsistemadecimalsinembargola computadora utiliza el sistema binario o base 2. Comoenelsistemadecimalnosotrospodemosrepresentaruncadenadenmerosposicionalesdonde cada nmero representa la multiplicacin de ese dgito con una potencia de 10 de derecha a izquierda. En el sistema binario es exactamente lo mismo slo que se utiliza una potencia de 2. Cuando usamos ms de un sistema numrico debemos indicar que sistema estamos usando cada vez que escribimos un nmero, por convencin dentro del ensamblador se utiliza una B al final de cada nmero binario, ejemplo: 1000(mil en decimal) 1000B (8 en binario) LaTabla2-2muestralosnmerosdecimalesdel0al15.Aunladodecadanmerodecimalestasu equivalente en binario: Tabla 2-2DecimalBinario 00 1011 210 311 4100 5101 6110 7111 81000 91001 101010 111011 121100 131101 141110 151111 2.4 El Sistema Hexadecimal. La principal ventaja del sistema binario es que nos permite trabajar con nmeros exactamente como son almacenados, es decir, como 0s y 1s. Sin embargo hay un inconveniente con el binario, que lo hace muydifcildeutilizar.Laraznesqueesmuchomslargoquesusnmerosdecimalesequivalentes;y adems, las cadenas de 0s y 1s son muy confusas. Por ejemplo, puedes comprender inmediatamente la ecuacin: 125 + 75 = 200 Sin embargo en binario, quedara escrito como sigue: 1111101B + 1001011B = 11001000B Obviamentenecesitamosunsistemaqueseacompacto(comoeldecimal)yquepuedaserusadopara trabajarconlosvaloresdelamemoria(comoelbinario).Elsistemahexadecimal,obase16tieneesas caractersticas. Hexadecimal,oHex,esunsistemaqueusa16dgitos.Debidoaqueslotenemosdiezsmbolospara dgitos(0al9),usaremoslasletrasA, B, C, D, E, y F como los otros seis dgitos. En hex, laA esel diez, B el once, etc. La tabla 2-4 muestra los equivalentes en decimal, binario y hexadecimal. Cuandoescribimosnmerosenhexadecimal,ponemosunaHalfinalparareconocerlos,porejemplo 12H. La tabla 2-3 muestra algunas equivalencias entre decimales y hexadecimales. Tabla 2-3DecimalHex 10A 15F 10064 5001F4 2730AAA 6553610000 11 Tabla 2-4DecimalBinarioHex 00 0 11 1 210 2 311 3 4100 4 5101 5 6110 6 7111 7 81000 8 91001 9 101010 A 111011 B 121100 C 131101 D 141110 E 151111 F 2.5 Medidas del tamao de la Memoria. Lascomputadorasmanejandatosenbytes,noenbits.Poreso,cuandodescribeseltamaodela memoria, dices cuantos bytes contiene. Debido a que la computadora tiene miles o millones de bytes, se usantrminoscomokilobytesmegabytes.Elprefijokiloymegaestatomadodelsistemamtricoque significamilounmilln.Sinembargomilounmilln no son nmeros redondos en el sistema binario. De hecho, usamos 1024 (210) y 1048576 (220). Deestamanera64kilobytesnosignifica64000bytes;sino64x1024(65536)bytes.Elprefijokilose abrevia K y el prefijo Mega se abrevia M. Una relacin que debes recordar siempre es que 1024 K bytes son 1 Mega. 2.6 Conversin entre Hexadecimal y Binario. Elsistemahexadecimalesimportantedebidoa queproporcionaunmodocompactoderepresentar largascadenasdebits.Enlatabla2-5seencuentranlosprimeros16nmeroshexadecimalesysus equivalentes en binario, note que cada nmero binario esta formado por slo 4 dgitos, adicionando ceros cuando sea necesario (Por supuesto adicionar ceros a la izquierda de un nmero no altera su valor). Podemosrepresentarcualquiersecuenciadedgitosbinariosporunasecuenciamspequeadedgitos hex, por ejemplo 00001111B es igual a 0FH. Elsiguienteesunejemploqueconvierteelnmerobinario10011010110101101Bahex.Primero dividimos la cadena de derecha a izquierda en grupos de 4 bits: 1 0011 0101 1010 1101 Despus adicionamos 3 ceros al grupo de ms a la izquierda para tener 4 bits. 120001 0011 0101 1010 1101 Tabla 2-5HexBinario 00000 10001 20010 30011 40100 50101 60110 70111 81000 91001 A1010 B1011 C1100 D1101 E1110 F1111 Ahora usemos la tabla 2-5 para encontrar el dgito equivalente en hex para cada grupo: 0001 0011 0101 1010 1101 1 3 5 A D As vemos que 10011010110101101B es 135AD en hex. Similarmentesiqueremosconvertirunnmerohexadecimalabinariotodoloquenecesitamoses reemplazar cada dgito hexadecimal por su equivalente de 4 bits. Por ejemplo para convertir 72AD2EH a binario. Primero escribimos cada dgito separado. 72AD2E Luego usamos la tabla y escribimos el equivalente nmero de 4 bits debajo del dgito en hex. 7 2 A D 2 E 0111 0010 1010 1101 0010 1110 Ahora,ponemoslosbitsjuntosparaformarelnmerobinario,entonces72AD2EHes 11100101010110100101110B en binario. Mencione antes que puedes considerar a la memoria de la computadora como una larga secuencia de bits. Sinembargocomopuedesver,lascadenasdebitssepuedenconvertirfcilmenteadgitosen hexadecimal (y viceversa). Entonces es ms correcto decir que la memoria de la computadora puede ser considerada como una secuencia de dgitos hex. 2.7 Conversin de Hexadecimal a Decimal. Debes aprender a convertir entre decimal y hex y de hex a decimal, porque la gente maneja decimal pero la computadora almacena la informacin en hex. 13Para convertir de hex a decimal, necesitas recordar la posicinde cada dgito. Por ejemplo, considera el nmero decimal 50786. Este tiene el valor: 5x10000 + 0x1000 + 7x100 + 8x10 + 6 5x104 + 0x103 + 7x102 + 8x101 + 6x100 Si quieres encontrar el valor decimal de un nmero en hexadecimal, puedes hacer lo mismo que acabas de ver pero usando potencias de 16, por ejemplo el nmero AD65H expresando en potencias de 16 es: Ax163+ Dx162 + 6x161 + 5x160 Recordando los valores de los dgitos en hexadecimal expresados con letras podemos sustituir lo anterior por: 10x163 + 13x162 + 6x16 + 5=10x4096 + 13x256 + 6x16 + 5=44389 En general, el procedimiento para convertir de hex a decimal es como sigue: 1. Separe cada dgito hexadecimal y coloque de derecha a izquierda la potencia de 16 adecuada empezando desde cero. 2. Sustituya los dgitos A, B, C, D, E, F por los valores en decimal apropiados. 3. Haga las operaciones correspondientes. 2.8 Conversin de Decimal a Hex. Paraconvertirdedecimalahexadecimal,debes dividirelnmerodecimalentre16repetidamente. Los residuos te darn los dgitos hexadecimales, leyndolos de derecha a izquierda. Por ejemplo convierta 14855 de decimal a hex: Cociente Residuo 14855 / 169287 928 / 16580 58 / 16310 3 / 1603 Ahoraseescribentodoslosresiduosdeabajohaciaarribadeizquierdaaderecha,sustituyendolos valores de 10, 11, 12..etc., por A, B, C..etc. 14855 =3A07H Este es el procedimiento general para convertir de decimal a hex: 1. Divida el nmero decimal entre 16 repetidamente hasta que el cociente sea 0. 2. Para obtener los dgitos en hexadecimal, escriba abajo los residuos, de derecha a izquierda. 3. Si cualquierade losresiduoses 10, 11, 12, 13, 14 15,cmbielospor A, B, C, D, E F14respectivamente. 2.9 Conversin de Binario a Decimal. Existen dos maneras de convertir un nmero binario en decimal. La primera es convertir el nmero binarioahexyluegoelnmeroenhexadecimal.Comoejemplo,convirtamos10110011Badecimal. Primero convertiremos a hex separando los bits en grupos de 4: 1011 0011 Bajo cada grupo, escribimos el equivalente nmero hexadecimal: 1011 0011 B 3 Entonces,10110011BesigualaB3Henhex.AhoraexpresemosB3Hcomolasumadelosdgitos multiplicndolo por la potencia de 16 apropiada (recuerde cambiar la B por 11): 11x16 + 3 Evaluando lo anterior obtenemos el resultado en decimal, 179. El segundo mtodo para convertir de binario a decimal es hacer lo anterior directamente como lo hicimos paraelhexadecimal.Expresemoselnmerobinariocomolasumadelosdgitosmultiplicandoporlas potencias de 2 apropiadas. As para evaluar la expresin 10110011B tenemos: 1x27 + 0x26 + 1x25 + 1x24 + 0x23 + 0x22 + 1x21 + 1x20 o lo que es lo mismo: 1x128 +0x64 + 1x32 + 1x16 + 0x8 + 0x4 + 1x2 + 1=179. 2.10 Conversin de Decimal a Binario. Existen dos formas de convertir de decimal a binario. Primero, conviertes el nmero decimal a hex y despusabinario.Porejemplosupongaquequiereconvertir23406abinario.Paraconvertirloahex, dividimos repetidamente entre 16: CocienteResiduo 23406 / 161462 14 1462 / 1691 6 91 / 165 11 5 / 160 5=5B6EH 15Paraconvertirelnmerohexadecimal5B6EHseparamoscadadgitohexyencontramossuequivalente en binario: 5 B 6 E 0101 1011 0110 1110 =101101101101110B La segunda forma para convertir de decimal a binario es usar el mismo mtodo de divisin para convertir a hexadecimal, slo debemosdividirrepetidamenteentre2enlugardeentre16.Conestemtodolosresiduossonescritosdeabajohaciaarribaydeizquierdaaderecha,dndonoselnmerobinario directo: CocienteResiduo 23406 / 2117030 11703 / 258511 5851 / 229251 2925 / 214621 1462 / 27310 731 / 23651 365 / 21821 182 / 2910 91 / 2451 45 / 2221 22 / 2110 11 / 251 5 / 221 2 / 210 1 / 201= 101101101101110B 2.11 Sumando en Hexadecimal. Algunas veces necesitaras sumar o restar dos nmeros hexadecimales. Por supuesto puedes convertir ambosnmerosdehexadecimalcalcularelresultadoyregresarlarespuestaahex.Lafigura2-6 contiene la tabla de adicin hex. Tratemosdesumar28A70Hms90B6Hcomoejemplo.Escribimoslosnmeroscomoenunasuma normal: 28A70 +90B6 Sumamos cada columna de derecha a izquierda. Primero 0H + 6H = 6H 28A70 +90B6 6 A continuacin, 7H + BH es igual a 12H. Escribimos 2 bajo la segunda columna y tenemos un acarreo de 1. 16128A70 +90B6 26 Ahora, AH + 0H + 1H es igual a BH. Escribimos B bajo la tercera columna. 28A70 +90B6 B26 Despus, 8H + 9H igual a 11H. Escribimos un 1 y acarreamos un 1. 1 28A70 +90B6 1B26 Finalmente, 2H + 1H es igual a 3. 28A70 +90B6 31B26 Tabla 2-6 Adicin en Hex 0123456789ABCDEF 00123456789ABCDEF 1123456789ABCDEF10 223456789ABCDEF1011 33456789ABCDEF101112 4456789ABCDEF10111213 556789ABCDEF1011121314 66789ABCDEF101112131415 7789ABCDEF10111213141516 889ABCDEF1011121314151617 99ABCDEF101112131415161718 AABCDEF10111213141516171819 BBCDEF101112131415161718191A CCDEF101112131415161718191A1B DDEF101112131415161718191A1B1C EEF101112131415161718191A1B1C1D FF101112131415161718191A1B1C1D1E 2.12 Substraccin en Hex. Pararestarenhexadecimalnecesitaslahabilidaddeencontrarladiferenciaentredosnmeros.La figura 2-7 muestra la tabla de substraccin en hex. 17Losnmerosalaizquierdarepresentanelnmeromsgrande.Losnmerosdearribarepresentanlos nmeros ms pequeos. Para hacer una resta, primero busque el rengln y luego la columna. Por ejemplo cuanto ser FH - 8H = 7H Pararestarnmerosgrandes,uselamismametodologaquepararestardecimales.Porejemploreste DB4H - 2A1H: DB4 -2A1 B13 Aqu hay un ejemplo ms complicado; suponga que quiere restar 74AH - 2EFH: 74A -2EF ParaempezardeberestarFHdeAH-peroFHesmsgrandequeAH.Procedajustocomolohara normalmente.Adicione1aAH(borrow)paraconvertirloen1AH.Ahoracalcule1AH-FHlocuales igual a BH 74A -2EF B Ahora,necesitacalcular4H-EH-1H(elborrow).Denuevoexisteunprstamo;estaveznecesita cambiar 4H a 14H. Calcule 14H - EH - 1H. El resultado es 5H bajo la segunda columna. 74A -2EF 5B Finalmente, calcule 7H - 2H - 1H (el borrow). La respuesta es 4H. 74A -2EF 45B 18 Tabla 2-6Tabla de substraccin en hex 0123456789ABCDEF 00 110 2210 33210 443210 5543210 66543210 776543210 8876543210 99876543210 AA9876543210 BBA9876543210 CCBA9876543210 DDCBA9876543210 EEDCBA9876543210 FFEDCBA9876543210 1010FEDCBA987654321 111110FEDCBA98765432 12121110FEDCBA9876543 1313121110FEDCBA987654 141413121110FEDCBA98765 15151413121110FEDCBA9876 1616151413121110FEDCBA987 171716151413121110FEDCBA98 18181716151413121110FEDCBA9 1919181716151413121110FEDCBA 1A1A19181716151413121110FEDCB 1B1B1A19181716151413121110FEDC 1C1C1B1A19181716151413121110FED 1D1D1C1B1A19181716151413121110FE 1E1E1D1C1B1A19181716151413121110F 1F1F1E1D1C1B1A19181716151413121110 {____________o___________} 19 CAPITULO 3LA ORGANIZACION DE LA MEMORIA Como programador de lenguaje ensamblador, debes tener una idea firme de como est organizada la memoriadelacomputadora.Enestecapituloaprendersacercadelasunidadesfundamentalesdela memoriaycomosealmacenan.Aprenderstambindosconceptosimportantesdellenguaje ensamblador, los Registros y la Pila. Nuevos Trminos. Direccin. El nmero asignado a un byte, que indica su posicin en la memoria; el primer byte tiene una direccin 0. Parte baja de la Memoria. En la memoria, son aquellos bytes que estn cercanos al byte 0. Parte alta de la Memoria. En la memoria, son aquellos bytes cercanos al byte con la direccin ms alta. Bits ms significativos Bits de ms alto orden. Los bits de ms a la izquierda en un byte. Bits menos significativos Bits de menor orden. Los bits ms a la derecha en un byte. Limite. Una direccin que es un mltiplo de un nmero especifico. Limite Word. Una direccin que es un mltiplo de 2. Alineado (a un limite). Describe a un byte cuya direccin es un lmite especfico. Limite Doubleword. Una direccin que es mltiplo de 4. Limite Quadword. Una direccin que es mltiplo de 8. Limite Paragraph. Una direccin que es un mltiplo de 16. Memoria Primaria. Memoria con que el procesador puede trabajar directamente. MemoriaSecundaria.Memoriaconqueelprocesadornopuedetrabajardirectamente.Lamemoria secundaria reside en los discos. Read Only Memory ( ROM ). Memoria primaria que puede ser leda pero no cambiada. Random Access Memory ( RAM ). Memoria primaria, tambin llamada de lectura-escritura, que puede ser leda y modificada. 20Registro. Uno de los 14 words de memoria lectura-escritura nter construida en el procesador. Acumulador. Otro nombre del registro AX. Registro Base. Otros nombres de los registros BX BP. Registro Contador. Otro nombre del registro CX. Registro de Datos. Otro nombre del registro DX. Cargar ( Load ). Copiar un dato a un registro. Almacenar ( Store ). Copiar datos del contenido de un registro. Pila ( Stack ). Una estructura de datos que te permite almacenar y recuperar datos de manera last-in, first-out, (el ltimo que entra es el primero en salir). Vaca ( Empty ). Describe una pila que no contiene informacin. Meter ( Push ). Almacenar un dato en la pila. Sacar ( Pop ). Recuperar un dato de la pila. Tope de la pila ( Top ). La locacin en la pila que contiene el ltimo campo del dato que fue metido. Procedimiento,FuncinoSubrutina.Unmoduloautocontenido,tambinllamadounafuncinouna subrutina, que es una parte de un programa grande. Llamada a un procedimiento. Empezar a ejecutar un procedimiento. Regresodeunprocedimiento.Cuandounprocedimientosetermina,paracontinuarejecutandoel programa que lo llamo. Direccin de regreso. La locacin a que un procedimiento regresa cuando este termina. 3.1 Direcciones de Memoria. Lamemoriadelacomputadoraestaorganizadaenbytes.Todoslosbytesestnnumerados empezando desde 0. El nmero de un byte es llamado su direccin. Cuando el procesador necesita leer un byte, este manda la direccin de la memoria, la memoria regresa entonces la informacin en ese byte al procesador.Entoncescuandoelprocesadornecesitaescribirunbyte,estemandadossealesala memoria:ladireccindelbyteylainformacinaserescrita.Lamemoriacopialainformacinalbyte especfico. Los bytes cercanos al byte 0 se conocen como laparte baja de lamemoria.Los bytes cercanos a lamsaltadireccinsonllamadospartealtadelamemoria.Piensaquelosbytesestnacomodadosenorden, uno hasta arriba de los otros, con el byte de la direccin 0 hasta abajo. Tepuedesreferiraunbyteconsudireccin.Cuandoterefierasaunapalabra(word),doblepalabra (doubleword), palabra cudruple (quadword), o prrafo (paragraph), puedes usar la direccin de su primer byte.Porejemplo,sidicesqueunapalabraestaalmacenadaenlaslocaciones10926Hy10927H,te 21puedesreferiraellascomoladoblepalabraen10926H.Seasumequeelsegundobyteestenla direccin de ms arriba. 3.2 Como son almacenadas las Palabras ( words ). Losviejosprocesadorespodantransferirde1a2bytesalavez,perolos386y486pueden transferir ms de 4 bytes a la vez. Cuando los bytes son escritos a la memoria, estos son almacenados de manera recta. Sin embargo, cuando las palabras son escritas a la memoria, los dos bytes de cada palabra son almacenados en orden inverso. Aqu hay un ejemplo digamos que tu programa escribe una palabra que contiene 1234H en la direccin de la memoria 500H. Los dos bytes de la palabra son almacenados en 500H y 501H. Podras esperar que la informacin fuera almacenada como: 4FEH 4FFH500H 501H 502H 503H Sin embargo, estn actualmente almacenadas como: 4FEH 4FFH500H 501H 502H 503H De los detalles se encargan automticamente la memoria y el procesador. Cuando el procesador necesita una palabra, sabe cambiar el orden de los bytes que recibe. La nica vez que tienes que preocuparte acerca del orden de los bytes es cuando usas un debugger para desplegarunreadelamemoria.Entalescasosdebesmantenerenmentequelaspalabrasestn almacenadas con los bytes en orden inverso. Si los datos estn almacenados como bytes esto si estn en el orden normal. 3.3 Como estn almacenados los Bits. Un byte es la unidad ms pequea que puede ser almacenada o recuperada de la memoria. El nico mododetrabajarconunbitesaccederalbyteenelcualelbitestacontenido.Parahacerestohay instrucciones especiales que te permiten examinar y cambiar bits particulares. En un byte, el orden de los bits es especialmente importante, por esta razn tenemos un modo estndar de referirnos a cadabit, losbits estnnumerados desde el0al7,iniciando porla derecha. La figura3-1muestra un byte que contiene el cdigo ASCII de la letra D. Figura 3-1 7 6 5 432 1 0 22 Los bits de ms a la izquierda son llamados los ms significativos y los de ms a la derecha son los menos significativos. Cuando almacenas informacin todos los bits son importantes. 3.4 Limites. Enelcapitulo2expliquecomolosbitsseagrupanenbytes,palabras,palabrasdobles,palabras cudrupleyprrafos.Comosabemoslamemoriadelacomputadoraconsistedemuchosbytes.La direccindelprimerbytees0H,ladelsegundo1Hyas.Algunasveceslosdatosnecesitanser almacenadosdemaneraqueempiecenenalgntipodedireccinparticular,llamadounlimite (boundary). Un lmite es una direccin que es el mltiplo de un nmero especfico. Todaslasdireccionesquetieneunlmitede2sedicequetienelmitedeunapalabra.Dichodeotra forma, empezando con la direccin 0H, cada segundo byte en la memoria tiene como limite una palabra. Si el primer byte de algn dato esta en una direccin limite hexadecimal, podemos decir que el dato esta alineado con el limite de la palabra (esto es, el dato inicia en el limite de la palabra). Por ejemplo, el dato que inicia en la locacin 108A6H esta alineado con el limite de una palabra (acaba en par); los datos que inician en 108A7H no estn alineados con el limite palabra. Similarmente,cadacuatrobytes,empezandodesde0H,decimosqueesellmitedeunapalabradoble. Los lmites de las palabras dobles son direcciones que finalizan en 0H, 4H, 8H, o CH. Para continuar con la analoga los lmites de palabras cudruples son direcciones que finalizan en 0H o 8H; los lmites de un prrafo terminan siempre en 0H. Ocasionalmente cierto tipo de datos deben de estar alineados a un lmite particular.Algunasveceselensambladorlohaceautomticamenteperootrastendrsquehacerlot mismo. Como referencia, la tabla 3-2 tiene los lmites de las direcciones de memoria. Tabla 3-2Lmites de alineacin LimiteDefinicinLa direccin finaliza en... WordCada 2 bytes0H, 2H, 4H, 6H, 8H, AH, CH, EH DoublewordCada 4 bytes0H, 4H, 8H, CH Quadword Cada 8 bytes0H, 8H Paragraph Cada 16 bytes0H 3.5 Memoria Primaria y Secundaria. Generalmente cada computadora tiene dos tipos de memorias: memoria primaria y secundaria. Los procesadorespueden trabajardirectamentesloconlamemoria primaria, la cual es la memoria que esalmacenada en pequeos chips incluidos en los circuitos de la tarjeta en la computadora. Una computadora personal utiliza dos tipos de memoria chip. Read-Only Memory (ROM), que puede ser leda pero no puede ser cambiada. La ROM es usada para mantener datos importantes que estn definidos para ella. Estos datos no desaparecen cuando la computadora se apaga. 23 LoschipsRead-WriteMemory,proveenmemoriaquepuedeserledaycambiada,estoschipsson usualmente llamados random-access memory (RAM). LaRAMesusadaparamantenerenlamemoriaprimarialoqueusalacomputadora.Cuandousasun programadecomputadora,debesprepararciertasreasdelamemoriaparaalmacenardatos.Cuando corresunprograma,lasinstruccionesconsuspropiasreasdedatosdebensercargadasdentrodela RAM por el sistema operativo. La memoria secundaria reside en los discos. El procesador no puede acceder directamente a este tipo de memoria. Antes de que los datos puedan ser usados, estos deben ser ledos a la memoria primaria. Cuando trabajescondatosendiscosdebesleerlainformacinaunreadelamemoriaprimariaquetapartas cuandodiseastuprograma.Similarmente,elprocesadornopuedeescribirdirectamentealosdiscos, debes transferir los datos de un rea de la memoria. Por conveniencia, cuando use el trmino memoria significar memoria primaria. 3.6 Registros. Debe parecer un poco lento el que el procesador trabaje slo con la memoria primaria, cada byte a ser usado debe ser transferido y regresado. Sin embargo hay una pequea cantidad de memoria construida dentrodelprocesador.Estamemoriaconsistede14palabrasdememoriaread-write.Cadaunadeestas palabras es llamada un registro y cada registro tiene su propio nombre y propsito. La tabla 3-3 es una lista de los registros y sus abreviaciones. Como podemos ver los registros caen en tres categoras: Registros generales, registros de desplazamiento y registros de segmento. Tabla 3-3Los registros. NombreAbreviacinCategora AcumuladorAX (AH, AL)Registro General Registro BaseBX (BH, BL)Registro General Registro ContadorCX (CH, CL)Registro General Registro de DatosDX (DH, DL)Registro General Apuntador BaseBPRegistro de Desplazamiento Apuntador de InstruccinIPRegistro de Desplazamiento Apuntador de PilaSPRegistro de Desplazamiento ndice DestinoDIRegistro de Desplazamiento ndice FuenteSIRegistro de Desplazamiento Registro de Segmento de Datos DSRegistro de Segmento Registro de Segmento ExtraESRegistro de Segmento Registro de Segmento de PilaSSRegistro de Segmento Registro de Segmento CdigoCSRegistro de Segmento Registro de Banderas(ninguno) (ninguno) 3.7 Lo Registros Generales. 24 Existencuatroregistrogenerales:AX,BX,CXyDX.Estosregistrosofrecenunalmacenamiento temporalmuyconvenienteparacualquiertipodeinformacin.Ellossonusadosespecialmentepara aritmtica,debidoaquelosregistrosestnconstruidosdentrodelprocesador,lasinstruccionesquelos usan se ejecutan de manera ms rpida que las instrucciones que utilizan la memoria regular. Puedes usar estos registros como desees. Sin embargo AX, BX y CX tambin tienen propsito especiales. AXeselregistroprincipalusadoparainstrucciones aritmticas (tambin puedes usar los otros registros generales). AX puede ser usado para guardar el resultado de un clculo. Por esta razn algunas veces es llamado acumulador. BX (tambin BP) algunas veces es llamado registro base, debido a que pude ser usado para mantener una direccin base. CXesusadoconciertasinstruccionesparaejecutaroperacionesrepetitivas.Entalescasos,CXdebe contener el nmero de veces que quieres repetir una operacin. As CX, es considerado como el registro contador. DX es llamado registro de datos porque es usado para mantener datos para propsitos generales. Cuando copias informacin al registro, Cargas datos dentro del registro. As se pueden almacenar datos. Todosestosregistroscontienen2bytes(16bits),puedescargaryalmacenar2bytesalavez.Sin embargo, a veces es necesario cargar y almacenar slo 1 byte a la vez. El procesador permite hacer esto reconociendonombresalternativosparaestosregistros.Estosnombresalternativosserefierenauna mitad del registro. Losnombresalternativosparaelregistro AX, son AH y AL. La H y L significan High y Low. AH se refiere a la parte alta del registro AX; AL se refiere a la parte baja de ese registro. Puedes acceder al registro completo usando AX, o la parte izquierda o derecha usando AH o AL. Dehecho,sidecimosqueAXcontiene1234H,AHcontiene12H,yALcontiene34H.Sicargas00Ha AH, AX contendr 0034H. Como se muestra en la siguiente figura: AXAX AHAL AHAL Puedes tener el mismo acceso para los registros BX, CX y DX. 3.8 La Pila. Unapilaesunaestructuradedatosquetepermitealmacenaryrecuperarinformacindemanera last-in, first-out. Casi todos los programas en ensamblador utilizan una pila, as que al principio de cada programa debe tener algunas instrucciones para dar de alta a la pila. 25Cuando tu programa inicia, la pila no tiene datos en ella, Nosotros podemos decir que la pila esta vaca. Cuandousas lapila paraalmacenar undato sedice quehaces unpush a lapila. Cuando recuperas estedato,hacesunpopfueradelapila.Existeninstruccionesespecialesparahacerlespushypopalos datos. Cuando hace un pop de dato, este es removido de la pila. Como parte del pop puedes especificar a donde va a ir el dato que sacaste. Por ejemplo podras hacer un pop al registro AX. Piensequelapilaesunapiladeplatosdeunacafetera.Hacespushalosplatosunoalavezpara colocarlos en la pila de platos, y cuando necesitas un plato haces un pop de un plato a la vez. El plato al quelehicisteunpopsiempreeselltimoquecolocasteenlapila.Lalocacindealmacenamientoque contiene el ltimo campo con dato que fue puesto en la pila se conoce como el tope (top) de la pila. La figura3-3muestraun ejemplo,que ilustra las operaciones de push y pop a la pila. El ejemplo inicia con una pila vaca en la cual se hace un push al nmero 10 y 87,despus se le hace unpopaltope delapila Pararecuperarel87,selehaceunnuevopushalapilaconunvalorde68,ydespusdospoppara recuperar los nmeros 68 y 10 respectivamente. Tabla 3-3 Un ejemplo del uso de la pila pushpush pop pushpoppop 1087 68 Cuandoescribesunprograma,debesinstruiralensambladorparaapartarunespacioparalapila.Cada entradadelapilaesde1palabra(2bytes)ylapilapuedetenerunalongitudde64Kbytes.Aslapila puede mantener 32K (32768) entradas. En otras palabras, puedes hacer un push a 32768 palabras de datos a la pila. Usualmente,noesnecesariotenerunapilatangrande.Sinembargo,puedesescogereltamaoquesea msadecuado.Comoreglageneralsinoestassegurodelespacioquenecesitas,aparta256palabras (200Hbytes).Losprogramadoresquetrabajanconprogramaspequeosdejanslo128palabras(100H bytes). 3. 9 Como es usada la Pila. Lapilaestadiseadaparamantenerinformacin temporalmente. Esto es especialmenteimportante cuandoestastrabajandoconprocedimientos.Muchosprogramasdetamaomedioygrandeestn separadosenmdulosautocontenidosllamadosprocedimientos.(Enlenguajesdealtonivelestosse conocencomo funciones o subrutinas). Cuando un procedimiento invoca a otro procedimiento, decimos queelprimerollamaalsegundo.Cuandoelsegundoprocedimientotermina,elprogramaregresaal primer procedimiento en la siguiente instruccin despus de la llamada. 26Comopartedelaejecucindeunainstruccindellamada,elprocesadordebesalvarlalocacindentro delprimerprocedimientoenelcualcontinuarcuandoelotroprocedimientotermine.Estalocacines conocida como la direccin de regreso. Elprocesadorsalvaladireccinderegresoponindolaenlapila.Cuandoelsegundoprocedimiento termina, el procesador saca la direccin de regreso de la pila y contina con la ejecucin en esa locacin. Debido a la estructura de la pila un procedimiento puede llamar a otros y esos otros a otros y siempre se regresara la locacin correcta. Otro uso importante de la pila es salvar el contenido de los registros antes de llamar a un procedimiento. Antes de que el procedimiento regrese los registros pueden ser restaurados sacando los viejos valores de la pila, esto permite a los procedimientos hacer un uso libre de los registros. La pila tambin puede pasar informacin de un procedimiento a otro. Un procedimiento puede poner sus datos en la pila (parmetros) y entonces el segundo procedimiento acceda a los datos. Si es necesario, el segundo procedimiento podra usar la pila para devolver datos tambin. Unusofinaldelapilaesmantenerresultadostemporalmentesobretodoparaoperacionescomplejas. Cada mtodo a escoger varia dependiendo de la lgica de un programa especifico. {____________o___________} 27 CAPITULO 4TIPOS DE DIRECCIONAMIENTO En este capitulo aprenders a apreciar ms la arquitectura de los procesadores de la familia Intel 86, y tambin las varias maneras de referirse a las locaciones de memoria en un programa. Este tpico, el direccionamiento es muy complejo, si eres un principiante te recomiendo leer este capitulo msdeunavez.Laprimeravezleetodocomoestaytratadeabsorbertantocomopuedas,note preocupesporcomprendertodo.Despusunavezqueiniciesahacertusprimerosprogramasvuelvea leerlo con calma. Nuevos Trminos. Direccin efectiva. Una direccin completa de 20 bits. DireccindeSegmento.Unnmerode20bitsquecontieneelvalorbasedesdeelcualunadireccin efectiva es calculada. Offset. Un nmero de 16 bits que es adicionado a una direccin de segmento para calcular una direccin efectiva. Segmento. Un rea de la memoria, con ms de 64 Kb de longitud, que contiene una parte del programa. RegistrodeSegmentos.Unregistroquecontienelos16bitsmssignificativosdeunadireccinde segmento; uno de los registros CS, SS, DS o ES. Segmento de Cdigo. Un segmento que contiene las instrucciones mquina de un programa. Segmento de Datos. Un segmento que contiene los datos usados por el programa. Segmento Extra. Un segundo segmento que contiene datos usados por el programa. Segmento de Pila. Un segmento que contiene a la pila que usa el programa. Direccionamiento Directo. Una direccin en la cual es desplazamiento esta indicado directamente. 28 DireccionamientoIndirecto.Unadireccinenlacualeldesplazamientoestaespecificadoporelvalor de un registro. ndice.Usado paracalcularunoffset adicionando un valor (llamado un desplazamiento) a una locacin fija (llamada la direccin base). Direccin Base. Una locacin fija que sirve como una base para calcular un offset. Desplazamiento. Un valor que adicionado a la direccin base nos da un offset. Registro ndice. Un registro que contiene un desplazamiento; uno de los registros DI o SI. 4.1 El esquema bsico de Direccionamiento en la PC. Lasinstruccionesmquinatrabajancondireccionesdehasta16bits.Estaesunalimitanteenel modorealqueDOSusa.As,lasposiblesdireccionessondesde0000HhastaFFFFH (0000000000000000Ba1111111111111111B).Estodacomoresultado10000H(64K)direcciones diferentes.Esotraspalabras,usandounesquemadeestetipo,elprocesadorslotienehasta64Kde memoria disponible. Pero64Knoesmuchamemoria,situviramosqueconstruirprogramasconslo64Kestaramos severamente limitados, As que es imperativo que el procesador pueda accesar ms memoria. La solucin es ingeniosa, pero algo complicada. Es importante que comprendas este esquema, as que lee la siguiente seccin con cuidado. Vamos a hacer una analoga. Suponga que tiene un robot con un brazo mecnico que puede mover y que tiene un largo de 64 pulgadas. Si el robot esta en un cuarto fijo en un lugar, el brazo slo puede alcanzar los objetos que estn a 64 pulgadas de distancia mxima. Sin embargo si el robot se pudiera mover por el cuarto, el brazo podra alcanzar cualquier objeto. Si un objeto no esta dentro de las 64 pulgadas del brazo lo nico que tiene que hacer el robot es moverse ms cerca. En otras palabras, piense que si el brazo del robot tiene una distancia 64 pulgadas, puede tomar cualquier objeto en el cuarto estableciendo una base a 64 pulgadas del objeto. ElprocesadordeInteltieneunesquemaparecido.Sibienunadireccinde16bitspuedeaccesarslo 64K bytes, se puede usar una muy grande cantidad de memoria considerando la direccin de 16 bits como la direccin base relativa. Para accesar otros 64 K diferentes, todo lo que hay que hacer es mover la base. Dentrodeunprograma,ladireccinconsistededospartes:unadireccindesegmentoyunoffset.La direccindesegmentoesunnmerode20bitsquecorrespondealaposicinbasedelrobot.El desplazamiento es un nmero de 16 bits que corresponde al brazo movible. La direccin actual es llamada la direccin efectiva. Para calcular la direccin efectiva, todo lo que tienes que hacer es sumar el offsetal la direccin de segmento. 29Aquhayunejemplo:Digamosqueladireccindesegmentoes50000Hyeloffsetes62A3H.La direccin efectiva es 50000H + 62A3H, lo cual es igual a 56A3H. Ahora, si el segmento de direccin es 50000H y el desplazamiento puede tomar los valores desde 0000H hasta FFFFH, la direccin efectiva varia desde 50000 hasta 5FFFFH. As, con un segmento de direccin de 50000H, puedes accesar los 64K (10000H) bytes de memoria que empiezan en 50000H. Supongaquequiereaccesaralgunosdatosdeladireccin8726BH.Estadireccinnoestaenelmismo rango,asquenecesitascambiardesegmentoconsus64Kqueesteentre8726H.Porejemplo,podras cambiar la direccin de segmento a 80000H y usar un offset de 726BH. Actualizandoladireccindesegmentoapropiadamente,puedesaccesarcualquierbyteenunamemoria grande. Asegurndote que el byte este dentro de los 64K del segmento de direccin. El hardware calcula la direccin efectiva de modo que el resultado siempre es un nmero de 20 bits. As ladireccinefectivapuedetenerunrangodesde00000HhastaFFFFFH.Estoda100000Hposibles direcciones. Enotraspalabrasusandounacombinacindedireccindesegmentoyoffsets,elprocesadorpuede direccionar ms de 100000H bytes de memoria. Esto es igual a 1024K bytes o 1 Megabyte, mucho mejor que slo 64K. Esimportantecomprenderquediferentescombinacionesdedireccionesdesegmentoydesplazamientos puededarlamismadireccinefectiva.Dehecholosparesdedireccionesdesegmentosy desplazamientos en la tabla 4-1 dan la misma direccin especifica 8726BH. Tabla 4-1Direcciones de SegmentoOffsetDireccin efectiva 80000H+726BH=8726BH 87000H+026BH=8726BH 87260H+000BH=8726BH 85AD0H+179BH=8726BH De los detalles se encargan automticamente el procesador y el ensamblador. 4.2 Segmentos y Registros de Segmento. Parapoderimplementarelesquemadedireccionesexplicadoenelpuntoanterior,elprocesador requierequetodoslosprogramasseandivididosensegmentos.Unsegmentoesunreadememoriade ms de 64K., si necesitas disear un programa largo, debes dividirlo en piezas donde cada pieza quepa en unsegmento.Cuandoescribesunprograma,existenciertasinstruccionesdelensambladorqueindican donde empieza y termina cada segmento. Cuando el programa se ejecuta, el procesador mantiene unadireccin de segmento para cada segmento. Estas direcciones son mantenidas para los registros CS, DS, ES y SS. Unprogramapuedetenervariossegmentos,peroslocuatropuedenestaractivosalavez.Loscuatro segmentosestnestandarizados;yseconocencomosegmentodecdigo,segmentodedatos,segmento extraysegmentodepila.Todaslasdireccionesusadasparaunsegmentodadousanelregistrode segmento como base. El segmento de cdigo es la parte del programa que contiene las instrucciones mquina actuales (algunas veces llamadas cdigo). El registro CS contiene la direccin de segmento de ese segmento. 30 El segmento de datos es la parte del programa que contiene los datos. El segmento extra tambin puede serusadoparaalmacenardatos,siesnecesario.ElregistroDScontieneladireccindelsegmentode datos; el registro ES contiene la direccin de registro del segmento extra El segmento de pila contiene a la pila, el registro SS, contiene la direccin del segmento de pila. Todos los programas deben tener al menos un segmento de cdigo y un segmento de pila. Estrictamente hablando,lossegmentosdedatosyextrasonopcionales,perolamayoradelosprogramastienen tambin un segmento de datos. 4.3 Como son usados los Registros de Segmento. Comosabestodaslasdireccionestienedospartes:ladireccindesegmentoyeloffset.Enun programa escribes una direccin especificando las dos partes separadas por dos puntos. La primera parte es el nombre del registro de Segmento. Por ejemplo, digamos que quieres referirte a informacin en el segmento de datos. Si el desplazamiento delainformacines6AH,puedesescribirladireccincomoDS:6AH.Parareferirtealsegmentoextra con un desplazamiento de 1A5H, escribes ES:1A5H. Cuando el programa se ejecuta el procesador adiciona el offset al contenido del registro de segmento para obtener la direccin efectiva. As si la direccin es DS:6AH, el procesador adiciona 6AH al contenido de DS.

Por supuesto, este esquema slo trabaja si cada registro de segmento tiene su propio valor. As es como pasa:Antesdequeunprogramaseaejecutado,estedebesercopiadoalamemoria,esteprocesoes llamado carga, y es realizado por el sistema operativo, cuando un programa es cargado este se copia a un readelamemoriaqueesteactualmentedisponible.Esteautomticamentefijalasdireccionesqueel programa usar. Cuando escribes un programa no sabes que direcciones tendr. De hecho cada vez que un programa corre, lossegmentospuedensercargadosenlocacionesdiferentes.Sinembargoesimportantequeunregistro de segmento sea inicializado con un valor apropiado si el programa va a correr correctamente. Comopartedelprocesodecarga,elsistemaoperativoinicializalosregistrosCSySSparaapuntaral principiodelcdigoylapila,respectivamente.As,lasinstrucciones(elsegmentodecdigo)ylapila son accesados automticamente. Debido a que no todos los programas tiene segmento de datos o segmento extra, el sistema operativo no inicializaautomticamentelosregistrosDSyES.Estodebeshacerlotmismo,hastaquelohagas,los datosesesossegmentosnoestarnaccesibles.Afortunadamente,todaslasinicializacionesrequieren pocas instrucciones estndar que colocas al inicio de cada programa. 4.4 El contenido del Registro de Segmento. 31Comomencione antes,elregistrode segmento contiene la direccin de un segmento. La direccin desegmentodebeteneralmenos20bits,perotodoslosregistrostienenslo16bits.Comopuede contener un registro de 16 bits, 20 bits?

Lasolucinesasumirqueelregistrocontieneslolos16bitsmssignificativosdeladirecciny asumimos que los otros 4 bits son todos ceros. En otras palabras, si cada direccin de segmento es de 5 dgitoshex(20bits),unregistrodesegmentocontieneslolosprimeros4dgitoshex;elltimodgito hex se considera como 0H. Aquhayunejemplo:Digamosqueelsistemaoperativocargaelsegmentodecdigoen217A0Hyel segmento de pila en 1F8A0H. El registro CS estar dado por el valor 217AH y el valor del registro SS es 1F8AH. En cada caso debes extender los valores por 0H (0000B) para obtener la verdadera direccin de segmento. Comopuedesver,asumiendoquetodaslasdireccionesde20bitsterminanen0H,slonecesitas almacenar los primeros 16 bits de cada uno. La carga de los segmentos es hecho por el ensamblador y el sistema operativo y los segmentos siempre estarn alineados al limite de un prrafo. Lanicavezquenecesitaspreocuparteacercadetodoestoescuandocalculasunadireccinefectiva. Cuandolohagasrecuerdaadicionarelvalorextra0Halvalordelregistrodesegmentoparaobtenerla verdadera direccin de segmento. Veamoscomohacerlo.Digamosqueestasusandoundebuggeryquieresexaminaralgunosdatosenel segmento de datos. El offset es 17A5H y el valor de DS es 20ABH. Primero escribe el valor del registro de segmento: 20ABH Despus adiciona 0H al valor para obtener la direccin de segmento verdadera. 20AB0H Finalmente adiciona el offset a la direccin de segmento: 20AB0H +17A5H 22255H Puedes instruir al debugger para desplegar los datos en esa direccin. 4.5 Como es implementada la Pila. La imagen de los platos en la cafetera es buena para aprender como trabaja el concepto de una pila, perosuimplementacinesunpocodiferente,estoesdebidoaquenoesposiblemovertodoslosdatos hacia arriba o hacia abajo cada vez que metemos o sacamos un elemento. En su lugar, la pila es manejada con un segmento con dos registros especiales. El registro SS siempre contiene la direccin de segmento de la pila. El sistema operativo pone ese valor cuandoelprogramasecarga.Cuandoelprogramaseejecuta,elregistroSSpermanecesincambios (a menos que se use un registro de pila diferente). 32El registroSP(apuntadordepila)contiene un offset que apunta al tope de la pila. Esto es, en cualquier caso, la direccin efectiva del tope de la pila estar formada por los contenidos de los registros SS y SP. Lapilaestaorganizadacomounalistaconentradasde16bits(2bytes).ElregistroSSapuntaala direccin ms baja de la lista. La primera instruccin push coloca datos en la entrada con la direccin ms alta,lasiguienteinstruccinpushcolocadatosenlaentradaconlasiguientedireccinmsalta,yas. Todas las veces, el registro SP apuntar al ltimo dato que fue metido (el tope de la pila). En otras palabras, la pila inicia desde la direccin ms alta y crece hacia abajo hasta su base. La figura 4-1muestraundiagramadelapilaquefuecargadaen10000H.Lapilatieneunalongitudde200H(512 bytes). En este ejemplo, dos campos son empujados a la pila, el campo nombrado data1 fue empujado primero, enlalocacin101FEH.Elcamponombradodata2fuemetidoensegundoen101FCH.Notequecada datoirquedandomscercadelabasede la pila. Actualmente la direccin base o registro SS contiene 1000H y el registro SP contiene 01FCH. Figura 4-1 La Pila En general, esto es lo que pasa cuando un dato es introducido a la pila. 1. SP es decrementado en 2 para apuntar a la siguiente locacin libre. 2. El campo a ser metido es copiado al offset especificado por SP. Esto pasa cuando un dato es sacado de la pila: 1. El campo al que SP apunta es copiado a la locacin apropiada. 2. SP es incrementado en 2 para apuntar a la siguiente entrada de la lista. En el ejemplo anterior el registro SP esta inicializado a 200H. EL primer push decrementar SP a 01FEH antes de almacenar el data1, si todos los campos en la pila son sacados y la pila esta vaca SP apuntar de nuevo a 0200H. 4.6 Direccionamiento Directo. 33Dentro de un programa puedes referirtea locacionesde memoriaespecficas.Paraaccederesaslocacionesdememoria,elprocesadornecesitaconocerladireccindelsegmentoyeloffset.Puedes escribir esta informacin especificando el nombre del segmento y un offset, separado por dos puntos. Porejemplo,paraespecificarlalocacinenelsegmentodedatosquetieneunoffsetde10AH,puedes escribir DS:10AH Comoesunpocoproblemticoreferirtealosdesplazamientosusandonmeros,elensambladorte permite usar nombres. Cuando creas el segmento de datos y el segmento extra, dejas un espacio para los datos que usaras, as puedes asignarle nombres a esos campos de datos. El ensambladormantieneunatabla concada nombre y su desplazamiento. Cuando usas una instruccin refirindoseaunnombre,elensambladorlosubstituyeporsudesplazamientoactual.Ascuandote refieres a un campo dato, se dice que usas un direccionamiento directo. Porejemplo,digamosqueelnombreSUMtieneundesplazamientode10AHenelsegmentodedatos. Puedes referirte a esa locacin como DS:SUM Lo bueno de esto, es que no tienes que rastrear su desplazamiento actual por ti mismo. Muchasdelasveces,puedessimplificarlascosasanms.Cuandohacesreferenciaaunalocacinde memoria, el procesador asume que est en el segmento de datos a menos que especifiques otra cosa. As puedes referirte a la locacin slo como: SUM Tiene que especificar un registro de segmento si el dato no est en el segmento de datos. Por ejemplo, si SUM estuviera en el segmento extra, debes hacer referencia a la locacin como: ES:SUM 4.7 Direccionamiento Indirecto. Algunas veces,quieresusarun desplazamiento que esta en un registro. Para hacer referencia a esa locacin, debes especificar el nombre del registro encerrado entre parntesis cuadrados. Por ejemplo, digamos que el registro SI contiene 1000H, si una instruccin contiene SI Se refiere al valor en SI, llamada 1000H. Sin embargo, si la instruccin contiene [SI] 34Esteserefierealdatoeneloffset1000H.Enotraspalabras,cuandounregistroestaencerradoentre parntesiscuadrados,esterepresentaaldatoeneldesplazamientocontenidoenelregistro,estoes llamado direccionamiento indirecto. CualquieradelosregistrosSP,BP,BX,SI,yDIpuedenserusadosparadireccionamientoindirecto. Muchasdelasveces,noesnecesarioespecificarunregistrodesegmentodebidoaqueelprocesador asume uno. Cuando usas SP o BP, el procesador asume que el desplazamiento se refiere al segmento de pila y usa el registro de segmento SS. Cuando usas BX, SI, y DI, el procesador asume que te refieres al segmento de datosyusaelregistrodesegmentoDS.Asnoesnecesarioespecificarelregistroamenosquequieras suprimir el default. Por ejemplo, digamos que BX contiene el offset de datos del segmento extra, t puedes usar ES:[BX] Hayunaexcepcinimportanteaestasreglas.Cuandousasunainstruccinquemuevestrings,el procesador asume que el registro DI contiene un desplazamiento al segmento extra. Los defaults implcitos para los registros de segmentos se muestran en la tabla 4-2 Tabla 4-2RegistroRegistro de segmento implcito [SP]SS [BP] SS [BX]DS [SI]DS [DI]DS (ES con instrucciones para strings) 4.8 Direccionamiento Indexado. Algunasestructurasdedatosconsistendemsdeunasolaparte.Porejemplo,unarreglo unidimensionalpuedeserconsideradocomounalistadedatos.Unatablabidimensionalpuede considerarse como renglones y columnas. Entodosloscasos,losdatos actualesestn almacenados como una secuencia de bytes, palabras, dobles palabras,etc.Sinembargo,cuandousasesosdatos,ayudadarlesunorden.Dehecho,cuandousasun arreglo es conveniente pensar que el arreglo completo tiene un slo nombre y campos separados son los elementos del arreglo. Parahaceresto,tieneslafacilidaddeutilizarunaindexacin.Laindexacinpermitehacerreferenciaa campos relativos a una locacin fija. De hecho puedes accesar cada elemento del arreglo relativo por su inicio. Esta locacin fija es llamada la direccin base. Considere un arreglo de 100 elementos que existe en el segmento de datos como 100 bytes consecutivos. Cadabytecontieneunelemento.ElnombredelarregloesLIST.Estrictamentehablando,LISTesel desplazamiento del primer byte. As puedes accesar el primer elemento del arreglo usando 35LIST Si quieres accesar otros elementos, el ensamblador te permite adicionar valores al nombre. Por ejemplo, para accesar el siguiente elemento puedes especificar LIST+1 Elnmeroqueadicionasaladireccinbaseesllamadaundesplazamiento,enelltimoejemplo,el desplazamientofuede1.Puedesaccesarcualquierelementodelarreglousandoeldesplazamiento apropiado. Aqu hay algunos ejemplos. LIST+57 LIST+82 LIST+99 Nohayundesplazamientodadoparaelprimerelementodelarreglo,dandoundesplazamientode1 obtenemos el segundo elemento, y as. Si hay cien elementos, el rango de desplazamientos va desde 0 a 99.Eldesplazamientomximodenelementosesn-1.Otromododeverloesqueempezamosacontar desde cero. Por eso, LIST+57 nos da el elemento 58. Porsupuestoestosdesplazamientosfuncionanenarreglosconsistentesdebytes.Considereunarreglo llamado BIGLIST consistente de 100 palabras. Cada palabra ocupa 2 bytes, los desplazamientos relativos a los elementos son como sigue: Primer elementoBIGLIST Segundo elementoBIGLIST+2 Tercer elementoBIGLIST+4 . . . Ultimo elementoBIGLIST+198 4.9 Los Registros ndice. Ocasionalmente,necesitasaccesarloselementosdelaestructuradedatosadicionandoun desplazamientoconstanteaunoffset,porejemploLIST+4.Sinembargo,esmstilusualmente almacenareldesplazamientoenunregistro.LosregistrosSIyDIsonusadosparaestepropsitoyson algunas veces referidos como el registro ndice. Por ejemplo, considera el arreglo LIST consistente de 100 bytes. Decimos que el programa necesita una referenciacadaelementoenturno,desdeelprimerohastaelltimo.PuedesvariarelcontenidodeSI desde 0 hasta 99y usar. LIST[SI] Notedoscosas:primero,cuandousasunregistroparamantenerundesplazamiento,debesindicaral ensamblador el nombre del registro entre parntesis cuadrados, igual a cuando usas un direccionamiento indirecto. 36Segundo, necesitas adicionar un + antes del nombre del registro. La expresin anterior significa el valor de del registro SI adicionado al desplazamiento de LIST. En el ejemplo anterior, puede indexar cualquier elemento de LIST actualizando SIal valor apropiado. De hecho,paraaccesartodosloselementosdelltimoalprimero,varaSIde99hasta0;paraaccesarel elemento 57, pon SI a 56. AhoraconsideraelarregloBIGLIST,elcualconsistede100palabras.Digamosquequieresindexarla usando el registro DI. BIGLIST[DI] CadaelementodeBIGLISTesde2bytesdelongitud,debesactualizaraDIdeacuerdoaltamao.Por ejemplo,paraaccesartodosloselementosdelprimeroalltimo,cambiaaDIa0,2,4,6...198.Para accesar elelemento 57, pon DI a 112, para accesar el elemento n, pon DI a (n-1) x 2. Si necesitas manejar palabras dobles, debes manejar el ndice en mltiplos de 4; con palabras cudruples, mltiples de 8. En lenguajes de alto nivel esto lo hacen por ti, en lenguaje ensamblador, debes hacer esto t mismo. 4.10 Los Registros Base: El registro BX. En la seccin previa, los ejemplos usaban el nombre para almacenar la locacin como una direccin base.Puedestambinutilizarunregistroparamantenerunadireccinbase.BXesusadaparaeste propsitoenelsegmentodedatos;BPesusadaporlapila.Estosregistrossonalgunasveces mencionados como los registros base. Por ejemplo, puedes indexar el arreglo LIST usando LIST[DI] Si pones el desplazamiento de LIST en BX, puedes usar [BX][DI] Comopuedesver,elregistrobaseestaencerradoenparntesiscuadrados.(Notequeelltimoejemplo usa direccionamiento indirecto.) Usandounregistroparamantenerladireccinbaseestilsiquieresaccesarmsdeunaestructurade datos con la misma instruccin. Por ejemplo, puedes tener un programa que procese varios arreglos. Todo lo que tienes que hacer es poner a BX al desplazamiento de cada arreglo en turno y entonces usar DI o SI para mantener el desplazamiento. Porejemplo,digamosquetienesdosarreglosllamadosLIST1yLIST2.Paraaccesaralprimerarreglo, pon BX a LIST1; para accesar el segundo pon BX a LIST2. Paraestructurasmscomplicadas,elensambladorpermiteusarunnombre,unadireccinbase,yun desplazamiento, por ejemplo: 37 TABLE[BX][SI] Elcontenidodeambosregistrosesadicionadoaldesplazamientodelcampodedatos.Dehecho,siBX mantiene un 20 y DI mantiene un 4, el ejemplo anterior tiene el valor TABLE+24 La ventaja de esta doble indexacin es permitirte establecer una direccin base dentro de una estructura de datos. Por ejemplo, digamos que TABLE es una tabla de bytes, almacenada rengln por rengln. Hay 30 renglones y cada rengln tiene 100 elementos; esto es, TABLE tiene 30 renglones y 100 columnas. PuedesponeraBXapuntandoaunrenglnparticularyusarDIoSIparaindexaratravsdelos elementos de ese rengln. En este caso, cada rengln tiene 100 bytes. El primer rengln consiste del byte 0al99;elsegundorenglndelbyte100a199;yas.Paraaccesarelelemento57delrengln18, ponemos BX a 1700 y SI a 56, y usamos TABLE[BX][SI] Esto podra ser lo mismo que TABLE+1756 Siusasunaestructuradedatosquemantieneelementosmsgrandesdeunbyte,puedesajustarla indexacindeacuerdoaltamao.Porejemplo,siTABLEmantienepalabrasenlugardebytes,los renglones empezaran en 0, 200, 400, etc. 4.11 Los Registros Base: El registro BP. Muchas veces, el direccionamiento en una pila es manejado con los registros SS y SP. SS mantiene el registro de direccin y SP mantiene el offset del tope de la pila. Cuando usas una pila haciendo pushs y pops, el procesador actualiza SP automticamente y te permite accesar la informacin en el tope de la pila. Sinembargo,algunasvecesquieresaccesarinformacindentro de la pila. En este caso, usaselregistro BP para mantener una direccin base en la pila. Porejemplo,digamosquetienesdosprocedimientosllamadosAyB.ElprocedimientoApasa informacinaB,yllamaalprocedimientoB.Silacantidaddeinformacinespequea,estapuedeser pasadaenunoovariosdelosregistrosgenerales.Sinembargosinecesitaspasarmsinformacinuna estrategia es que el procedimiento A empuje la informacin en la pila antes de llamar al procedimiento B. As, tan pronto como el procedimiento B inicia, este puede obtener informacin para accesar la pila. Sin embargo,elprocedimientoBnopuedehacerestodemaneradirecta.Ciertamente,elprocedimientoB puedeempujardatosporsimismo.Estohacedifcilrastrearlalocacindelainformacinquefue empujada por el procedimiento A. La solucin esta en el procedimiento B, tan pronto como toma el control, pude salvar el offset del tope de la pila en BP. En otras palabras, la primera cosa que el procedimiento B debe hacer es copiar el contenido 38de los registros SP o BP. Esto significa que no importa que tipo de informacin sea metida en la pila, los datos del procedimiento A pueden ser accesados usando el contenido de BP como una direccin base. Porejemplo,digamosqueelprocedimientoAmete10palabrasdeinformacinenlapila.Cuandoel procedimiento B inicie, la primera cosa que har es salvar el desplazamiento del tope de la pila copiando su contenido al SP o al BP. Ahora el procedimiento B puede accesar la diez palabras, a su conveniencia, desdeSS:BPhastaSS:BP+18.(Recuerdeque10palabrasocupan20bytes).Porejemplolasegunda palabra puede ser accesada como SS:BP+2 En cualquier punto dentro del procedimiento B. Piense que esto se refiere a la palabra que esta dos bytes ms all del tope de la pila cuando el procedimiento B empez. Parahacerlascosasfciles,siemprequeusesaBPcomoelregistrobase,elprocesadorasumequeBP contiene un offset en el segmento de pila y automticamente utiliza SS como el registro de segmento. En el ejemplo anterior tambin podra usar BP+2 4.12 Regla generales para especificar una direccin. Cuandoespecificasunadireccindirecta,usaselnombredecampodatoyunregistrobase, registro ndice, o desplazamiento constante opcional. Aqu hay algunos ejemplos: TABLE TABLE[SI] TABLE[DI]+8 TABLE[BX][SI]+8 Cuando especificas una direccin indirecta, puedes usar SP, BP, BX, SI o DI. Con BP o BX, puedes usar SIDIcomondice.Contodoslosdireccionamientosindirectos,puedesusarundesplazamiento opcional. Veamos algunos ejemplos. [BP] [SI] [BX][DI] [SI]+4 [BP][DI]+4 Con un direccionamiento directo o indirecto, no puedes usar ms de un registro base ni ms de un registro ndice. Elensambladortepermiteespecificarlosvaloresindexadosdevariasmaneras,sujetasalassiguientes reglas: 39 -Los valores ndices pueden estar en cualquier orden -Los nombres de registros deben ir entre parntesis cuadrados -Puedes combinar nombres de registros y desplazamientos constantes en un conjunto de parntesiscuadrados si los separas con +. -Si pones un desplazamiento constante enfrente de un nombre de registro, no necesitas usar un +. Aqu hay varias direcciones directas equivalentes que ilustran estas reglas. TABLE[BX][SI]+8 TABLE[BX+SI+8] TABLE[8+SI+BX] Aqu hay varias direcciones indirectas equivalentes. [BP][SI]+12 12[BP][SI] 12[BP+SI] Obviamente, la mejor idea es tomar unpatrn y utilizarlo. Te recomiendo los siguientes patrones. Para la direccin directa, usa nombre[base][indice]+constante por ejemplo : TABLE[BX][SI]+8 Para un direccionamiento indirecto, usa [base][indice]+constante por ejemplo : [BP][DI]+8 4.13Direccionamiento con el Segmento de Cdigo. Un programa puede tener cuatro segmentos activos: el segmento de cdigo, el segmento de pila, el segmentodedatos,yelsegmentoextra.Deestoscuatro,soloelsegmentodecdigonopuedeser modificadooexplcitamenteaccesadomientraselprogramaesejecutado.Elsegmentodecdigono puede ser accesado porque es el contenido de las instrucciones actuales del programa. 40La direccin en el segmento de cdigo es hecha automticamente por el procesador con los registros CS e IP.ElregistroCScontieneladireccindesegmentodelsegmentodecdigo.ElregistroIPcontieneel offsetdelasiguienteinstruccinaserejecutada.Cuandocadainstruccinseejecuta,elregistroIPes actualizado apuntando a la siguiente instruccin en el programa. Cuandoelprogramacambialasecuenciadeinstrucciones,elprocesadoractualizaelregistroIP apropiadamente.Porejemplo,cuandounprocedimientollamaaotroprocedimiento,eldesplazamiento del otro procedimiento es colocado en IP. Si el segundo procedimiento esta en un segmento diferente, el registroCSdebeseractualizadotambin.Estotambinlorealizaelprocesadorcuandollamauna instruccin CALL. El direccionamiento dentro de un segmento de cdigo es automtico, puedes ignorar los registros CS e IP muchas de las veces. Sin embargo, son importantes cuando usas un debugger para probar un programa. Si ejecutas un programa una instruccin a la vez, puedes examinar CS e IP para mantener el rastreo. Si algo falla, puedes usar a CS e IP para ayudarte a determinar la direccin de la instruccin que causo el error. {_____________o___________} CAPITULO 5LAS PARTES ATOMICAS DE UN PROGRAMA EN ENSAMBLADOR Los programas en lenguaje ensamblador son ms complejos que los de alto nivel. Cada programa en ensamblador tiene parte diferentes que debes comprender. En este capitulo aprenders las diversas partes y las reglas para crearlas. Este material es bsico y debes dominarlo para escribir tus programas. Nuevos Trminos Programa Principal. Dentro de un programa, es el primer procedimiento a ejecutarse. Estatuto. Una lnea de un programa en ensamblador. Comentario. Todas las partes de un estatuto que son ignorados por el ensamblador; los comentarios son usados para mantener informacin descriptiva. Instruccin. Un estatuto que puede ser traducido a lenguaje mquina. Directiva Pseudo-operacin. Un estatuto que da instrucciones al ensamblador. Opcode. La parte de una instruccin o directiva que identifica una operacin especifica. Operando. La parte de una instruccin o directiva que representa el valor sobre el cual la instruccin o directiva acta. 41Tabla de smbolos. Una tabla de nombres creada por el ensamblador para procesar un programa. Referencia forward. En un programa, la aparicin de un nombre, que no ha sido definido an. Nombrereservado.Unapalabraalacualelensambladorasignaunsignificadoespecial;laspalabras reservadas no pueden ser usadas como nombres. 5.1 Como ve el programador un programa. Como programador piensa que el programa tiene dos partes -instrucciones y datos. Las instrucciones describenlalgicaylosdatoseselmaterialsobreelqueactanlasinstrucciones.Cuandoveasun programapuedeshacertelassiguientespreguntasQuehaceesteprograma(instrucciones)?Conqu trabaja el programa (datos)? La parte de instrucciones de un programa consiste de uno o ms procedimientos (o subrutinas). El primer procedimientoaejecutaresllamadoelprogramaprincipal.Unprogramapequeopodraconsistirsolo del programa principal y los datos. Un programa grande consiste de datos y de varios procedimientos. 5.2 Como ve el ensamblador un programa. Cuandotvesunprogramaqueconsistedeinstruccionesydatos,elensambladorveunprograma fuente consistente de una secuencia de estatutos, uno por lnea. El ensamblador lee esos estatutos (dos o ms veces), y genera un programa en lenguaje mquina consistente de segmentos. Este programa en lenguaje mquina debe conocer los requerimientos del procesador, estos requerimientos sonaltamentetcnicosydetallados.AfortunadamenteelensambladoryelLinkerseencargandela mayora de esos detalles. Estosignificaque,desdeelpuntodevistadelprogramadorelensambladoresunconjuntodeestatutos quetieneoscurossignificadosdeloquehaceunprograma.Estoeselporquelosprogramasen ensambladorsonmsdifcilesdecomprendequelosdealtonivel.Tdefensacontraestaconfusines desarrollar bueno hbitos de programacin. Laconexinentretupuntodevistadelprogramayeldelensambladoresquelasinstruccionesestn contenidas en el segmento de cdigo. S tu programa tiene ms de un procedimiento, todos estos estarn contenidosdentrodelsegmentodecdigo.Lapartededatosestarcontenidaenlossegmentosdepila, datos y extra. 5.3 Como ve el programa el Linker. El linker no ve el programa como una entidad conceptual o como una secuencia de estatutos. En su lugar, el linker ve uno o ms archivos que contienen mdulos. El trabajo del linker es usar estos archivos para crear un slo archivo que contenga un modulo ejecutable. Por conveniencia, puedes mantener un conjunto de mdulos objeto en una coleccin llamada una librera. El linker buscar la librera y extraer los mdulos objeto particulares que especifiques. 42 5.4 Que pasa durante el proceso de Ensamblamiento. Piense que el ensamblador lee el programa lnea por lnea. Algunas lneas son instrucciones y otras son requerimientos para definir datos. Elensambladorcreaelmoduloobjeto,byteporbyte.Siunalneaenelprogramafuentecontieneuna instruccin, el ensamblador genera la instruccin mquina equivalente y lo adiciona al modulo objeto. Si la lnea especifica un requerimiento de dato, el ensamblador adiciona el nmero apropiado de bytes (para almacenar el dato) al modulo objeto. As, el orden de las instrucciones y las reas de datos en el modulo objeto depende del orden en el cual el ensamblador encuentra las lneas del programa. 5.5 Comentarios. Los programas en lenguaje ensamblador consisten de una secuencia de estatutos. Aqu hay tres tipos de estatutos: comentarios, instrucciones y directivas. Loscomentariossonpartesdeestatutosquesonignoradosporelensamblador.Puedesusarlos comentariosparaincluirdescripciones,enelprograma.Loscomentariossonpartesimportantesdel programayaqueenposicionesclavesdetuprogramasirvencomoguasmaestrasdelsignificadoy propsito del programa.

Hay varias maneras de incluir comentarios. La primera es que cualquier estatuto diferente del blancos que este despus de un punto y coma es considerado un comentario e ignorado por el ensamblador. ; Este es un comentario Segundo,puedeadicionaruncomentarioal final de una instruccin o directiva marcando elcomentario con un punto y coma. La siguiente instruccin pone le valor 99 en el registro AX: MOVAX,99; Aqu hay un comentario En general la regla es esta: mientras procesa una lnea el ensamblador ignora todo lo que este despus de unpuntoycoma.Hayunaexcepcin,ocasionalmenteelprogramapondrcaracteresconcomillas simples o dobles. En estos casos, el punto y coma no define comentarios, como en el siguiente ejemplo. Hola; adis Hola; adis 5.6 Instrucciones y Directivas. En general, una instruccin es un estatuto que pude ser traducido a lenguaje mquina. Una directiva esunestatutoqueledicequehaceralensamblador.Lasdirectivasnopuedensertraducidasalenguaje mquina; sin embargo, son necesarias para que un programa se ensamble apropiadamente. 43Consideremos algunas ejemplos que ilustran esta distincin. Veamos las siguientes dos instrucciones. La primeraadicionaelcontenidodelregistroBXalcontenidodelregistroAX.Lasegundacopiael contenido de AX a la locacin de memoria llamada SUM. ADDAX,BX MOVSUM,AX Lo que siguen son dos directivas. La primera le dice al ensamblador que aparte un byte de memoria y le de el nombre SUM. La segunda le dice al ensamblador que empieza el segmento llamado CSEG. SUMDB1 CSEGSEGMENT Existenmuchasinstruccionesydirectivasenelensamblador,yalprincipioesdifcildiferenciarlas,sin embargo si quieres aprender a diferenciarlas pregntate si generan una instruccin en lenguaje mquina o si le dan una orden al ensamblador. (Por supuesto tambin puedes ver el manual). Laventajaesquelasdirectivastedanuncontrolsobrelascosasqueestnpasando.Estoes especialmente importante si escribes programas sofisticados. La desventaja es que cada directiva requiere una lnea separada, la cual tiende a obscurecer el diseo lgico del programa. 5.7 El formato de los estatutos del lenguaje Ensamblador. Lasreglasdellenguajeensambladordependendelensambladorqueuses.Aquhayalgunasreglas generales: Cada lnea contiene solo un estatuto. Un estatuto puede empezar donde sea en una lnea. Puedes usar maysculas o minsculas como desees. Las instrucciones y directivas tienen un formato ms estructurado. Cada uno de estos tipos de elementos tienetrespartes:unnombre,unopcodeyunoperando(s).Lastrespartessiempredebenestareneste orden, y ellas deben estar separadas por lo menos con un espacio. Aqu hay un ejemplo de un par de estatutos de un programa: ; actualizar el total NEWSUMLABELNEAR MOVAX,TOTAL ADDAX,SUBTOTAL PUSHAX Los programadores se refieren a un estatuto por su opcode. De hecho, en el ejemplo anterior, puedes decir queelprimerestatutoesladirectivaLABELylosotrosestatutossonlasinstruccionesMOV,ADDy PUSH. Los ejemplos previos ilustran tres puntos importantes. Primero, para hacer las instrucciones entendibles, usa maysculas. Segundo, algunos estatutos contienen dos operandos como el estatuto 44MOVAX,TOTAL En tales casos debes separar los operandos con una coma. Tercero, todas las instrucciones tendrn un opcode pero no todas tendrn un nombre y/o operandos. Paramantenercadaparteensulugar,hazelhbitodesepararestoporcolumnas.Empiezaconlos nombresenlacolumna1,losopcodesenlacolumna9,ylosoperandosenlacolumna17,siincluye comentariosponestosapartirdelacomuna41.Estoayudaaestandarizarelprograma.Lafigura5-1 muestra una instruccin MOV con este formato: NombreOpcodeOperandoComentario SETUP MOV DX,OFFSET MESSAGE;actualizar DX col 1 col 9col 17 col 41 5.8 Como usar los Nombres. Elnombreeslapartedeunainstruccinodirectivaquecomprendeladireccindondeesta localizada.Porejemplo,considerelasiguientedirectiva,lacualledicealensambladorqueiniciaun nuevo procedimiento: GETDATA PROC Esta directiva tiene un nombre GETDATA, y un opcode, PROC, pero no tiene ningn operando. Comopartedelprocesodeensamblamiento,elensambladormantieneunatabladenombresllamada tabla de smbolos. Cada vez que el ensamblador encuentra un nuevo nombre, lo adiciona a la tabla con la direccin (el offset) en el cual apareci. Entonces cuando otras instrucciones se refieren a ese nombre, se puede usar como una direccin con un operando. El ensamblador puede buscar el nombre en la tabla de smbolos y sustituir la direccin. Por ejemplo, una vez que GETDATA es establecida como la representacin de una direccin al principio del procedimiento, una instruccin CALL puede llamar al procedimiento as: CALL GETDATA La instruccin tiene un opcode CALL y un operando GETDATA pero no tiene nombre. Aqu hay otro ejemplo. La siguiente directiva le dice al ensamblador que aparte 5 palabras de memoria: SUMDW5 DUP(?) Estadirectivatieneunnombre,SUM;unopcode,DW;yunoperando5DUP(?).ElnombreSUM representaladireccindondeestlaprimeradelas5palabras.Aslasiguienteinstruccincopiael contenido del registro AX a esta palabra: MOVSUM, AX Esta instruccin tiene un opcode MOV, y un operando SUM,AX; pero no tiene nombre. 45SUM se refiere a la direccin de la primera de las 5 palabras, para referirte a la direccin de la segunda palabra,puedesusarSUM+2.AssiquierescopiarelcontenidodelregistroAXallasegundapalabra puedes usar: MOVSUM+2,AX Sin embargo que pasa si el ensamblador no encuentra an el estatuto de la definicin de un nombre. Por ejemplo, que pasa si la instruccin anterior est antes de la directiva en la cual SUM es definida. Esta es llamada una referencia forward. El ensamblador maneja la referencia forward dejando un espacio para la direccin, la cual debe ser llenada despus. Losprogramadoresexperimentadosevitanelforwardsiemprequeesposible,debidoaqueel ensambladornoleesposiblecrearcdigoeficientecuandoencuentraunareferenciaforward.Lamejor forma de evitar esto es colocando los segmentos que define los datos antes del segmento que contiene las instrucciones. 5.9 Las reglas para especificar Nombres. Los nombres son smbolos que escoges para representar de una manera ms sencilla direcciones de memoria en un programa. Debes crear un nombre de acuerdo a las siguientes reglas: e Los nombres pueden usar letras, dgitos y los siguientes caracteres especiales: ? @_$ e El primer carcter no debe ser un dgito.Esto le permite alensamblador distinguirentre nombresy nmeros. e Noes buenaidea usar el carcter@al principio de un nombre. Los nombres que empiezancon@tienen un propsito especial. e Losnombrepuedensertanlargoscomoquieras;sinembargo,elensambladorsolo reconocelos primeros 31 caracteres. Aqu hay algunos ejemplos de nombres validos: HELLO$MARKETA12345LONG_NAME PART_3 Aqu hay algunos nombres invlidos: LONG-NAME3_PART Comosiemprelarecomendacinesqueescojasnombres concisos, pero que representen elusoprctico de la variable o sus posibles valores. Estaabsolutamenteprohibido,comoenloslenguajesdealtonivel,queutilicesnombreidnticosalas instrucciones y directivas de ensamblador. 5.10 Reglas para especificar Nmeros. 46Puedesutilizarnmerosendecimal,hexadecimal,ybinario.Paraespecificarnmerosdecimales escrbeloscondgitoscomosiempre.PorejemplolasiguienteinstruccincargaelregistroAXconel valor decimal 855. MOVAX,855 Paraespecificarunnmeroenhexadecimal,uselosdgitoshexdel0al9ydelaletraA-F.Debes adicionarunaHalfinaldelnmeroparaespecificarqueesunhex,lasiguienteinstruccincargael registro AX con el valor hex 855H (2133 decimal). MOVAX,855H Si el nmero inicia con una letra de la A-F, debes poner un 0 antes del nmero, para que el ensamblador nopiensequeesunnombrededireccindememoria.Porejemplolasiguienteinstruccincargael registro AX con el valor FFH (255 decimal): MOVAX,0FFH Si usas MOVAX,FFH el ensamblador asumir que FFH es un nombre y ocurrir un error. Para especificar un nmero binario, use solo los dgitos 1 y 0, y adicione una letra B al final del nmero. Por ejemplo si quisiera cargar el registro AX con el valor binario 011010010110B (1686 decimal, 696H) MOVAX,011010010110B {_____________o___________} CAPITULO 6COMPRENDER UN PROGRAMA EN LENGUAJE ENSAMBLADOR En este capitulo aprenders como construir un programa bsico en lenguaje ensamblador, usando un programadeejemploaprenderscualeslafuncindecadaparteycomoseconstruye.Cuandotermine estecaptulodebessentirtecmodoconunesqueletoqueescomnparacualquiertipodeprogramaen ensamblador. Nuevos Trminos Listado. Un reporte o impresin que el ensamblador genera cuando procesa un programa. Punto de entrada. La direccin en la cual un procedimiento inicia su ejecucin. Salvar (un registro). Almacenar un registro para recuperarlo despus. Restaurar (un registro). Cambiar el valor de un registro por un valor anterior. Side effect. Un cambio inadvertido en el ambiente de un programa. 47 6.1 Un programa Prototipo. En este captulo el programa de la figura 6-1 es usado como prototipo de un programa de propsito generalenlenguajeensamblador.Despusdequeleasestecaptulousauneditorparahacertupropia copia del programa prototipo. De este modo cuando veas como ensamblar y linkear un programa podrs hacerlo con este. Note que en la figura hay un nmero de lnea, este slo es utilizado como referencia, y no debe aparecer enlacopiaquehagasconeleditor.Cuandoexpliquelasd