Lenguaje ensamblador.pdf

14
Lenguaje ensamblador Lenguaje de máquina del  Intel 8088 . El código de máquina en hexadecimal  se resalta en rojo, el equivalente en lenguaje en- samblador en magenta, y las direcciones de memoria donde se encuentra el código, en azul. Abajo se ve un texto en hexadecimal y ASCII . El  lenguaje ensamblador, o  assembler  (assembly lan-  guage  en  inglés), es un  lengua je de programaci ón  de ba jo nive l  para los  computadores,  microprocesadores, microcontroladores  y otros  circuitos integrados  progra- mables. Implementa una representación simbólica de los códigos de máquina  binarios y otras constantes necesa- rias para programar una  arquitectura  dada de  CPU  y constituye la representación más directa del  código má- quina  especíco para cada arquitectura legible por un programador. Esta representación es usualmente deni- da por el fabricante de  hardware, y está basada en los mnemónicos  que simbolizan los pasos de procesamien- to (las instrucciones), los registros del procesador, las po- siciones de memoria y otras características del lenguaje. Un lenguaje ensamblador es por lo tanto especíco de cierta arquitectura de computado r física (o virtual). Esto está en contraste con la mayoría de los lenguajes de pro- gramación de alto nivel, que idealmente son portátiles. Un programa utilitari o llamado ensamblador es usado pa- ra traducir sentencias del lenguaje ensamblador al códi- go de máquina del computador objetivo. El ensamblador realiza una traducción más o menos isomorfa (un mapeo de uno a uno) desde las sentencias mnemónicas a las ins- trucciones y datos de máquina. Esto está en contraste con los lenguajes de alto nivel, en los cuales una sola decla- ración generalmente da lugar a muchas instrucciones de máquina. Muchos sosticados ensambladores ofrecen mecanismos adicionales para facilitar el desarrollo del programa, con- tro lar el pr oceso de ensam bla je , y la ay uda de depuración. Part icu larmente , la may oría de los ensa mbl ador es mode r- nos incluyen una facilidad de macro (descrita más abajo), y son llamados macro ensambladores. Fue usado principalmente en los inicios del desarrollo de software, cuando aún no se contaba con potentes lengua- jes de alto nivel y los recursos eran limitados. Actual- mente se utiliza con frecuencia en ambientes académi- cos y de investigación, especialmente cuando se requiere la manipulación directa de  hardware, alto rendimiento, o un uso de recursos controlado y reducido. También es utilizado en el desarrollo de controladores de dispositivo (en inglés,  device drivers) y en el desarrollo de sistemas operativos, debido a la necesidad del acceso directo a las instrucciones de la máquina. Muchos dispositivos progra- mabl es (como los micr ocon tro lado res ) aún cue ntan con el ensamblador como la única manera de ser manipulados. 1 Caractest i cas  El códi go esc rito en leng ua je ensa mbl ado r posee una cierta dicultad de ser entendido ya que su es- tructura se acerca al lenguaje máquina, es decir, es un lenguaje de bajo nivel.  El lenguaje ensamblador es difícilmente  portable, es decir, un código escrito para un microprocesa- dor, puede necesitar ser modicado, para poder ser usado en otra máquina distinta. Al cambiar a una máquina con arquitectura diferente, generalmente es necesario reescribirlo completament e.  Los programas hechos por un programador experto en lenguaje ensamblador son generalmente mucho más rápidos y consumen menos recursos del siste- ma (memoria RAM y ROM) que el programa equi- valente compilado desde un lenguaje de alto nivel. Al programar cuidadosamente en lenguaje ensam- blador se pueden crear programas que se ejecutan más rápidamente y ocupan menos espacio que con lenguajes de alto nivel.  Co n el le ngu a je ensambl ador se ti ene un con- tro l muy pre ci so de las tareas real iza das por un microprocesador  por lo que se pueden crear seg- mentos de código difíciles y/o muy inecientes de programar en un lenguaje de alto nivel, ya que, entre otras cosas, en el lenguaje ensamblador se dispone de instrucciones de l CPU que ge ne ral me nte no es tán disponibles en los lenguajes de alto nivel.  También se puede controlar el tiempo en que tarda una rutina en ej ecutarse, e impedir que se interrum- pa durante su ejecución. 1

Transcript of Lenguaje ensamblador.pdf

  • Lenguaje ensamblador

    Lenguaje de mquina del Intel 8088. El cdigo de mquina enhexadecimal se resalta en rojo, el equivalente en lenguaje en-samblador en magenta, y las direcciones de memoria donde seencuentra el cdigo, en azul. Abajo se ve un texto en hexadecimaly ASCII.

    El lenguaje ensamblador, o assembler (assembly lan-guage en ingls), es un lenguaje de programacin debajo nivel para los computadores, microprocesadores,microcontroladores y otros circuitos integrados progra-mables. Implementa una representacin simblica de loscdigos de mquina binarios y otras constantes necesa-rias para programar una arquitectura dada de CPU yconstituye la representacin ms directa del cdigo m-quina especco para cada arquitectura legible por unprogramador. Esta representacin es usualmente deni-da por el fabricante de hardware, y est basada en losmnemnicos que simbolizan los pasos de procesamien-to (las instrucciones), los registros del procesador, las po-siciones de memoria y otras caractersticas del lenguaje.Un lenguaje ensamblador es por lo tanto especco decierta arquitectura de computador fsica (o virtual). Estoest en contraste con la mayora de los lenguajes de pro-gramacin de alto nivel, que idealmente son porttiles.Un programa utilitario llamado ensamblador es usado pa-ra traducir sentencias del lenguaje ensamblador al cdi-go de mquina del computador objetivo. El ensambladorrealiza una traduccin ms o menos isomorfa (un mapeode uno a uno) desde las sentencias mnemnicas a las ins-trucciones y datos de mquina. Esto est en contraste conlos lenguajes de alto nivel, en los cuales una sola decla-racin generalmente da lugar a muchas instrucciones demquina.Muchos sosticados ensambladores ofrecen mecanismosadicionales para facilitar el desarrollo del programa, con-trolar el proceso de ensamblaje, y la ayuda de depuracin.Particularmente, la mayora de los ensambladores moder-nos incluyen una facilidad de macro (descrita ms abajo),y son llamados macro ensambladores.Fue usado principalmente en los inicios del desarrollo desoftware, cuando an no se contaba con potentes lengua-jes de alto nivel y los recursos eran limitados. Actual-mente se utiliza con frecuencia en ambientes acadmi-

    cos y de investigacin, especialmente cuando se requierela manipulacin directa de hardware, alto rendimiento,o un uso de recursos controlado y reducido. Tambin esutilizado en el desarrollo de controladores de dispositivo(en ingls, device drivers) y en el desarrollo de sistemasoperativos, debido a la necesidad del acceso directo a lasinstrucciones de la mquina. Muchos dispositivos progra-mables (como los microcontroladores) an cuentan con elensamblador como la nica manera de ser manipulados.

    1 Caractersticas

    El cdigo escrito en lenguaje ensamblador poseeuna cierta dicultad de ser entendido ya que su es-tructura se acerca al lenguaje mquina, es decir, esun lenguaje de bajo nivel.

    El lenguaje ensamblador es difcilmente portable,es decir, un cdigo escrito para un microprocesa-dor, puede necesitar ser modicado, para poder serusado en otra mquina distinta. Al cambiar a unamquina con arquitectura diferente, generalmentees necesario reescribirlo completamente.

    Los programas hechos por un programador expertoen lenguaje ensamblador son generalmente muchoms rpidos y consumen menos recursos del siste-ma (memoria RAM y ROM) que el programa equi-valente compilado desde un lenguaje de alto nivel.Al programar cuidadosamente en lenguaje ensam-blador se pueden crear programas que se ejecutanms rpidamente y ocupan menos espacio que conlenguajes de alto nivel.

    Con el lenguaje ensamblador se tiene un con-trol muy preciso de las tareas realizadas por unmicroprocesador por lo que se pueden crear seg-mentos de cdigo difciles y/o muy inecientes deprogramar en un lenguaje de alto nivel, ya que, entreotras cosas, en el lenguaje ensamblador se disponede instrucciones del CPU que generalmente no estndisponibles en los lenguajes de alto nivel.

    Tambin se puede controlar el tiempo en que tardauna rutina en ejecutarse, e impedir que se interrum-pa durante su ejecucin.

    1

  • 2 3 LENGUAJE

    2 Programa ensamblador

    Tpicamente, un programa ensamblador (assembler en in-gls) moderno crea cdigo objeto traduciendo instruccio-nes mnemnicas de lenguaje ensamblador en opcodes, yresolviendo los nombres simblicos para las localizacio-nes de memoria y otras entidades.[1] El uso de referenciassimblicas es una caracterstica clave del lenguaje ensam-blador, evitando tediosos clculos y actualizaciones ma-nuales de las direcciones despus de cada modicacindel programa. La mayora de los ensambladores tambinincluyen facilidades de macros para realizar sustitucintextual - ej. generar cortas secuencias de instrucciones co-mo expansin en lnea en vez de llamar a subrutinas.Los ensambladores son generalmente ms simples de es-cribir que los compiladores para los lenguajes de alto ni-vel, y han estado disponibles desde los aos 1950. Los en-sambladores modernos, especialmente para las arquitec-turas basadas en RISC, tales como MIPS, Sun SPARC, yHP PA-RISC, as como tambin para el x86 (64), op-timizan la planicacin de instrucciones para explotar lasegmentacin del CPU ecientemente.En los compiladores para lenguajes de alto nivel, son elltimo paso antes de generar el cdigo ejecutable.

    2.1 Nmero de pasos

    Hay dos tipos de ensambladores basados en cuntos pa-sos a travs de la fuente son necesarios para producir elprograma ejecutable.

    Los ensambladores de un solo paso pasan a travsdel cdigo fuente una vez y asumen que todos lossmbolos sern denidos antes de cualquier instruc-cin que los reera.

    Los ensambladores de dos pasos crean una tabla contodos los smbolos y sus valores en el primer paso,despus usan la tabla en un segundo paso para gene-rar cdigo. El ensamblador debe por lo menos po-der determinar la longitud de cada instruccin en elprimer paso para que puedan ser calculadas las di-recciones de los smbolos.

    La ventaja de un ensamblador de un solo paso es la ve-locidad, que no es tan importante como lo fue en un mo-mento dados los avances en velocidad y capacidades delcomputador. La ventaja del ensamblador de dos pasos esque los smbolos pueden ser denidos dondequiera en elcdigo fuente del programa. Esto permite a los programasser denidos de maneras ms lgicas y ms signicativas,haciendo los programas de ensamblador de dos paso msfciles leer y mantener.[2]

    2.2 Ensambladores de alto nivel

    Los ms sosticados ensambladores de alto nivel propor-cionan abstracciones del lenguaje tales como:

    Estructuras de control avanzadas

    Declaraciones e invocaciones de procedimien-tos/funciones de alto nivel

    Tipos de datos abstractos de alto nivel, incluyendolas estructuras/records, uniones, clases, y conjuntos

    Procesamiento de macros sosticado (aunque estdisponible en los ensambladores ordinarios desde -nales 1960 para el IBM/360, entre otras mquinas)

    Caractersticas de programacin orientada a objetos

    2.3 Uso del trmino

    Note que, en el uso profesional normal, el trmino en-samblador es frecuentemente usado tanto para referir-se al lenguaje ensamblador como tambin al programaensamblador (que convierte el cdigo fuente escrito enel lenguaje ensamblador a cdigo objeto que luego se-r enlazado para producir lenguaje de mquina). Las dosexpresiones siguientes utilizan el trmino ensamblador":

    El CP/CMS fue escrito en ensamblador del IBMS/360"

    El ASM-H fue un ensamblador del S/370 amplia-mente usado

    La primera se reere al lenguaje y la segundo se reere alprograma.

    3 LenguajeEl lenguaje ensamblador reeja directamente la arqui-tectura y las instrucciones en lenguaje de mquina de laCPU, y pueden ser muy diferentes de una arquitectura deCPU a otra. Cada arquitectura de microprocesador tienesu propio lenguaje de mquina, y en consecuencia su pro-pio lenguaje ensamblador ya que este se encuentra muyligado a la estructura del hardware para el cual se progra-ma. Los microprocesadores dieren en el tipo y nmerode operaciones que soportan; tambin pueden tener dife-rente cantidad de registros, y distinta representacin delos tipos de datos en memoria. Aunque la mayora de losmicroprocesadores son capaces de cumplir esencialmen-te las mismas funciones, la forma en que lo hacen dierey los respectivos lenguajes ensamblador reejan tal dife-rencia.

  • 3.2 Ensamblado 3

    3.1 Instrucciones de CPULa mayora de las CPU tienen ms o menos los mismosgrupos de instrucciones, aunque no necesariamente tie-nen todas las instrucciones de cada grupo. Las operacio-nes que se pueden realizar varan de una CPU a otra. UnaCPU particular puede tener instrucciones que no tengaotro y viceversa. Los primeros microprocesadores de 8bits no tenan operaciones para multiplicar o dividir n-meros, por ejemplo, y haba que hacer subrutinas pararealizar esas operaciones. Otras CPU puede que no ten-gan operaciones de punto otante y habra que hacer oconseguir bibliotecas que realicen esas operaciones.Las instrucciones de la CPU pueden agruparse, de acuer-do a su funcionalidad, en:Operaciones con enteros: (de 8, 16, 32 y 64 bits depen-diendo de la arquitectura de la CPU, en los sistemas muyviejos tambin de 12, 18, 24, 36 y 48 bits)Estas son operaciones realizadas por la Unidad aritmticolgica de la CPU

    Operaciones aritmticas. Como suma, resta, multi-plicacin, divisin, mdulo, cambio de signo

    Operaciones booleanas. Operaciones lgicas bit a bitcomo AND, OR, XOR, NOT

    Operaciones de bits. Como desplazamiento yrotaciones de bits (hacia la derecha o hacia la iz-quierda, a travs del bit del acarreo o sin l)

    Comparaciones

    Operaciones de mover datos:

    Entre los registros y la memoria:

    Aunque la instruccin se llama mover, en laCPU, mover datos signica en realidad co-piar datos, desde un origen a un destino, sin queel dato desaparezca del origen.

    Se pueden mover valores: desde un registro a otro desde un registro a un lugar de la memo-ria

    desde un lugar de la memoria a un regis-tro

    desde un lugar a otro de la memoria un valor inmediato a un registro un valor inmediato a un lugar de memoria

    Operaciones de pila (stack, en ingls):

    PUSH (escribe datos hacia el tope de dela pila)

    POP (lee datos desde el tope de la pila)

    Operaciones de entrada/salida:

    Son operaciones que mueven datos de un regis-tro, desde y hacia un puerto; o de la memoria,desde y hacia un puerto

    INPUT Lectura desde un puerto de en-trada

    OUTPUT Escritura hacia un puerto desalida

    Operaciones para el control del ujo del programa:

    Llamadas y retornos de subrutinas Llamadas y retornos de interrupciones Saltos condicionales de acuerdo al resultado de lacomparaciones

    Saltos incondicionales

    Operaciones con nmeros reales:El estndar para las operaciones con nmeros reales enlas CPU est denido por el IEEE 754.Una CPU puede tener operaciones de punto otante connmeros reales mediante el coprocesador numrico (si lohay), como las siguientes:

    Operaciones aritmticas. Suma, resta, multiplica-cin, divisin, cambio de signo, valor absoluto, parteentera

    Operaciones trascendentales Operaciones trigonomtricas. Seno, coseno,tangente, arcotangente

    Operaciones con logaritmos, potencias y races Otras

    El lenguaje ensamblador tiene mnemnicos para cadauna de las instrucciones de la CPU en adicin a otrosmnemnicos a ser procesados por el programa ensam-blador (como por ejemplo macros y otras sentencias entiempo de ensamblado).

    3.2 EnsambladoLa transformacin del lenguaje ensamblador en cdigomquina la realiza un programa ensamblador, y la traduc-cin inversa la puede efectuar un desensamblador. A dife-rencia de los lenguajes de alto nivel, aqu hay usualmenteuna correspondencia 1 a 1 entre las instrucciones simplesdel ensamblador y el lenguaje de mquina. Sin embargo,

  • 4 4 DISEO DEL LENGUAJE

    en algunos casos, un ensamblador puede proveer pseudoinstrucciones que se expanden en un cdigo de mquinams extenso a n de proveer la funcionalidad necesaria ysimplicar la programacin. Por ejemplo, para un cdi-go mquina condicional como si X mayor o igual que,un ensamblador puede utilizar una pseudoinstruccin algrupo haga si menor que, y si = 0 sobre el resultadode la condicin anterior. Los Ensambladores ms com-pletos tambin proveen un rico lenguaje de macros quese utiliza para generar cdigo ms complejo y secuenciasde datos.Para el mismo procesador y el mismo conjunto de ins-trucciones de CPU, diferentes programas ensambladorespueden tener, cada uno de ellos, variaciones y diferenciasen el conjunto de mnemnicos o en la sintaxis de su len-guaje ensamblador. Por ejemplo, en un lenguaje ensam-blador para la arquitectura x86, se puede expresar la ins-truccin para mover 5 al registro AL de la siguiente ma-nera: MOV AL, 5, mientras que para otro ensambladorpara la misma arquitectura se expresara al revs: MOV5, AL. Ambos lenguajes ensambladores haran exacta-mente lo mismo, solo que est expresado de manera di-ferente. El primero usa la sintaxis de Intel, mientras queel segundo usa la sintaxis de AT&TEl uso del ensamblador no resuelve denitivamente elproblema de cmo programar un sistema basado en mi-croprocesador de modo sencillo ya que para hacer unuso eciente del mismo, hay que conocer a fondo elmicroprocesador, los registros de trabajo de que dispone,la estructura de la memoria, y muchas cosas ms referen-tes a su estructura bsica de funcionamiento.

    3.3 Ejemplos

    Un programa escrito en lenguaje ensamblador consiste enuna serie de instrucciones que corresponden al ujo derdenes ejecutables por un microprocesador.Por ejemplo, en el lenguaje ensamblador para un proce-sador x86:La sentencia

    MOV AL, 61h

    Asigna el valor hexadecimal 61 (97 decimal) al registroAL.El programa ensamblador lee la sentencia de arriba y pro-duce su equivalente binario en lenguaje de mquina

    Binario: 10110000 01100001 (hexadecimal: B61)

    El mnemnico MOV es un cdigo de operacin u"opcode". El opcode es seguido por una lista de argumen-tos o parmetros, completando una tpica instruccin deensamblador. En el ejemplo, AL es un registro de 8 bits

    del procesador, al cual se le asignar el valor hexadecimal61 especicado.El cdigo de mquina generado por el ensamblador con-siste de 2 bytes. El primer byte contiene empaquetado lainstruccin MOV y el cdigo del registro hacia donde seva a mover el dato:1011 0000 01100001 | | | | | +---- Nmero 61h en binario| | | +--- Registro AL +-------- Instruccin MOVEn el segundo byte se especica el nmero 61h, escrito enbinario como 01100001, que se asignar al registro AL,quedando la sentencia ejecutable como:

    10110000 01100001

    La cual puede ser entendida y ejecutada directamente porel procesador.

    4 Diseo del lenguaje

    4.1 Elementos bsicosHay un grado grande de diversidad en la manera en quelos autores de los ensambladores categorizan las senten-cias y en la nomenclatura que usan. En particular, al-gunos describen cualquier cosa como pseudo-operacin(pseudo-Op), con excepcin del mnemnico de mquinao del mnemnico extendido.Un tpico lenguaje ensamblador consiste en 3 tipos desentencias de instruccin que son usadas para denir lasoperaciones del programa:

    Mnemnicos de opcode Secciones de datos Directivas de ensamblador

    4.1.1 Mnemnicos de opcode y mnemnicos exten-didos

    A diferencia de las instrucciones (sentencias) de loslenguajes de alto nivel, instrucciones en el lenguaje en-samblador son generalmente muy simples. Generalmen-te, una mnemnico es un nombre simblico para unasola instruccin en lenguaje de mquina ejecutable (unopcode), y hay por lo menos un mnemnico de opcodedenido para cada instruccin en lenguaje de mquina.Cada instruccin consiste tpicamente en una operacinu opcode ms cero o ms operandos. La mayora de lasinstrucciones reeren a un solo valor, o a un par de va-lores. Los operandos pueden ser inmediatos (tpicamentevalores de un byte, codicados en la propia instruccin),registros especicados en la instruccin, implcitos o lasdirecciones de los datos localizados en otra parte de la

  • 4.2 Macros 5

    memoria. Esto est determinado por la arquitectura sub-yacente del procesador, el ensamblador simplemente re-eja cmo trabaja esta arquitectura. Los mnemnicos ex-tendidos son frecuentemente usados para especicar unacombinacin de un opcode con un operando especco,ej, el ensamblador del System/360 usa a B como un mne-mnico extendido para el BC con una mscara de 15 yNOP al BC con una mscara de 0.Los mnemnicos extendidos son frecuentemente usadospara soportar usos especializados de instrucciones, a me-nudo para propsitos no obvios con respecto al nombre dela instruccin. Por ejemplo, muchos CPU no tienen unainstruccin explcita de NOP (No Operacin), pero tie-nen instrucciones que puedan ser usadas para tal prop-sito. En el CPU 8086, la instruccin XCHG AX,AX (in-tercambia el registro AX consigo mismo) es usada para elNOP, con NOP siendo un pseudo-opcode para codicarla instruccin XCHG AX,AX. Algunos desensamblado-res reconocen esto y decodicarn la instruccin XCHGAX,AX como NOP. Similarmente, los ensambladores deIBM para el System/360 usan los mnemnicos extendi-dos NOP y NOPR con las mscaras cero para BC y BCR.Algunos ensambladores tambin soportan simples ma-croinstrucciones incorporadas que generan dos o ms ins-trucciones de mquina. Por ejemplo, con algunos ensam-bladores para el Z80, la instruccin

    LD HL, BC

    genera las instrucciones

    LD L, CLD H, B.[3]

    LD HL, BC es un pseudo-opcode, que en este caso simu-la ser una instruccin de 16 bits, cuando se expande seproducen dos instrucciones de 8 bits que equivalen a lasimulada de 16 bits.

    4.1.2 Secciones de datos

    Hay instrucciones usadas para denir elementos de datospara manejar datos y variables. Denen el tipo de dato, lalongitud y la alineacin de los datos. Estas instruccionestambin pueden denir si los datos estn disponibles paraprogramas exteriores (programas ensamblados separada-mente) o solamente para el programa en el cual la seccinde datos est denida. Algunos ensambladores clasicanestas instruccin

    4.1.3 Directivas del ensamblador

    Los directivas del ensamblador, tambin llamadas lospseudo opcodes, pseudo-operaciones o pseudo-ops, soninstrucciones que son ejecutadas por un ensamblador en

    el tiempo de ensamblado, no por un CPU en el tiempode ejecucin. Pueden hacer al ensamblado del programadependiente de parmetros entrados por un programador,de modo que un programa pueda ser ensamblado de dife-rentes maneras, quizs para diversos aplicaciones. Tam-bin pueden ser usadas para manipular la presentacin deun programa para hacerlo ms fcil leer y mantener.Por ejemplo, las directivas pudieran ser usadas para re-servar reas de almacenamiento y opcionalmente su paraasignar su contenido inicial. Los nombres de las directi-vas a menudo comienzan con un punto para distinguirlasde las instrucciones de mquina.Los ensambladores simblicos le permiten a los progra-madores asociar nombres arbitrarios (etiquetas o smbo-los) a posiciones de memoria. Usualmente, cada constan-te y variable tiene un nombre para que las instruccionespueden referir a esas ubicaciones por nombre, as pro-moviendo el cdigo autodocumentado. En el cdigo eje-cutable, el nombre de cada subprograma es asociado a supunto de entrada, as que cualquier llamada a un subpro-grama puede usar su nombre. Dentro de subprogramas, alos destinos GOTO se le dan etiquetas. Algunos ensam-bladores soportan smbolos locales que son lxicamentedistintos de los smbolos normales (ej, el uso de 10$"como un destino GOTO).La mayora de los ensambladores proporcionan un mane-jo exible de smbolos, permitiendo a los programadoresmanejar diversos espacios de nombres, calcular autom-ticamente osets dentro de estructuras de datos, y asignaretiquetas que reeren a valores literales o al resultado declculos simples realizados por el ensamblador. Las eti-quetas tambin pueden ser usadas para inicializar cons-tantes y variables con direcciones relocalizables.Los lenguajes ensambladores, como la mayora de losotros lenguajes de computador, permiten que comenta-rios sean aadidos al cdigo fuente, que son ignoradospor el programa ensamblador. El buen uso de los comen-tarios es anms importante con cdigo ensamblador quecon lenguajes de alto nivel, pues el signicado y el pro-psito de una secuencia de instrucciones es ms duro dedescifrar a partir del cdigo en s mismo.El uso sabio de estas facilidades puede simplicar gran-demente los problemas de codicar y mantener el cdigode bajo nivel. El cdigo fuente de lenguaje ensambladorcrudo generado por compiladores o desensambladores -cdigo sin ningn comentario, ni smbolos con algn sen-tido, ni deniciones de datos - es muy difcil de leer cuan-do deben hacerse cambios.

    4.2 Macros

    Muchos ensambladores soportan macros predenidos, yotras soportan macros denidos (y repetidamente rede-nibles) por el programador que implican secuencias delneas del texto en las cuales las variables y las constantes

  • 6 4 DISEO DEL LENGUAJE

    estn empotradas. Esta secuencia de lneas de texto pue-de incluir opcodes o directivas. Una vez un macro ha sidodenido, su nombre puede ser usado en lugar de un mne-mnico. Cuando el ensamblador procesa tal sentencia, re-emplaza la sentencia por las lneas del texto asociadas aese macro, entonces las procesa como si hubieran existi-do en el archivo del cdigo fuente original (incluyendo, enalgunos ensambladores, la expansin de cualquier macroque exista en el texto de reemplazo).Puesto que las macros pueden tener nombres cortos pe-ro se expanden a varias o de hecho muchas lneas de c-digo, pueden ser usados para hacer que los programas enlenguaje ensamblador parezcan ser muchoms cortos, re-quiriendo menos lneas de cdigo fuente, como sucedecon los lenguajes de alto nivel. Tambin pueden ser usa-dos para aadir niveles de estructura ms altos a los pro-gramas ensamblador, opcionalmente introducen cdigode depuracin empotrado va parmetros y otras caracte-rsticas similares.Muchos ensambladores tienen macros incorporados (opredenidos) para las llamadas de sistema y otras secuen-cias especiales de cdigo, tales como la generacin y elalmacenamiento de los datos realizados a travs de avan-zadas operaciones bitwise y booleanas usadas en juegos,software de seguridad, gestin de datos, y criptografa.Los macro ensambladores a menudo permiten a los ma-cros tomar parmetros. Algunos ensambladores incluyenlenguajes macro muy sosticados, incorporando elemen-tos de lenguajes de alto nivel tales como parmetros op-cionales, variables simblicas, condiciones, manipulacio-nes de strings operaciones aritmticas, todos usables du-rante la ejecucin de un macro dado, y permitiendo a losmacros guardar el contexto o intercambiar informacin.As un macro puede generar un gran nmero de instruc-ciones o deniciones de datos en lenguaje ensamblador,basadas en los argumentos del macro. Esto pudiera serusado para generar, por ejemplo, estructuras de datos deestilo de records o bucles desenrrollados, o podra gene-rar algoritmos enteros basados en parmetros complejos.Una organizacin, usando lenguaje ensamblador, que hasido fuertemente extendido usando tal suite de macros,puede ser considerada que se est trabajando en un len-guaje de alto nivel, puesto que tales programadores noestn trabajando con los elementos conceptuales de msbajo nivel del computador.Las macros fueron usados para adaptar sistemas de soft-ware de gran escala para clientes especcos en la eradel mainframe, y tambin fueron usados por el personaldel cliente para satisfacer las necesidades de sus patroneshaciendo versiones especcas de los sistemas operativosdel fabricante. Esto fue hecho, por ejemplo, por los pro-gramadores de sistema que trabajaban con el Conversa-tional Monitor System / Virtual Machine (CMS/VM) deIBM y con los add-ons real time transaction processingde IBM, CICS, Customer Information Control System, yACP/TPF, el airline/nancial system que comenz en los

    aos 1970 y todava corre con muchos sistemas de reser-vaciones computarizados (CRS) y sistemas de tarjeta decrdito de hoy.Tambin es posible usar solamente las habilidades de pro-cesamiento de macros de un ensamblador para generarcdigo escrito en lenguajes completamente diferentes,por ejemplo, para generar una versin de un programa enCOBOL usando un programa macro ensamblador puroconteniendo lneas de cdigo COBOL dentro de opera-dores de tiempo ensamblaje dando instrucciones al en-samblador para generar cdigo arbitrario.Esto era porque, como en los aos 1970 fue observado, elconcepto de procesamiento de macro es independientedel concepto de ensamblaje, siendo el anterior, en tr-minos modernos, ms un procesamiento de textos, queuna generacin de cdigo objeto. El concepto de proce-samiento de macro apareci, y aparece, en el lenguaje deprogramacin C, que soporta instrucciones de prepro-cesador de jar variables, y hace pruebas condicionalesen sus valores. Observe que a diferencia de ciertos macro-procesadores previos dentro de los ensambladores, el pre-procesador de C no es Turing-completo porque careca lacapacidad de bucle o go to, esto ltimo permitiendo alos programas hacer bucles.A pesar del poder del procesamiento macro, ste dej deusarse en muchos lenguajes de alto nivel (una importanteexcepcin es C/C++) mientras que segua siendo perennepara los ensambladores. Esto era porque muchos progra-madores estaban bastante confundidos por la sustitucinde parmetros macro y no distinguan la diferencia entreprocesamiento macro, el ensamblaje y la ejecucin.La sustitucin de parmetros macro es estrictamente pornombre: en el tiempo de procesamientomacro, el valor deun parmetro es sustituido textualmente por su nombre.La clase ms famosa de bugs resultantes era el uso de unparmetro que en s mismo era una expresin y no unnombre primario cuando el escritor macro esperaba unnombre. En el macro:

    foo: macro aload a*b

    la intencin era que la rutina que llama proporcionara elnombre de una variable, y la variable o constante globalb sera usada para multiplicar a a. Si foo es llamado conel parmetro a-c, ocurre la expansin macro load a-c*b.Para evitar cualquier posible ambigedad, los usuarios demacro procesadores pueden encerrar en parntesis los pa-rmetros formales dentro de las deniciones de macros, olas rutinas que llaman pueden envolver en parntesis losparmetos de entrada.[4] As, el macro correcto, con losparntesis, sera:

    foo: macro aload (a)*b

  • 5.1 Perspectiva histrica 7

    y su expansin, dara como resultado: load (a-c)*bEl PL/I y el C/C++ ofrecen macros, pero la esta facilidadsolo puede manipular texto. Por otra parte, los lenguajeshomoicnicos, tales como Lisp, Prolog, y Forth, retienenel poder de los macros de lenguaje ensamblador porquepueden manipular su propio cdigo como datos.

    4.3 Soporte para programacin estructu-rada

    Algunos ensambladores han incorporado elementos deprogramacin estructurada para codicar el ujo de laejecucin. El ejemplo ms temprano de este acercamien-to estaba en el Concept-14 macro set, originalmente pro-puesto por el Dr. H.D. Mills (marzo de 1970), e imple-mentado por Marvin Kessler en la Federal Systems Di-vision de IBM, que extendi el macro ensamblador delS/360 con bloques de control de ujo IF/ELSE/ENDIF ysimilares.[5] Esto era una manera de reducir o eliminar eluso de operaciones GOTO en el cdigo en lenguaje en-samblador, uno de los principales factores que causabancdigo espagueti en el lenguaje ensamblador. Este acer-camiento fue ampliamente aceptado a principios de losaos 1980 (los ltimos das del uso de lenguaje ensam-blador en gran escala).Un curioso diseo fue A-natural, un ensamblador orien-tado a la corriente (stream-oriented) para los procesado-res 8080/Z80[cita requerida] de Whitesmiths Ltd. (desarro-lladores del sistema operativo Idris, similar al Unix), y loque fue reportado como el primer compilador C comer-cial). El lenguaje fue clasicado como un ensamblador,porque trabajaba con elementos de mquina crudos talescomo opcodes, registros, y referencias de memoria; pe-ro incorporaba una sintaxis de expresin para indicar elorden de ejecucin. Los parntesis y otros smbolos es-peciales, junto con construcciones de programacin es-tructurada orientadas a bloques, controlaban la secuenciade las instrucciones generadas. A-natural fue construidocomo el lenguaje objeto de un compilador C, en vez de lacodicacin manual, pero su sintaxis lgica gan algunosseguidores.Ha habido poca demanda aparente para ensambladoresms sosticados debido a la declinacin del desarrollo delenguaje ensamblador de larga escala.[6] A pesar de eso,todava se estn desarrollando y aplicando en casos dondelas limitaciones de recursos o las particularidades en laarquitectura de sistema objetivo previenen el efectivo usode lenguajes de alto nivel.[7]

    5 Uso del lenguaje ensamblador

    5.1 Perspectiva histrica

    Los lenguajes ensambladores fueron primero desarro-llados en los aos 1950, cuando fueron referidos comolenguajes de programacin de segunda generacin. Porejemplo, el SOAP (Symbolic Optimal Assembly Pro-gram) era un lenguaje ensamblador de 1957 para elcomputador IBM 650. Los lenguajes ensambladores eli-minaron mucha de la propensin a errores y del consumode tiempo de la programacin de los lenguajes de prime-ra generacin que se necesitaba con los primeros compu-tadores, liberando a los programadores del tedio tal comorecordar cdigos numricos y clculo de direcciones. Unavez fueron ampliamente usados para todo tipo de pro-gramacin. Sin embargo, por los aos 1980 (1990 en losmicrocomputadores), su uso haba sido en gran parte su-plantado por los lenguajes de alto nivel,[cita requerida] en labsqueda de una mejorada productividad en programa-cin. Hoy en da, aunque el lenguaje ensamblador es casisiempre manejado y generado por los compiladores, to-dava se usa para la manipulacin directa del hardware,acceso a instrucciones especializadas del procesador, opara resolver problemas de desempeo crtico. Los usostpicos son controladores/manejadores (drivers) de dispo-sitivo, sistemas embebidos de bajo nivel, y sistemas detiempo real.Histricamente, un gran nmero de programas han sidoescritos enteramente en lenguaje ensamblador. Los sis-temas operativos fueron casi exclusivamente escritos enlenguaje ensamblador hasta la aceptacin amplia del len-guaje de programacin C en los aos 1970 y principiosde los 1980. Tambin, muchas aplicaciones comercialesfueron escritas en lenguaje ensamblador, incluyendo unagran cantidad del software escrito por grandes corpora-ciones para mainframes de IBM. Los lenguajes COBOLy FORTRAN eventualmente desplazaron mucho de es-te trabajo, aunque un nmero de organizaciones grandesconservaran las infraestructuras de aplicaciones en len-guaje ensamblador hasta bien entrados los aos 1990.La mayora de los primeros microcomputadores cona-ron en el lenguaje ensamblador codicado a mano, inclu-yendo la mayora de los sistemas operativos y de las apli-caciones grandes. Esto era porque estos sistemas tenanlimitaciones severas de recursos, impusieron idiosincrti-cas arquitecturas de memoria y de pantalla, y proporcio-naron servicios de sistema limitados y con errores. Quizsms importante era la falta de compiladores de primeraclase de lenguajes de alto nivel adecuados para el uso enel microcomputador. Un factor psicolgico tambin pudohaber jugado un papel: la primera generacin de progra-madores de los microcomputadores conserv una actitudde acionado de alambres y alicates.En un contexto ms comercial, las ms grandes razonespara usar el lenguaje ensamblador era hacer programascon mnimo tamao, mnima sobrecarga, mayor veloci-dad y conabilidad.

  • 8 5 USO DEL LENGUAJE ENSAMBLADOR

    Los tpicos ejemplos de programas grandes en lenguajeensamblador de ese tiempo son los sistemas operativosIBM PC DOS y aplicaciones tempranas tales como lahoja de clculo Lotus 1-2-3, y casi todos los juegos popu-lares para la familia Atari 800 de computadores persona-les. Incluso en los aos 1990, la mayora de los videojue-gos de cnsola fueron escritos en ensamblador, incluyen-do la mayora de los juegos para la Mega Drive/Genesis yel Super Nintendo Entertainment System.[cita requerida] Se-gn algunos insiders de la industria, el lenguaje ensam-blador era el mejor lenguaje de programacin a usar paraobtener el mejor desempeo del Sega Saturn, una cn-sola para la cual era notoriamente desaante desarrollary programar juegos.[8] El popular juego de arcade NBAJam (1993) es otro ejemplo. El ensamblador ha sido porlargo trecho, el lenguaje de desarrollo primario en loscomputadores hogareos Commodore 64, Atari ST, ascomo el ZX Spectrum. Esto fue as en gran parte por-que los dialectos del BASIC en estos sistemas ofrecie-ron insuciente velocidad de ejecucin, as como insu-cientes caractersticas para aprovechar completamenteel hardware disponible. Algunos sistemas, ms notable-mente el Amiga, incluso tienen IDEs con caractersticasde depuracin y macros altamente avanzados, tales comoel freeware ASM-One assembler, comparable a las delMicrosoft Visual Studio (el ASM-Uno precede al Micro-soft Visual Studio).El ensamblador para el VIC-20 fue escrito por DonFrench y publicado por French Silk. Con 1639 bytesde longitud, su autor cree que es el ms pequeo en-samblador simblico jams escrito. El ensamblador so-portaba el direccionamiento simblico usual y la de-nicin de cadenas de caracteres o cadenas hexade-cimales. Tambin permita expresiones de direccionesque podan combinarse con las operaciones de adicin,substraccin, multiplicacin, divisin, AND lgico, ORlgico, y exponenciacin.[9]

    5.2 Uso actual

    Siempre ha habido debates sobre la utilidad y el desempe-o del lenguaje ensamblador relativo a lenguajes de altonivel. El lenguaje ensamblador tiene nichos especcosdonde es importante (ver abajo). Pero, en general, losmodernos compiladores de optimizacin[cita requerida] pa-ra traducir lenguajes de alto nivel en cdigo que pue-de correr tan rpidamente como el lenguaje ensambla-dor escrito a mano, a pesar de los contraejemplos quepueden ser encontrados.[10][11][12] La complejidad de losprocesadores modernos y del subsistema de memoria ha-ce la optimizacin efectiva cada vez ms difcil paralos compiladores, as como para los programadores enensamblador.[13][14] Adicionalmente, y para la consterna-cin de los amantes de la eciencia, el desempeo cadavez mayor del procesador ha signicado que la mayorade los CPU estn desocupados la mayor parte del tiempo,con retardos causados por embotellamientos predecibles

    tales como operaciones de entrada/salida y paginacin dememoria. Esto ha hecho que la velocidad de ejecucincruda del cdigo no sea un problema para muchos pro-gramadores.Hay algunas situaciones en las cuales los profesionales pu-dieran elegir utilizar el lenguaje ensamblador. Por ejem-plo cuando:

    Es requerido un ejecutable binario independiente(stand-alone), es decir uno que deba ejecutarse sinrecursos a componentes de tiempo de ejecucin o abibliotecas asociadas con un lenguaje de alto nivel;sta es quizs la situacin ms comn. Son progra-mas empotrados que solo almacenan una pequeacantidad de memoria y el dispositivo est dirigidopara hacer tareas para un simple propsito. Ejem-plos consisten en telfonos, sistemas de combustiblee ignicin para automviles, sistemas de control delaire acondicionado, sistemas de seguridad, y senso-res

    Interactuando directamente con el hardware, porejemplo en controladores (drivers) de dispositivo ymanejadores de interrupcin

    usando instrucciones especcas del procesador noexplotadas o disponibles por el compilador. Unejemplo comn es la instruccin de rotacin bitwiseen el ncleo de muchos algoritmos de cifrado

    creando funciones vectorizadas para programas enlenguajes de alto nivel como C. En el lenguaje dealto nivel esto es a veces ayudado por funciones in-trnsecas del compilador que mapean directamentea los mnemnicos del SIMD, pero sin embargo re-sulta en una conversin de ensamblador de uno a unopara un procesador de vector asociado

    Es requerida la optimizacin extrema, ej, en unbucle interno en un algoritmo intensivo en el usodel procesador. Los programadores de juegos tomanventaja de las habilidades de las caractersticas delhardware en los sistemas, permitiendo a los juegoscorrer ms rpidamente. Tambin las grandes simu-laciones cientcas requieren algoritmos altamenteoptimizados, ej, lgebra lineal con BLAS[10][15] ola transformada de coseno discreta (ej, la versinSIMD en ensamblador del x264,[16] (una bibliotecapara codicar streams de video)

    Un sistema con severas limitaciones de recursos (ej,un sistema empotrado) debe ser codicado a manopara maximizar el uso de los limitados recursos; pe-ro esto est llegando a ser menos comn a medidaque el precio del procesador decrece y el desempeomejora

    No existe ningn lenguaje de alto nivel, en un pro-cesador nuevo o especializado, por ejemplo

  • 5.3 Aplicaciones tpicas 9

    Escribiendo programas de tiempo real que necesi-tan sincronizacin y respuestas precisas, tales comosistemas de navegacin de vuelo, y equipo mdico.Por ejemplo, en un sistema y-by-wire (vuelo pormandos elctricos), la telemetra debe ser interpre-tada y hay que actuar dentro de limitaciones estric-tas de tiempo. Tales sistemas deben eliminar fuentesde retrasos impredecibles, que pueden ser creadospor (algunos) lenguajes interpretados, recoleccinde basura automtica, operaciones de paginacin, omultitarea preventiva. Sin embargo, algunos lengua-jes de alto nivel incorporan componentes de tiempode ejecucin e interfaces de sistema operativo quepueden introducir tales retrasos. Elegir el ensambla-dor o lenguajes de bajo nivel para tales sistemas da alos programadores mayor visibilidad y control sobreel proceso de los detalles

    Es requerido control total sobre el ambiente, en si-tuaciones de seguridad extremadamente alta dondenada puede darse por sentado.

    Se escriben virus de computadora, bootloaders,ciertos controladores/manejadores de dispositivo, uotros elementos muy cerca del hardware o al sistemaoperativo de bajo nivel

    Se escriben simuladores del conjunto de instruccio-nes para monitoreo, trazado y depuracin de erroresdonde la sobrecarga adicional es mantenida al mni-mo

    Se hace ingeniera inversa en binarios existentes quepueden o no haber sido escritos originalmente enun lenguaje de alto nivel, por ejemplo al crackearla proteccin anticopia del software propietario.

    Se hace ingeniera inversa y modicacin de videojuegos (tambin denominado ROM hacking), quees posible por medio de varios mtodos. El ms am-pliamente implementado es alterando el cdigo delprograma a nivel de lenguaje ensamblador

    Se escribe cdigo automodicable, algo para lo queel lenguaje ensamblador se presta bien

    Se escriben juegos y otros softwares paracalculadoras grcas[17]

    Se escribe software compilador que genera cdigoensamblador, y por lo tanto los desarrolladores de-ben ser programadores de lenguaje ensamblador

    Se escriben algoritmos criptogrcos que siempredeben tomar estrictamente el mismo tiempo paraejecutar, previniendo ataques de tiempo

    Sin embargo, el lenguaje ensamblador es todava en-seado en la mayora de los programas de ciencias dela computacin e ingeniera electrnica. Aunque hoy enda, pocos programadores trabajan regularmente con el

    lenguaje ensamblador como una herramienta, los con-ceptos fundamentales continan siendo muy importan-tes. Tales tpicos fundamentales, como aritmtica bina-ria, asignacin de memoria, procesamiento del stack, co-dicacin de conjunto de caracteres, procesamiento deinterrupciones, y diseo de compiladores, seran duros deestudiar en detalle sin la comprensin de cmo el compu-tador opera a nivel del hardware. Puesto que el compor-tamiento del computador es fundamentalmente denidopor su conjunto de instrucciones, la manera lgica deaprender tales conceptos es estudiar un lenguaje ensam-blador. La mayora de los computadores modernos tie-nen un conjunto de instrucciones similares. Por lo tanto,estudiar un solo lenguaje ensamblador es suciente pa-ra aprender: i) los conceptos bsicos; ii) reconocer situa-ciones donde el uso de lenguaje ensamblador puede serapropiado; y iii) ver cmo el cdigo ejecutable ecientepuede ser creado por los lenguajes de alto nivel[18]

    5.3 Aplicaciones tpicas

    El lenguaje ensamblador hard-coded es tpicamente usa-do en el ROM de arranque del sistema (BIOS en los sis-temas compatible IBM PC). Este cdigo de bajo nivel esusado, entre otras cosas, para inicializar y probar el hard-ware del sistema antes de cargar el sistema operativo, yest almacenado en el ROM. Una vez que ha tomado lu-gar un cierto nivel de inicializacin del hardware, la eje-cucin se transere a otro cdigo, tpicamente escrito enlenguajes de alto nivel; pero el cdigo corriendo inmedia-tamente despus de que es aplicada la energa usualmenteest escrito en lenguaje ensamblador. Lo mismo es ciertopara los boot loaders.Muchos compiladores traducen lenguajes de alto nivel alenguaje ensamblador primero, antes de la compilacincompleta, permitiendo que el cdigo en ensamblador seavisto para propsitos de depuracin y optimizacin. Len-guajes de relativo bajo nivel, como C, con frecuencia pro-veen sintaxis especial para empotrar lenguaje ensambla-dor en cada plataforma de hardware. El cdigo portabledel sistema entonces puede usar estos componentes espe-ccos a un procesador a travs de una interface uniforme.El lenguaje ensamblador tambin es valioso en ingenierainversa, puesto quemuchos programas solamente son dis-tribuidos en una forma de cdigo de mquina. El cdigode mquina es usualmente fcil de trasladar hacia lengua-je ensamblador para luego ser cuidadosamente examina-do en esta forma, pero es muy difcil de trasladar haciaun lenguaje de alto nivel. Herramientas como InteractiveDisassembler, hacen uso extenso del desensamblador pa-ra tales propsitos.Un nicho que hace uso del lenguaje ensamblador es eldemoscene. Ciertas competiciones requieren a los con-cursantes restringir sus creaciones a un muy pequeo ta-mao (ej, 256 bytes, 1 KB, 4 KB 64 KB), y el lenguajeensamblador es el lenguaje de preferencia para alcanzar

  • 10 7 EJEMPLOS DE LENGUAJE ENSAMBLADOR

    este objetivo.[19] Cuando los recursos son una preocupa-cin, es una necesidad la codicacin en ensamblador,especialmente en sistemas constreidos por el procesa-miento del CPU, como los primeros modelos del Amiga,y el Commodore 64. El cdigo optimizado en ensambla-dor es escrito a mano por los programadores en un in-tento de minimizar el nmero de ciclos de CPU usados.Las limitaciones del CPU son tan grandes que cada ciclocuenta. Usar tales mtodos ha habilitado, a sistemas co-mo el Commodore 64, para producir grcos en 3D entiempo real con efectos avanzados, una hazaa que puedeser considerada improbable o incluso imposible para unsistema con un procesador de 0.99 MHz.[cita requerida]

    6 Detalles adicionalesPara un determinado computador personal, mainframe,sistema empotrado, y cnsola de juegos, tanto del pasadocomo del presente, ha sido escrito al menos uno, y posi-blemente docenas de ensambladores. Para algunos ejem-plos, vea la lista de ensambladores.En los sistemas Unix, el ensamblador es llamado tradicio-nalmente as, aunque no es un simple cuerpo de cdigo,siendo tpicamente escrito uno nuevo por cada port. Unnmero de variantes de Unix usan el GASDentro de los grupos de procesadores, cada ensambladortiene su propio dialecto. A veces, algunos ensambladorespueden leer el dialecto de otro, por ejemplo, TASMpuedeleer el viejo cdigo del MASM, pero no al revs. FASM yNASM tienen una sintaxis similar, pero cada uno soportadiferentes macros que pueden ser difcil de trasladar deuno al otro. Las cosas bsicas son siempre las mismas,pero las caractersticas avanzadas sern diferentes[20]

    Tambin, los lenguajes ensambladores a veces puedenser portables a travs de diferentes sistemas operativosen el mismo tipo de CPU. Las convenciones de llama-das entre los sistemas operativos con frecuencia dierenligeramente o en nada. y con cuidado es posible ganarportabilidad en el lenguaje ensamblador, usualmente alenlazar con una biblioteca de lenguaje C que no cambiaentre sistemas operativos. Un simulador de conjunto deinstrucciones (que idealmente sera escrito en lenguajeensamblador) puede, en teora, procesar el cdigo obje-to/binario de cualquier ensamblador) para lograr la por-tabilidad incluso a travs de plataformas (con una sobre-cargue no mayor que la de un interpretador de bytecodetpico). Esto es esencialmente lo que logra el microcdigocuando una plataforma de hardware cambia internamen-te.Por ejemplo, muchas cosas en libc dependen delpreprocesador para hacer, al programa antes de compilar,cosas que son especcas del sistema operativo o espec-cas del C. De hecho, algunas funciones y smbolos nisiquiera estn garantizados que existan fuera del prepro-cesador. Peor an, el tamao y el orden de los campos de

    las estructuras, tanto como el tamao de ciertas typedefscomo o_t, no estn disponibles en lenguaje ensambla-dor sin la ayuda de un script de conguracin, y die-ren incluso entre versiones de Linux, haciendo imposibleportar llamadas de funciones en libc diferentes de los quetoman simples enteros o punteros como parmetros. Pa-ra manejar estos problemas, el proyecto FASMLIB pro-vee una biblioteca de lenguaje ensamblador portable pa-ra las plataformas Win32 y Linux, pero todava est muyincompleta.[21]

    Algunos lenguajes de muy alto nivel, como C y BorlandPascal, soportan ensamblado en lnea, donde relativamen-te secciones cortas de cdigo en ensamblador puede serempotradas dentro del cdigo del lenguaje de alto nivel.El lenguaje Forth comnmente contiene un ensambladorusado para codicar palabras.La mayora de la gente usa un emulador para depurar susprogramas en lenguaje ensamblador.

    7 Ejemplos de lenguaje ensambla-dor

    7.1 Ejemplo para la arquitectura x86El siguiente es un ejemplo del programa clsico Holamundo escrito para la arquitectura de procesador x86 (ba-jo el sistema operativo DOS).; --------------------------------------------- ; Programaque imprime un string en la pantalla ; --------------------------------------------- .model small ; modelo dememoria .stack ; segmento del stack .data ; segmento dedatos Cadena1 DB 'Hola Mundo.$' ; string a imprimir(nalizado en $) .code ; segmento del cdigo ; --------------------------------------------- ; Inicio del programa; --------------------------------------------- programa: ;---------------------------------------------------------------------------------------------------- ; inicia el segmento dedatos ; ---------------------------------------------------------------------------------------------------- MOV AX, @data; carga en AX la direccin del segmento de datos MOVDS, AX ; mueve la direccin al registro de segmento pormedio de AX ; ---------------------------------------------------------------------------------------------------- ; Imprimeun string en pantalla ; ----------------------------------------------------------------------------------------------------MOV DX, oset Cadena1 ; mueve a DX la direccindel string a imprimir MOV AH, 9 ; AH = cdigo paraindicar al MS DOS que imprima en la pantalla, elstring en DS:DX INT 21h ; llamada al MS DOS paraejecutar la funcin (en este caso especicada en AH) ;---------------------------------------------------------------------------------------------------- ; Finaliza el programa ;---------------------------------------------------------------------------------------------------- INT 20h ; llamada al MSDOS para nalizar el programa end programa

  • 11

    7.2 Ejemplo para el computador virtual(POCA)

    Una seleccin de instrucciones para una computadoravirtual[22]) con las correspondientes direcciones de me-moria en las que se ubicarn las instrucciones. Estas di-recciones NO son estticas. Cada instruccin se acompa-a del cdigo en lenguaje ensamblador generado (cdigoobjeto) que coincide con la arquitectura de computadorvirtual, o conjunto de instrucciones ISA.

    7.3 Ejemplo para el C Intel 8051Cdigo en lenguaje ensamblador para C Intel 80C51:ORG 8030H include T05SEG: SETB TR0 JNBuSEG,T05SEG ;esta subrutina es utilizada CLR TR0;para realizar una cuenta de CPL uSEG ;0,5 segundosmediante la MOV R1,DPL ;interrupcin del timer 0.INVOKE MOV R2,DPH CJNE R2,#07H,T05SEGCJNE R1,#78H,T05SEG MOV DPTR,#0 RET

    7.4 Ejemplo para el Microchip PIC16F84Cdigo en lenguaje ensamblador para elmicrocontrolador 16F84 de Microchip:ORG 0 Inicio bsf STATUS,RP0 clrf PORTB movlw0xFF movwf PORTA bcf STATUS,RP0 Principalmovf PORTA,W movwf Contador movf Contador,Fbtfsc STATUS,Z goto PuntoDecimal sublw d'9' btfssSTATUS,C END

    8 Referencias[1] David Salomon (1993). Assemblers and Loaders

    [2] Beck, Leland L. (1996). 2. System Software: An Intro-duction to Systems Programming. Addison Wesley.

    [3] http://www.z80.de/z80/z80code.htm

    [4] Macros (C/C++), MSDN Library for Visual Studio2008. Microsoft Corp.. Consultado el 22-06-2010.

    [5] Concept 14 Macros. MVS Software. Consultado el 25de mayo de 2009.

    [6] Answers.com. assembly language: Denition and MuchMore from Answers.com. Consultado el 19-06-2008.

    [7] NESHLA: The High Level, Open Source, 6502 Assem-bler for the Nintendo Entertainment System

    [8] Eidolons Inn : SegaBase Saturn

    [9] Jim Lawless (21-05-2004). Speaking with Don French :The Man Behind the French Silk Assembler Tools. Con-sultado el 25-07-2008.

    [10] Writing the Fastest Code, by Hand, for Fun: A HumanComputer Keeps Speeding Up Chips. New York Times,John Marko (28-11-2005). Consultado el 04-03-2010.

    [11] Bit-eld-badness. hardwarebug.org (30-01-2010).Consultado el 04-03-2010.

    [12] GCC makes a mess. hardwarebug.org (13-05-2009).Consultado el 04-03-2010.

    [13] Randall Hyde. The Great Debate. Consultado el 03-07-2008.

    [14] Code sourcery fails again. hardwarebug.org (30-01-2010). Consultado el 04-03-2010.

    [15] BLAS Benchmark-August2008. eigen.tuxfamily.org(01-08-2008). Consultado el 04-03-2010.

    [16] x264.git/common/x86/dct-32.asm. git.videolan.org(29-09-2010). Consultado el 29-09-2010.

    [17] 68K Programming in Fargo II. Consultado el 03-07-2008.

    [18] Hyde, Randall (30-09-1996). Foreword (Why wouldanyone learn this stu?"), op. cit.. Consultado el 05-03-2010.

    [19] 256bytes demos archives. Consultado el 03-07-2008.

    [20] Randall Hyde. Which Assembler is the Best?. Consul-tado el 19-10-2007.

    [21] "vid". FASMLIB: Features. Consultado el 19-10-2007.

    [22] Principles of Computer Architecture (POCA) AR-CTools computadora virtual disponible para descarga yejecucin del cdigo, acceso el 24 de agosto de 2005

    [23] Murdocca, Miles J. y Heuring, Vincent P.:Principles ofComputer Architecture (2000), Prentice Hall, ISBN 0-201-43664-7

    9 Lectura adicional Dominic Sweetman: See MIPS Run. Morgan Kauf-mann Publishers, 1999. ISBN 1-55860-410-3

    Robert Britton:MIPS Assembly Language Program-ming. Prentice Hall, 2003. ISBN 0-13-142044-5

    John Waldron: Introduction to RISC Assembly Lan-guage Programming. Addison Wesley, 1998. ISBN0-201-39828-1

    ASM Community Book An online book full of help-ful ASM info, tutorials and code examples by theASM Community

  • 12 11 ENLACES EXTERNOS

    Jonathan Bartlett: Programming from the GroundUp. Bartlett Publishing, 2004. ISBN 0-9752838-4-7Also available online as PDF

    Paul Carter: PC Assembly Language. Free ebook,2001.Website

    Je Duntemann: Assembly Language Step-by-Step.Wiley, 2000. ISBN 0-471-37523-3

    Randall Hyde: The Art of Assembly Language. NoStarch Press, 2003. ISBN 1-886411-97-2Draft versions available online as PDF and HTML

    Peter Norton, John Socha, Peter Nortons AssemblyLanguage Book for the IBM PC, Brady Books, NY:1986.

    Michael Singer, PDP-11. Assembler Language Pro-gramming and Machine Organization, JohnWiley &Sons, NY: 1980.

    10 Vase tambin Lenguaje ensamblador x86

    Anexo:Listados de instrucciones x86 Ensamblador Macro ensamblador Ensamblador de alto nivel Lenguaje ensamblador tipeado Desensamblador Compilador Decompilador Intrprete (informtica) Depurador Lenguaje de alto nivel Lenguaje de bajo nivel Lenguaje de mquina Conjunto de instrucciones Tipos de datos mquina Little man computer

    Ensambladores

    Comparacin de ensambladores

    High Level Assembly Netwide Assembler Flat assembler GNU Assembler Microsoft Macro Assembler RosASM GoASM A86 y A386 assemblers Turbo Assembler GNU toolchain

    Desensambladores

    Interactive Disassembler

    Depuradores

    SoftICE GNU Debugger OllyDbg Valgrind RosASM A86 y A386 assemblers Data Display Debugger debug (comando)

    OtrosSistemas operativos escritos completamente en assem-bler:

    MenuetOS KolibriOS BareMetal OS

    11 Enlaces externosWikilibros

    Wikilibros alberga un libro o manual sobreProgramacin en lenguaje ensamblador.

    The Art of Assembly Language Programming, byRandall Hyde

  • 13

    Computer-Books.us, Online Assembly LanguageBrooks

    PCAssembly Language(espaol) by Dr Paul Carter;*PC Assembly Tutorial using NASM and GCC byPaul Carter

    Programming from the Ground Up by JonathanBartlett

    The ASM Book by the ASM Community Inline::ASM mdulo Perl en CPAN para programaren lenguaje ensamblador dentro de programas Perl(en ingls)

    Ejemplos prcticos de ensamblador en GNU/Linux

  • 14 12 TEXT AND IMAGE SOURCES, CONTRIBUTORS, AND LICENSES

    12 Text and image sources, contributors, and licenses12.1 Text

    Lenguaje ensamblador Fuente: http://es.wikipedia.org/wiki/Lenguaje_ensamblador?oldid=77011224 Colaboradores: Sabbut, Moriel,JorgeGG, Pilaf, ManuelGR, Robbot, Sanbec, Triku, Jynus, Sms, Robotito, Bgbot, Porao, Darz Mol, Vizcarra, Z80user, MatiasBellone,Richy, Digigalos, Boticario, AlfonsoERomero, Airunp, Emijrp, RobotQuistnix, Platonides, Chobot, Yrbot, Vitamine, GermanX, Beto29,Gothmog, Jesuja, Santiperez, Maldoror, Tomatejc, BOTpolicia, Qwertyytrewqqwerty, CEM-bot, Jorgelrm, Laura Fiorucci, X.Cyclop, ^Ci-ViLoN^, Cristianrock2, Antur, FrancoGG, Thijs!bot, Roberto Fiadone, JoaquinFerrero, Locovich, Isha, JAnDbot, Jugones55, Kved, Se-gedano, Rafa3040, Muro de Aguas, TXiKiBoT, Oespinosa, Netito777, Marvelshine, Biasoli, VolkovBot, Technopat, Galandil, Matdrodes,Elabra sanchez, House, Erickmr, Barri, Muro Bot, BotMultichill, SieBot, Loveless, Drinibot, BOTarate, Manw, El bot de la dieta, Bue-naGente, Mrisco, DorganBot, Tirithel, Piero71, Lentucky, Botelln, CestBOT, Valentin estevanez navarro, Kroji, AVBOT, LucienBOT,Tanhabot, NjardarBot, Gades21, Diegusjaimes, Hann, Innv, Andreasmperu, Luckas-bot, Lu Tup, Kbradero, SuperBraulio13, Xqbot, Jkbw,Ricardogpn, Albertochoa, Surfaz, Botarel, AstaBOTh15, TiriBOT, Scapegoat001, Jcdy, Halfdrag, Kizar, Codename, Jerowiki, PatruBOT,Dinamik-bot, GrouchoBot, G Garro, EmausBot, Sergio Andres Segovia, Grillitus, WikitanvirBot, R010178, ILoveSugar, ChayitaBOT, Al-bertoCamilo, Addbot, Carlos7755 y Annimos: 156

    12.2 Images Archivo:Check_mark.png Fuente: http://upload.wikimedia.org/wikipedia/commons/f/f0/Check_mark.png Licencia: ? Colaboradores:

    Wikipedia Artista original: Wikipedia Archivo:Codigo_de_maquina.png Fuente: http://upload.wikimedia.org/wikipedia/commons/f/f3/Codigo_de_maquina.png Licencia:

    Public domain Colaboradores: Trabajo propio Artista original: German Archivo:Commons-emblem-copyedit.svg Fuente: http://upload.wikimedia.org/wikipedia/commons/e/e8/Commons-emblem-copyedit.

    svg Licencia: CC-BY-SA-3.0 Colaboradores: File:Gnome-emblem-important.svg Artista original: GNOME icon artists, Fitoschido Archivo:Wikibooks-logo.svg Fuente: http://upload.wikimedia.org/wikipedia/commons/f/fa/Wikibooks-logo.svg Licencia: CC-BY-SA-

    3.0 Colaboradores: Trabajo propio Artista original: User:Bastique, User:Ramac et al.

    12.3 Content license Creative Commons Attribution-Share Alike 3.0

    Caractersticas Programa ensamblador Nmero de pasos Ensambladores de alto nivel Uso del trmino

    Lenguaje Instrucciones de CPU Ensamblado Ejemplos

    Diseo del lenguaje Elementos bsicos Mnemnicos de opcode y mnemnicos extendidos Secciones de datos Directivas del ensamblador

    Macros Soporte para programacin estructurada

    Uso del lenguaje ensamblador Perspectiva histrica Uso actual Aplicaciones tpicas

    Detalles adicionales Ejemplos de lenguaje ensamblador Ejemplo para la arquitectura x86 Ejemplo para el computador virtual (POCA) Ejemplo para el C Intel 8051 Ejemplo para el Microchip PIC16F84

    Referencias Lectura adicional Vase tambin Enlaces externos Text and image sources, contributors, and licensesTextImagesContent license