Lenguaje ensamblador

March 22, 2018 | Author: Fide Moguel | Category: Assembly Language, Programming Language, Central Processing Unit, Compiler, Computer Program


Comments



Description

Lenguaje ensamblador1 Lenguaje ensamblador El lenguaje ensamblador, o assembler (assembly language en inglés), es un lenguaje de programación de bajo nivel para los computadores, microprocesadores, microcontroladores y otros circuitos integrados programables. Implementa Lenguaje de máquina del Intel 8088. El código de máquina en hexadecimal se resalta en rojo, el equivalente en lenguaje assembler en magenta, y las direcciones de memoria una representación simbólica de los donde se encuentra el código, en azul. Abajo se ve un texto en hexadecimal y ASCII. códigos de máquina binarios y otras constantes necesarias para programar una arquitectura dada de CPU y constituye la representación más directa del código máquina específico para cada arquitectura legible por un programador. Esta representación es usualmente definida por el fabricante de hardware, y está basada en los mnemónicos que simbolizan los pasos de procesamiento (las instrucciones), los registros del procesador, las posiciones de memoria y otras características del lenguaje. Un lenguaje ensamblador es por lo tanto específico de cierta arquitectura de computador física (o virtual). Esto está en contraste con la mayoría de los lenguajes de programación de alto nivel, que idealmente son portables. Un programa utilitario llamado ensamblador es usado para traducir sentencias del lenguaje ensamblador al código 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 instrucciones y datos de máquina. Esto está en contraste con los lenguajes de alto nivel, en los cuales una sola declaración generalmente da lugar a muchas instrucciones de máquina. Muchos sofisticados ensambladores ofrecen mecanismos adicionales para facilitar el desarrollo del programa, controlar el proceso de ensamblaje, y la ayuda de depuración. Particularmente, la mayoría de los ensambladores modernos 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 lenguajes de alto nivel y los recursos eran limitados. Actualmente se utiliza con frecuencia en ambientes académicos y de investigación, especialmente cuando se requiere la manipulación directa de hardware, altos rendimientos, o un uso de recursos controlado y reducido. Muchos dispositivos programables (como los microcontroladores) aún cuentan con el ensamblador como la única manera de ser manipulados. Características • El código escrito en lenguaje ensamblador posee una cierta dificultad de ser entendido ya que su estructura 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 microprocesador, puede necesitar ser modificado, para poder ser usado en otra máquina distinta. Al cambiar a una máquina con arquitectura diferente, generalmente es necesario reescribirlo completamente. • Los programas hechos por un programador experto en lenguaje ensamblador son generalmente mucho más rápidos y consumen menos recursos del sistema (memoria RAM y ROM) que el programa equivalente compilado desde un lenguaje de alto nivel. Al programar cuidadosamente en lenguaje ensamblador se pueden crear programas que se ejecutan más rápidamente y ocupan menos espacio que con lenguajes de alto nivel. • Con el lenguaje ensamblador se tiene un control muy preciso de las tareas realizadas por un microprocesador por lo que se pueden crear segmentos de código difíciles y/o muy ineficientes de programar en un lenguaje de alto nivel, ya que, entre otras cosas, en el lenguaje ensamblador se dispone de instrucciones del CPU que generar cortas secuencias de instrucciones como expansión en línea en vez de llamar a subrutinas. clases. evitando tediosos cálculos y actualizaciones manuales de las direcciones después de cada modificación del programa. un programa ensamblador (assembler en inglés) moderno crea código objeto traduciendo instrucciones mnemónicas de lenguaje ensamblador en opcodes. optimizan la planificación de instrucciones para explotar la segmentación del CPU eficientemente. tales como MIPS. haciendo los programas de ensamblador de dos paso más fáciles leer y mantener. después usan la tabla en un segundo paso para generar código. Esto permite a los programas ser definidos de maneras más lógicas y más significativas. • Los ensambladores de un solo paso pasan a través del código fuente una vez y asumen que todos los símbolos serán definidos antes de cualquier instrucción que los refiera. El ensamblador debe por lo menos poder determinar la longitud de cada instrucción en el primer paso para que puedan ser calculadas las direcciones de los símbolos. entre otras máquinas) • Características de programación orientada a objetos . En los compiladores para lenguajes de alto nivel. que no es tan importante como lo fue en un momento dados los avances en velocidad y capacidades del computador. especialmente para las arquitecturas basadas en RISC. incluyendo las estructuras/records. • También se puede controlar el tiempo en que tarda una rutina en ejecutarse. y han estado disponibles desde los años 1950. La mayoría de los ensambladores también incluyen facilidades de macros para realizar sustitución textual .Lenguaje ensamblador generalmente no están disponibles en los lenguajes de alto nivel. La ventaja del ensamblador de dos pasos es que los símbolos pueden ser definidos dondequiera en el código fuente del programa.ej. y resolviendo los nombres simbólicos para las localizaciones de memoria y otras entidades.[1] El uso de referencias simbólicas es una característica clave del lenguaje ensamblador. La ventaja de un ensamblador de un solo paso es la velocidad. Los ensambladores son generalmente más simples de escribir que los compiladores para los lenguajes de alto nivel. Sun SPARC. y conjuntos Procesamiento de macros sofisticado (aunque está disponible en los ensambladores ordinarios desde finales 1960 para el IBM/360. y HP PA-RISC. • Los ensambladores del dos pasos crean una tabla con todos los símbolos y sus valores en el primer paso. Los ensambladores modernos.[2] Ensambladores de alto nivel Los más sofisticados ensambladores de alto nivel proporcionan abstracciones del lenguaje tales como: • • • • Estructuras de control avanzadas Declaraciones e invocaciones de procedimientos/funciones de alto nivel Tipos de datos abstractos de alto nivel. así como también para el x86 (-64). son el último paso antes de generar el código ejecutable. Número de pasos Hay dos tipos de ensambladores basados en cuántos pasos a través de la fuente son necesarios para producir el programa ejecutable. uniones. 2 Programa ensamblador Típicamente. e impedir que se interrumpa durante su ejecución. 32 y 64 bits dependiendo de la arquitectura del CPU. Las dos expresiones siguientes utilizan el término "ensamblador": • "El CP/CMS fue escrito en ensamblador del IBM S/360" • "El ASM-H fue un ensamblador del S/370 ampliamente usado" La primera se refiere al lenguaje y la segundo se refiere al programa. Las instrucciones del CPU pueden agruparse.Lenguaje ensamblador 3 Uso del término Note que. 36 y 48 bits) Estas son operaciones realizadas por la Unidad aritmético lógica del CPU • Operaciones aritméticas. "mover datos" significa en realidad copiar datos. también pueden tener diferente cantidad de registros. aunque no necesariamente tienen todas las instrucciones de cada grupo. Aunque la mayoría de los microprocesadores son capaces de cumplir esencialmente las mismas funciones. Lenguaje El lenguaje ensamblador refleja directamente la arquitectura y las instrucciones en lenguaje de máquina de la CPU. en el CPU. el término ensamblador es frecuentemente usado tanto para referirse al lenguaje ensamblador como también al programa ensamblador (que convierte el código fuente escrito en el lenguaje ensamblador a código objeto que luego será enlazado para producir lenguaje de máquina). y distinta representación de los tipos de datos en memoria. Como desplazamiento y rotaciones de bits (hacia la derecha o hacia la izquierda. desde un origen a un destino. y pueden ser muy diferentes de una arquitectura de CPU a otra. sin que el dato desaparezca del origen. resta. división. 18. OR. XOR. Un CPU particular puede tener instrucciones que no tenga otro y viceversa. 24. 16. en el uso profesional normal. Se pueden mover valores: • desde un registro a otro • desde un registro a un lugar de la memoria • desde un lugar de la memoria a un registro • desde un lugar a otro de la memoria • un valor inmediato a un registro . en los sistemas muy viejos también de 12. Los primeros microprocesadores de 8 bits no tenían operaciones para multiplicar o dividir números. Los microprocesadores difieren en el tipo y número de operaciones que soportan. en: Operaciones con enteros: (de 8. a través del bit del acarreo o sin él) • Comparaciones Operaciones de mover datos: Entre los registros y la memoria: Aunque la instrucción se llama "mover". y había que hacer subrutinas para realizar esas operaciones. Instrucciones de CPU La mayoría de los CPU tienen más o menos los mismos grupos de instrucciones. Como suma. Cada arquitectura de microprocesador tiene su propio lenguaje de máquina. por ejemplo. de acuerdo a su funcionalidad. módulo. Otros CPU puede que no tengan operaciones de punto flotante y habría que hacer o conseguir bibliotecas que realicen esas operaciones. Operaciones lógicas bit a bit como AND. NOT • Operaciones de bits. multiplicación. y en consecuencia su propio lenguaje ensamblador ya que este se encuentra muy ligado al la estructura del hardware para el cual se programa. cambio de signo • Operaciones booleanas. la forma en que lo hacen difiere y los respectivos lenguajes ensamblador reflejan tal diferencia. Las operaciones que se pueden realizar varían de un CPU a otro. potencias y raíces • Otras El lenguaje ensamblador tiene mnemónicos para cada una de las instrucciones del CPU en adición a otros mnemónicos a ser procesados por el programa ensamblador (como por ejemplo macros y otras sentencias en tiempo de ensamblado). Sin embargo. A diferencia de los lenguajes de alto nivel. Ensamblado La transformación del lenguaje ensamblador en código máquina la realiza un programa ensamblador. multiplicación. cambio de signo. Un CPU puede tener operaciones de punto flotante con números reales mediante el coprocesador numérico (si lo hay). Los Ensambladores más completos también proveen un rico lenguaje de macros que se utiliza para generar código más complejo y secuencias de datos. y "si = 0" sobre el resultado de la condición anterior. desde y hacia un puerto. un ensamblador puede utilizar una pseudoinstrucción al grupo "haga si menor que". mientras que el segundo usa la sintaxis de AT&T . valor absoluto. tangente. en un lenguaje ensamblador para la arquitectura x86. diferentes programas ensambladores pueden tener. resta. Suma. 5. en algunos casos. Ambos lenguajes ensambladores harían exactamente lo mismo. para un código máquina condicional como "si X mayor o igual que". cada uno de ellos. o de la memoria. se puede expresar la instrucción para mover 5 al registro AL de la siguiente manera: MOV AL. Por ejemplo. un ensamblador puede proveer "pseudo instrucciones" que se expanden en un código de máquina más extenso a fin de proveer la funcionalidad necesaria y simplificar la programación. división. mientras que para otro ensamblador para la misma arquitectura se expresaría al revés: MOV 5. parte entera • Operaciones trascendentales • Operaciones trigonométricas. coseno. arcotangente • Operaciones con logaritmos. AL. Para el mismo procesador y el mismo conjunto de instrucciones de CPU. variaciones y diferencias en el conjunto de mnemónicos o en la sintaxis de su lenguaje ensamblador. desde y hacia un puerto • INPUT Lectura desde un puerto de entrada • OUTPUT Escritura hacia un puerto de salida Operaciones para el control del flujo del programa: • • • • Llamadas y retornos de subrutinas Llamadas y retornos de interrupciones Saltos condicionales de acuerdo al resultado de la comparaciones Saltos incondicionales 4 Operaciones con números reales: El estándar para las operaciones con números reales en los CPU está definido por el IEEE 754. solo que está expresado de manera diferente. aquí hay usualmente una correspondencia 1 a 1 entre las instrucciones simples del ensamblador y el lenguaje de máquina.Lenguaje ensamblador • un valor inmediato a un lugar de memoria Operaciones de stack: • PUSH (escribe datos hacia el tope del stack) • POP (lee datos desde el tope del stack) Operaciones de entrada/salida: Son operaciones que mueven datos de un registro. Seno. y la traducción inversa la puede efectuar un desensamblador. como las siguientes: • Operaciones aritméticas. El primero usa la sintaxis de Intel. Por ejemplo. los registros de trabajo de que dispone. Diseño del lenguaje Elementos básicos Hay un grado grande de diversidad en la manera en que los autores de los ensambladores categorizan las sentencias y en la nomenclatura que usan. y muchas cosas más referentes a su estructura básica de funcionamiento. Por ejemplo. El primer byte contiene empaquetado la instrucción MOV y el código del registro hacia donde se va a mover el dato: 10110 000 01100001 | | | | | +---. 5 Ejemplo Un programa escrito en lenguaje ensamblador consiste en una serie de instrucciones que corresponden al flujo de órdenes ejecutables por un microprocesador. hay que conocer a fondo el microprocesador. en el lenguaje ensamblador para un procesador x86: La sentencia • MOV AL. En el ejemplo. AL es un registro de 8 bits del procesador. con excepción del mnemónico de máquina o del mnemónico extendido. la estructura de la memoria. algunos describen cualquier cosa como pseudo-operación (pseudo-Op). En particular. El código de máquina generado por el ensamblador consiste de 2 bytes.Lenguaje ensamblador El uso del ensamblador no resuelve definitivamente el problema de cómo programar un sistema basado en microprocesador de modo sencillo ya que para hacer un uso eficiente del mismo. 061h Asigna el valor hexadecimal 61 (97 decimal) al registro "AL". escrito en binario como 01100001. completando una típica instrucción de ensamblador. que se asignará al registro AL.Registro AL +-------. quedando la sentencia ejecutable como: • 10110000 01100001 La cual puede ser entendida y ejecutada directamente por el procesador. El opcode es seguido por una lista de argumentos o parámetros.Instrucción MOV En el segundo byte se especifica el número 61h.Número 61h en binario | | | +--. El programa ensamblador lee la sentencia de arriba y produce su equivalente binario en lenguaje de máquina • Binario: 10110000 01100001 (hexadecimal: B061) El mnemónico MOV es un código de operación u "opcode". Un típico lenguaje ensamblador consiste en 3 tipos de sentencias de instrucción que son usadas para definir las operaciones del programa: • Mnemónicos de opcode • Secciones de datos • Directivas de ensamblador . al cual se le asignará el valor hexadecimal 61 especificado. Definen el tipo de dato. también llamadas los pseudo opcodes. el ensamblador del System/360 usa a B como un mnemónico extendido para el BC con una máscara de 15 y NOP al BC con una máscara de 0.AX.[3] LD HL. Cada instrucción consiste típicamente en una operación u opcode más cero o más operandos. Algunos ensambladores clasifican estas instruccion Directivas del ensamblador Los directivas del ensamblador. pero tienen instrucciones que puedan ser usadas para tal propósito. Similarmente. En el CPU 8086. ej. Secciones de datos Hay instrucciones usadas para definir elementos de datos para manejar datos y variables. son instrucciones que son ejecutadas por un ensamblador en el tiempo de ensamblado. Algunos ensambladores también soportan simples macroinstrucciones incorporadas que generan dos o más instrucciones de máquina. Estas instrucciones también pueden definir si los datos están disponibles para programas exteriores (programas ensamblados separadamente) o solamente para el programa en el cual la sección de datos está definida. la longitud y la alineación de los datos. Por ejemplo. no por un CPU en el tiempo de ejecución. muchos CPU no tienen una instrucción explícita de NOP (No Operación).AX como NOP. el ensamblador simplemente refleja cómo trabaja esta arquitectura. BC genera las instrucciones LD L. la instrucción LD HL. Pueden hacer al ensamblado del programa dependiente de parámetros entrados por un programador. Los mnemónicos extendidos son frecuentemente usados para especificar una combinación de un opcode con un operando específico. B.AX (intercambia el registro AX consigo mismo) es usada para el NOP. Los operandos pueden ser inmediatos (típicamente valores de un byte. instrucciones en el lenguaje ensamblador son generalmente muy simples. los ensambladores de IBM para el System/360 usan los mnemónicos extendidos NOP y NOPR con las máscaras cero para BC y BCR.Lenguaje ensamblador Mnemónicos de opcode y mnemónicos extendidos A diferencia de las instrucciones (sentencias) de los lenguajes de alto nivel. o a un par de valores. Los mnemónicos extendidos son frecuentemente usados para soportar usos especializados de instrucciones. cuando se expande se producen dos instrucciones de 8 bits que equivalen a la simulada de 16 bits. La mayoría de las instrucciones refieren a un solo valor. con NOP siendo un pseudo-opcode para codificar la instrucción XCHG AX. Usualmente. pseudo-operaciones o pseudo-ops. una mnemónico es un nombre simbólico para una sola instrucción en lenguaje de máquina ejecutable (un opcode). las directivas pudieran ser usadas para reservar áreas de almacenamiento y opcionalmente su para asignar su contenido inicial. implícitos o las direcciones de los datos localizados en otra parte de la memoria. la instrucción XCHG AX. Por ejemplo. Esto está determinado por la arquitectura subyacente del procesador. con algunos ensambladores para el Z80. cada constante y variable tiene un nombre para que las instrucciones pueden 6 . registros especificados en la instrucción. BC es un pseudo-opcode. codificados en la propia instrucción). Algunos desensambladores reconocen esto y decodificarán la instrucción XCHG AX. Por ejemplo. de modo que un programa pueda ser ensamblado de diferentes maneras. quizás para diversos aplicaciones. Los nombres de las directivas a menudo comienzan con un punto para distinguirlas de las instrucciones de máquina. Los ensambladores simbólicos le permiten a los programadores asociar nombres arbitrarios (etiquetas o símbolos) a posiciones de memoria. También pueden ser usadas para manipular la presentación de un programa para hacerlo más fácil leer y mantener. y hay por lo menos un mnemónico de opcode definido para cada instrucción en lenguaje de máquina. Generalmente. que en este caso simula ser una instrucción de 16 bits. C LD H. a menudo para propósitos no obvios con respecto al nombre de la instrucción. Puesto que las macros pueden tener nombres "cortos" pero se expanden a varias o de hecho muchas líneas de código. condiciones. pueden ser usados para hacer que los programas en lenguaje ensamblador parezcan ser mucho más cortos. Esta secuencia de líneas de texto puede incluir opcodes o directivas. permiten que comentarios sean añadidos al código fuente. reemplaza la sentencia por las líneas del texto asociadas a ese macro. basadas en los argumentos del macro. la expansión de cualquier macro que exista en el texto de reemplazo). Una organización. su nombre puede ser usado en lugar de un mnemónico. gestión de datos. estructuras de datos de estilo de records o bucles "desenrrollados". que ha sido fuertemente extendido usando tal suite de macros. puede ser considerada que se está trabajando en un lenguaje de alto nivel. y criptografía. Muchos ensambladores tienen macros incorporados (o predefinidos) para las llamadas de sistema y otras secuencias especiales de código. que son ignorados por el programa ensamblador. todos usables durante la ejecución de un macro dado. calcular automáticamente offsets dentro de estructuras de datos. Algunos ensambladores soportan símbolos locales que son léxicamente distintos de los símbolos normales (ej. pues el significado y el propósito de una secuencia de instrucciones es más duro de descifrar a partir del código en sí mismo. y permitiendo a los macros guardar el contexto o intercambiar información.Lenguaje ensamblador referir a esas ubicaciones por nombre. Las macros fueron usados para adaptar sistemas de software de gran escala para clientes específicos en la era del mainframe. así promoviendo el código autodocumentado. usando lenguaje ensamblador. Cuando el ensamblador procesa tal sentencia. y también fueron usados por el personal del cliente para satisfacer las necesidades de sus patrones . El código fuente de lenguaje ensamblador crudo generado por compiladores o desensambladores . Los macro ensambladores a menudo permiten a los macros tomar parámetros. 7 Macros Muchos ensambladores soportan macros predefinidos. como la mayoría de los otros lenguajes de computador. requiriendo menos líneas de código fuente. el nombre de cada subprograma es asociado a su punto de entrada. La mayoría de los ensambladores proporcionan un manejo flexible de símbolos. software de seguridad. puesto que tales programadores no están trabajando con los elementos conceptuales de más bajo nivel del computador. Así un macro puede generar un gran número de instrucciones o definiciones de datos en lenguaje ensamblador. manipulaciones de strings operaciones aritméticas. El uso sabio de estas facilidades puede simplificar grandemente los problemas de codificar y mantener el código de bajo nivel. El buen uso de los comentarios es aún más importante con código ensamblador que con lenguajes de alto nivel. variables simbólicas.código sin ningún comentario. Una vez un macro ha sido definido. Algunos ensambladores incluyen lenguajes macro muy sofisticados. opcionalmente introducen código de depuración empotrado vía parámetros y otras características similares. incorporando elementos de lenguajes de alto nivel tales como parámetros opcionales. También pueden ser usados para añadir niveles de estructura más altos a los programas ensamblador. y asignar etiquetas que refieren a valores literales o al resultado de cálculos simples realizados por el ensamblador. tales como la generación y el almacenamiento de los datos realizados a través de avanzadas operaciones bitwise y booleanas usadas en juegos. por ejemplo. entonces las procesa como si hubieran existido en el archivo del código fuente original (incluyendo. Esto pudiera ser usado para generar. y otras soportan macros definidos (y repetidamente redefinibles) por el programador que implican secuencias de líneas del texto en las cuales las variables y las constantes están empotradas.es muy difícil de leer cuando deben hacerse cambios. permitiendo a los programadores manejar diversos espacios de nombres. ni símbolos con algún sentido. así que cualquier llamada a un subprograma puede usar su nombre. el uso de "10$" como un destino GOTO). como sucede con los lenguajes de alto nivel. o podría generar algoritmos enteros basados en parámetros complejos. a los destinos GOTO se le dan etiquetas. en algunos ensambladores. ni definiciones de datos . Dentro de subprogramas. Los lenguajes ensambladores. En el código ejecutable. Las etiquetas también pueden ser usadas para inicializar constantes y variables con direcciones relocalizables. y Forth. originalmente propuesto por el Dr. por los programadores de sistema que trabajaban con el Conversational Monitor System / Virtual Machine (CMS/VM) de IBM y con los add-ons "real time transaction processing" de IBM.D. que soporta "instrucciones de preprocesador" de fijar variables. el preprocesador de C no es Turing-completo porque carecía la capacidad de bucle o "go to". el valor de un parámetro es sustituido textualmente por su nombre. el macro correcto. Observe que a diferencia de ciertos macroprocesadores previos dentro de los ensambladores. el airline/financial system que comenzó en los años 1970 y todavía corre con muchos sistemas de reservaciones computarizados (CRS) y sistemas de tarjeta de crédito de hoy. Si foo es llamado con el parámetro a-c. e implementado por Marvin Kessler en la Federal Systems Division de IBM. Mills (marzo de 1970). con los paréntesis. H.[4] Así. El concepto de procesamiento de macro apareció.[5] Esto era una manera de reducir o eliminar el uso de operaciones GOTO en el código en lenguaje ensamblador. Prolog. A pesar del poder del procesamiento macro.Lenguaje ensamblador haciendo versiones específicas de los sistemas operativos del fabricante. para generar una versión de un programa en COBOL usando un programa macro ensamblador puro conteniendo líneas de código COBOL dentro de operadores de tiempo ensamblaje dando instrucciones al ensamblador para generar código arbitrario. ocurre la expansión macro load a-c*b. La sustitución de parámetros macro es estrictamente por nombre: en el tiempo de procesamiento macro. En el macro: foo: macro a load a*b la intención era que la rutina que llama proporcionaría el nombre de una variable. También es posible usar solamente las habilidades de procesamiento de macros de un ensamblador para generar código escrito en lenguajes completamente diferentes. el ensamblaje y la ejecución. los usuarios de macro procesadores pueden encerrar en paréntesis los parámetros formales dentro de las definiciones de macros. pero la esta facilidad solo puede manipular texto. siendo el anterior. Este . daría como resultado: load (a-c)*b El PL/I y el C/C++ ofrecen macros. en el lenguaje de programación C. esto último permitiendo a los programas hacer bucles. y la variable o constante "global" b sería usada para multiplicar a "a". Esto era porque. en términos modernos. más un procesamiento de textos. el concepto de "procesamiento de macro" es independiente del concepto de "ensamblaje". y ACP/TPF. Esto fue hecho. por ejemplo. uno de los principales factores que causaban código espagueti en el lenguaje ensamblador. que una generación de código objeto. como en los años 1970 fue observado. Por otra parte. por ejemplo. que extendió el macro ensamblador del S/360 con bloques de control de flujo IF/ELSE/ENDIF y similares. 8 Soporte para programación estructurada Algunos ensambladores han incorporado elementos de programación estructurada para codificar el flujo de la ejecución. éste dejó de usarse en muchos lenguajes de alto nivel (una importante excepción es C/C++) mientras que seguía siendo perenne para los ensambladores. y hace pruebas condicionales en sus valores. La clase más famosa de bugs resultantes era el uso de un parámetro que en sí mismo era una expresión y no un nombre primario cuando el escritor macro esperaba un nombre. Esto era porque muchos programadores estaban bastante confundidos por la sustitución de parámetros macro y no distinguían la diferencia entre procesamiento macro. Customer Information Control System. El ejemplo más temprano de este acercamiento estaba en el Concept-14 macro set. y aparece. CICS. los lenguajes homoicónicos. o las rutinas que llaman pueden envolver en paréntesis los parámetos de entrada. Para evitar cualquier posible ambigüedad. sería: foo: macro a load (a)*b y su expansión. tales como Lisp. retienen el poder de los macros de lenguaje ensamblador porque pueden manipular su propio código como datos. (desarrolladores del sistema operativo Idris. Por ejemplo. y lo que fue reportado como el primer compilador C comercial). incluyendo la mayoría de los sistemas operativos y de las aplicaciones grandes. o para resolver problemas de desempeño crítico. todavía se están desarrollando y aplicando en casos donde las limitaciones de recursos o las particularidades en la arquitectura de sistema objetivo previenen el efectivo uso de lenguajes de alto nivel. Sin embargo.[6] A pesar de eso. aunque el lenguaje ensamblador es casi siempre manejado y generado por los compiladores. liberando a los programadores del tedio tal como recordar códigos numéricos y cálculo de direcciones.[cita requerida] en la búsqueda de una mejorada productividad en programación. Un factor psicológico también pudo haber jugado un papel: la primera generación de programadores de los microcomputadores conservó una actitud de aficionado de "alambres y alicates". muchas aplicaciones comerciales fueron escritas en lenguaje ensamblador. pero incorporaba una sintaxis de expresión para indicar el orden de ejecución. junto con construcciones de programación estructurada orientadas a bloques. . Ha habido poca demanda aparente para ensambladores más sofisticados debido a la declinación del desarrollo de lenguaje ensamblador de larga escala. Una vez fueron ampliamente usados para todo tipo de programación. todavía se usa para la manipulación directa del hardware. Los paréntesis y otros símbolos especiales. aunque un número de organizaciones grandes conservaran las infraestructuras de aplicaciones en lenguaje ensamblador hasta bien entrados los años 1990. y sistemas de tiempo real. incluyendo una gran cantidad del software escrito por grandes corporaciones para mainframes de IBM. Un curioso diseño fue A-natural. Los usos típicos son drivers de dispositivo. controlaban la secuencia de las instrucciones generadas. similar al Unix). Los lenguajes ensambladores eliminaron mucha de la propensión a errores y del consumo de tiempo de la programación de los lenguajes de primera generación que se necesitaba con los primeros computadores. sistemas embebidos de bajo nivel. Los sistemas operativos fueron casi exclusivamente escritos en lenguaje ensamblador hasta la aceptación ámplia del lenguaje de programación C en los años 1970 y principios de los 1980. mayor velocidad y confiabilidad. Históricamente. La mayoría de los primeros microcomputadores confiaron en el lenguaje ensamblador codificado a mano. porque trabajaba con elementos de máquina crudos tales como opcodes. Hoy en día. A-natural fue construido como el lenguaje objeto de un compilador C. y proporcionaron servicios de sistema limitados y con errores. cuando fueron referidos como lenguajes de programación de segunda generación. las más grandes razones para usar el lenguaje ensamblador era hacer programas con mínimo tamaño. En un contexto más comercial. por los años 1980 (1990 en los microcomputadores). el SOAP (Symbolic Optimal Assembly Program) era un lenguaje ensamblador de 1957 para el computador IBM 650. pero su sintaxis lógica ganó algunos seguidores. impusieron idiosincráticas arquitecturas de memoria y de pantalla. Esto era porque estos sistemas tenían limitaciones severas de recursos. Los lenguajes COBOL y FORTRAN eventualmente desplazaron mucho de este trabajo. un ensamblador "orientado a la corriente" (stream-oriented) para los procesadores 8080/Z80[cita requerida] de Whitesmiths Ltd. El lenguaje fue clasificado como un ensamblador. mínima sobrecarga. Quizás más importante era la falta de compiladores de primera clase de lenguajes de alto nivel adecuados para el uso en el microcomputador. y referencias de memoria.Lenguaje ensamblador acercamiento fue ampliamente aceptado a principios de los años 1980 (los últimos días del uso de lenguaje ensamblador en gran escala). registros. acceso a instrucciones especializadas del procesador. un gran número de programas han sido escritos enteramente en lenguaje ensamblador.[7] 9 Uso del lenguaje ensamblador Perspectiva histórica Los lenguajes ensambladores fueron primero desarrollados en los años 1950. en vez de la codificación manual. También. su uso había sido en gran parte suplantado por los lenguajes de alto nivel. y exponenciación. es decir uno que deba ejecutarse sin recursos a componentes de tiempo de ejecución o a bibliotecas asociadas con un lenguaje de alto nivel. y para la consternación de los amantes de la eficiencia. Ejemplos consisten en teléfonos. una cónsola para la cual era notoriamente desafiante desarrollar y programar juegos. con retardos causados por embotellamientos predecibles tales como operaciones de entrada/salida y paginación de memoria. sistemas de seguridad. incluso tienen IDEs con características de depuración y macros altamente avanzados. El ensamblador para el VIC-20 fue escrito por Don French y publicado por French Silk. También permitía expresiones de direcciones que podían combinarse con las operaciones de adición.[10] 10 Uso actual Siempre ha habido debates sobre la utilidad y el desempeño del lenguaje ensamblador relativo a lenguajes de alto nivel. Hay algunas situaciones en las cuales los profesionales pudieran elegir utilizar el lenguaje ensamblador. El ensamblador soportaba el direccionamiento simbólico usual y la definición de cadenas de caracteres o cadenas hexadecimales. a pesar de los contraejemplos que pueden ser encontrados. tales como el freeware ASM-One assembler [9]. El ensamblador ha sido por largo trecho. Con 1639 bytes de longitud. El lenguaje ensamblador tiene nichos específicos donde es importante (ver abajo). ésta es quizás la situación más común.[14][15] Adicionalmente.[8] El popular juego de arcade NBA Jam (1993) es otro ejemplo. Atari ST.Lenguaje ensamblador Los típicos ejemplos de programas grandes en lenguaje ensamblador de ese tiempo son los sistemas operativos IBM PC DOS y aplicaciones tempranas tales como la hoja de cálculo Lotus 1-2-3.[cita requerida] Según algunos insiders de la industria. AND lógico. así como insuficientes características para aprovechar completamente el hardware disponible. Son programas empotrados que solo almacenan una pequeña cantidad de memoria y el dispositivo está dirigido para hacer tareas para un simple propósito. incluyendo la mayoría de los juegos para la Mega Drive/Genesis y el Super Nintendo Entertainment System. el lenguaje ensamblador era el mejor lenguaje de programación a usar para obtener el mejor desempeño del Sega Saturn. En el lenguaje de alto nivel esto es a veces ayudado por funciones intrínsecas del compilador que mapean directamente a los mnemónicos del SIMD. y sensores • interactuando directamente con el hardware. la mayoría de los videojuegos de cónsola fueron escritos en ensamblador. multiplicación. Un ejemplo común es la instrucción de rotación bitwise en el núcleo de muchos algoritmos de cifrado • creando funciones vectorizadas para programas en lenguajes de alto nivel como C. más notablemente el Amiga. división. así como para los programadores en ensamblador. OR lógico. Pero. el lenguaje de desarrollo primario en los computadores hogareños Commodore 64. Por ejemplo cuando: • es requerido un ejecutable binario independiente (stand-alone). su autor cree que es el más pequeño ensamblador simbólico jamás escrito. pero sin embargo resulta en una conversión de ensamblador de uno a uno para un procesador de vector asociado . Esto ha hecho que la velocidad de ejecución cruda del código no sea un problema para muchos programadores. el desempeño cada vez mayor del procesador ha significado que la mayoría de los CPU estén desocupados la mayor parte del tiempo. substracción. y casi todos los juegos populares para la familia Atari 800 de computadores personales. Algunos sistemas. así como el ZX Spectrum. sistemas de control del aire acondicionado. por ejemplo en drivers de dispositivo y manejadores de interrupción • usando instrucciones específicas del procesador no explotadas o disponibles por el compilador. en general. sistemas de combustible e ignición para automóviles. comparable a las del Microsoft Visual Studio (el ASM-Uno precede al Microsoft Visual Studio). Esto fue así en gran parte porque los dialectos del BASIC en estos sistemas ofrecieron insuficiente velocidad de ejecución.[11][12][13] La complejidad de los procesadores modernos y del subsistema de memoria hace la optimización efectiva cada vez más difícil para los compiladores. los modernos compiladores de optimización[cita requerida] para traducir lenguajes de alto nivel en código que puede correr tan rápidamente como el lenguaje ensamblador escrito a mano. Incluso en los años 1990. asignación de memoria. pero esto está llegando a ser menos común a medida que el precio del procesador decrece y el desempeño mejora • no existe ningún lenguaje de alto nivel. tales como sistemas de navegación de vuelo. operaciones de paginación. que pueden ser creados por (algunos) lenguajes interpretados. ej. recolección de basura automática.[17] (una biblioteca para codificar streams de video) • un sistema con severas limitaciones de recursos (ej. • se escriben virus de computadora. Puesto que el comportamiento del computador es fundamentalmente definido por su conjunto de instrucciones. Por ejemplo. o multitarea preventiva. permitiendo a los juegos correr más rápidamente. Sin embargo. • se hace ingeniería inversa y modificación de video juegos (también denominado ROM hacking).Lenguaje ensamblador • es requerida la optimización extrema. álgebra lineal con BLAS[11][16] o la transformada de coseno discreta (ej. en un bucle interno en un algoritmo intensivo en el uso del procesador. codificación de conjunto de caracteres. También las grandes simulaciones científicas requieren algoritmos altamente optimizados. y diseño de compiladores. Tales sistemas deben eliminar fuentes de retrasos impredecibles. Aunque hoy en día. ej. bootloaders. algo para lo que el lenguaje ensamblador se presta bien • se escriben juegos y otros softwares para calculadoras gráficas[18] • se escribe software compilador que genera código ensamblador. u otros elementos muy cerca del hardware o al sistema operativo de bajo nivel • se escriben simuladores del conjunto de instrucciones para monitoreo. y equipo médico. por ejemplo al crackear la protección anticopia del software propietario. Elegir el ensamblador o lenguajes de bajo nivel para tales sistemas da a los programadores mayor visibilidad y control sobre el proceso de los detalles • es requerido control total sobre el ambiente. El más ampliamente implementado es alterando el código del programa a nivel de lenguaje ensamblador • se escribe código automodificable. procesamiento del stack. y iii) ver cómo el código ejecutable eficiente puede ser creado por los lenguajes de alto nivel[19] 11 . la versión SIMD en ensamblador del x264. serían duros de estudiar en detalle sin la comprensión de cómo el computador opera a nivel del hardware. algunos lenguajes de alto nivel incorporan componentes de tiempo de ejecución e interfaces de sistema operativo que pueden introducir tales retrasos. por ejemplo • escribiendo programas de tiempo real que necesitan sincronización y respuestas precisas. y por lo tanto los desarrolladores deben ser programadores de lenguaje ensamblador • se escriben algoritmos criptográficos que siempre deben tomar estrictamente el mismo tiempo para ejecutar. en un procesador nuevo o especializado. previniendo ataques de tiempo Sin embargo. la manera lógica de aprender tales conceptos es estudiar un lenguaje ensamblador. La mayoría de los computadores modernos tienen un conjunto de instrucciones similares. la telemetría debe ser interpretada y hay que actuar dentro de limitaciones estrictas de tiempo. Los programadores de juegos toman ventaja de las habilidades de las características del hardware en los sistemas. el lenguaje ensamblador es todavía enseñado en la mayoría de los programas de ciencias de la computación e ingeniería electrónica. procesamiento de interrupciones. en un sistema fly-by-wire (vuelo por mandos eléctricos). Tales tópicos fundamentales. un sistema empotrado) debe ser codificado a mano para maximizar el uso de los limitados recursos. pocos programadores trabajan regularmente con el lenguaje ensamblador como una herramienta. Por lo tanto. como aritmética binaria. que es posible por medio de varios métodos. ii) reconocer situaciones donde el uso de lenguaje ensamblador puede ser apropiado. ciertos drivers de dispositivo. trazado y depuración de errores donde la sobrecarga adicional es mantenida al mínimo • se hace ingeniería inversa en binarios existentes que pueden o no haber sido escritos originalmente en un lenguaje de alto nivel. en situaciones de seguridad extremadamente alta donde nada puede darse por sentado. estudiar un solo lenguaje ensamblador es suficiente para aprender: i) los conceptos básicos. los conceptos fundamentales continúan siendo muy importantes. Este código de bajo nivel es usado. Una vez que ha tomado lugar un cierto nivel de inicialización del hardware. El código optimizado en ensamblador es escrito "a mano" por los programadores en un intento de minimizar el número de ciclos de CPU usados. pero el código corriendo inmediatamente después de que es aplicada la energía usualmente está escrito en lenguaje ensamblador. algunos ensambladores pueden leer el dialecto de otro. Las limitaciones del CPU son tan grandes que cada ciclo cuenta.99 MHz. ha sido escrito al menos uno. siendo típicamente escrito uno nuevo por cada port. FASM y NASM tienen una sintaxis similar. A veces. usualmente al enlazar con una biblioteca de lenguaje C que no cambia entre sistemas operativos. . y cónsola de juegos. para producir gráficos en 3D en tiempo real con efectos avanzados. El código de máquina es usualmente fácil de trasladar hacia lenguaje ensamblador para luego ser cuidadosamente examinado en esta forma. con frecuencia proveen sintaxis especial para empotrar lenguaje ensamblador en cada plataforma de hardware. Esto es esencialmente lo que logra el microcódigo cuando una plataforma de hardware cambia internamente. entre otras cosas. sistema empotrado. pero las características avanzadas serán diferentes[21] También. vea la lista de ensambladores. procesar el código objeto/binario de cualquier ensamblador) para lograr la portabilidad incluso a través de plataformas (con una sobrecargue no mayor que la de un interpretador de bytecode típico). hacen uso extenso del desensamblador para tales propósitos. 4 KB ó 64 KB). y posiblemente docenas de ensambladores. tanto del pasado como del presente. Ciertas competiciones requieren a los concursantes restringir sus creaciones a un muy pequeño tamaño (ej.Lenguaje ensamblador 12 Aplicaciones típicas El lenguaje ensamblador hard-coded es típicamente usado en el ROM de arranque del sistema (BIOS en los sistemas compatible IBM PC). mainframe. Lenguajes de relativo bajo nivel. es una necesidad la codificación en ensamblador. por ejemplo.[cita requerida] Detalles adicionales Para un determinado computador personal. Un número de variantes de Unix usan el GAS Dentro de los grupos de procesadores. la ejecución se transfiere a otro código. y el Commodore 64. especialmente en sistemas constreñidos por el procesamiento del CPU. los lenguajes ensambladores a veces pueden ser portables a través de diferentes sistemas operativos en el mismo tipo de CPU. Las convenciones de llamadas entre los sistemas operativos con frecuencia difieren ligeramente o en nada. y con cuidado es posible ganar portabilidad en el lenguaje ensamblador. Lo mismo es cierto para los boot loaders. a sistemas como el Commodore 64.[20] Cuando los recursos son una preocupación. aunque no es un simple cuerpo de código. 256 bytes. cada ensamblador tiene su propio dialecto. pero cada uno soporta diferentes macros que pueden ser difícil de trasladar de uno al otro. Herramientas como Interactive Disassembler. como los primeros modelos del Amiga. el ensamblador es llamado tradicionalmente as. Un nicho que hace uso del lenguaje ensamblador es el demoscene. pero es muy difícil de trasladar hacia un lenguaje de alto nivel. pero no al revés. Las cosas básicas son siempre las mismas. Usar tales métodos ha habilitado. TASM puede leer el viejo código del MASM. permitiendo que el código en ensamblador sea visto para propósitos de depuración y optimización. El código portable del sistema entonces puede usar estos componentes específicos a un procesador a través de una interface uniforme. En los sistemas Unix. para inicializar y probar el hardware del sistema antes de cargar el sistema operativo. 1 KB. Para algunos ejemplos. en teoría. como C. una hazaña que puede ser considerada improbable o incluso imposible para un sistema con un procesador de 0. Muchos compiladores traducen lenguajes de alto nivel a lenguaje ensamblador primero. típicamente escrito en lenguajes de alto nivel. y el lenguaje ensamblador es el lenguaje de preferencia para alcanzar este objetivo. y está almacenado en el ROM. antes de la compilación completa. Un simulador de conjunto de instrucciones (que idealmente sería escrito en lenguaje ensamblador) puede. El lenguaje ensamblador también es valioso en ingeniería inversa. puesto que muchos programas solamente son distribuidos en una forma de código de máquina. data Cadena1 DB 'Hola Mundo. Peor aún. segmento del stack . Para manejar estos problemas. AH = código de la función del MS DOS para imprimir un string en la pantalla . el proyecto FASMLIB provee una biblioteca de lenguaje ensamblador portable para las plataformas Win32 y Linux. segmento del código . donde relativamente secciones cortas de código en ensamblador puede ser empotradas dentro del código del lenguaje de alto nivel.[22] Algunos lenguajes de muy alto nivel. tanto como el tamaño de ciertas typedefs como off_t. El lenguaje Forth comúnmente contiene un ensamblador usado para codificar palabras. --------------------------------------------. soportan ensamblado en línea. @data MOV DS. haciendo imposible portar llamadas de funciones en libc diferentes de los que toman simples enteros o punteros como parámetros. llamada al MS DOS para finalizar el programa . --------------------------------------------. Programa que imprime un string en la pantalla . modelo de memoria .code .stack . no están disponibles en lenguaje ensamblador sin la ayuda de un script de configuración. y difieren incluso entre versiones de Linux.model small . el tamaño y el orden de los campos de las estructuras. AX MOV DX. . llamada al MS DOS para imprimir un string en la pantalla . 9 INT 21h INT 20h end programa . mueve la dirección al registro de segmento por medio de AX .$' . algunas funciones y símbolos ni siquiera están garantizados que existan fuera del preprocesador. al programa antes de compilar. --------------------------------------------programa: MOV AX. segmento de datos . mueve a DX la dirección del string a imprimir . pero todavía está muy incompleta. offset Cadena1 MOV AH. cosas que son específicas del sistema operativo o específicas del C. muchas cosas en libc dependen del preprocesador para hacer. como C y Borland Pascal. Inicio del programa .Lenguaje ensamblador Por ejemplo. string a imprimir (finalizado en $) . carga en AX la dirección del segmento de datos . La mayoría de la gente usa un emulador para depurar sus programas en lenguaje ensamblador. 13 Ejemplos de lenguaje ensamblador Ejemplo para la arquitectura x86 El siguiente es un ejemplo del programa clásico Hola mundo escrito para la arquitectura de procesador x86 (bajo el sistema operativo DOS). De hecho. --------------------------------------------. interrupción del timer 0.Lenguaje ensamblador 14 Ejemplo para el computador virtual (POCA) Una selección de instrucciones para una computadora virtual[23]) con las correspondientes direcciones de memoria en las que se ubicarán las instrucciones.org 2048 a_start 2048 2064 2068 2072 2076 2080 2084 2088 done: 2092 length: .%r0 20 10000001 11000011 11100000 00000100 00000000 00000000 00000000 00010100 00000000 00000000 00001011 10111000 2096 address: a_start .% be done addcc %r1. Cada instrucción se acompaña del código en lenguaje ensamblador generado (código objeto) que coincide con la arquitectura de computador virtual.0.%r4 10001000 10000000 01000000 00000010 ld %r4.T05SEG CJNE R1.%r5.DPL MOV R2. .begin .%r5 ba loop 11001010 00000001 00000000 00000000 00010000 10111111 11111111 11111011 addcc %r3.DPH CJNE R2.%r3 10000110 10000000 11000000 00000101 jmpl %r15+4.%r2.esta subrutina es utilizada .equ 3000 ld length.-4.T05SEG CLR TR0 CPL uSEG MOV R1. Estas direcciones NO son estáticas.%r1 00000010 10000000 00000000 00000110 10000010 10000000 01111111 11111100 Código máquina [24] addcc %r1.#0 RET . Etiqueta Instrucción .5 segundos mediante la . Dir. o conjunto de instrucciones ISA.T05SEG MOV DPTR.para realizar una cuenta de .org a_start 3000 a:</tt Ejemplo para el µC Intel 8051 Código en lenguaje ensamblador para µC Intel 80C51: ORG 8030H T05SEG: SETB TR0 JNB uSEG.#07H.#78H. [18] « 68K Programming in Fargo II (http:/ / tifreakware. «2».asm (http:/ / git. Consultado el 03-07-2008.. hardwarebug. org/ web/ 20080211025322rn_1/ www. (http:/ / www. [16] « BLAS Benchmark-August2008 (http:/ / eigen.org (30-01-2010). « assembly language: Definition and Much More from Answers. Consultado el 03-07-2008. 256b. Consultado el 04-03-2010. net/ ~jimbo/ art/ int7. Randall (30-09-1996). [22] "vid". git. Consultado el 19-06-2008. cit. net/ tutorials/ 89/ a/ calc/ fargoii. « Speaking with Don French : The Man Behind the French Silk Assembler Tools (http:/ / www. edu/ ~lockwood/ class/ cs306/ books/ artofasm/ fwd. aspx)». [15] « Code sourcery fails again (http:/ / hardwarebug. Assemblers and Loaders (http:/ / www. « Which Assembler is the Best? (http:/ / webster. [6] Answers.a=tree.RP0 PORTB 0xFF PORTA STATUS. wustl. [13] « GCC makes a mess (http:/ / hardwarebug. org/ 2009/ 05/ 13/ gcc-makes-a-mess/ )». [21] Randall Hyde. Consultado el 04-03-2010. edu/ Page_TechDocs/ GreatDebate/ debate1. org/ 2010/ 01/ 30/ bit-field-badness/ )». cs. cs.f=common/ x86. net/ features. ucr.org (30-01-2010). us/ pscott/ software/ mvs/ concept14.C bsf clrf movlw movwf bcf Principal movf movwf movf btfsc goto sublw btfss END Referencias [1] [2] [3] [4] David Salomon (1993). php)». name/ assem. php?title=Benchmark-August2008)». Consultado el 22-06-2010. x86asm.git/common/x86/dct-32. Consultado el 29-09-2010. [20] « 256bytes demos archives (http:/ / web. Open Source.Lenguaje ensamblador 15 Ejemplo para el Microchip PIC16F84 Código en lenguaje ensamblador para el microcontrolador 16F84 de Microchip: ORG Inicio 0 STATUS. [17] « x264. net/ tiki-index. hardwarebug. sourceforge.F STATUS. html [10] Jim Lawless (21-05-2004). pdf) Beck. html)». com/ 2005/ 11/ 28/ technology/ 28super. advertis/ asl. 90). html)». [11] « Writing the Fastest Code. Consultado el 25 de mayo de 2009. php?page=SegaBase+ Saturn) [9] http:/ / www. (1996). « Foreword ("Why would anyone learn this stuff?"). org/ index.org (29-09-2010).RP0 PORTA. [14] Randall Hyde.videolan. git. MVS Software. html)». nytimes. arl. org/ ?p=x264.hb=HEAD)». info/ homepage. org/ 2008/ 11/ 28/ codesourcery-fails-again/ )». theflamearrows. « FASMLIB: Features (http:/ / fasmlib. de/ z80/ z80code. archive. com/ home. htm « Macros (C/C++). Consultado el 25-07-2008. eidolons-inn. html)». 6502 Assembler for the Nintendo Entertainment System (http:/ / neshla. Consultado el 19-10-2007. John Markoff (28-11-2005). html?_r=1)». [5] « Concept 14 Macros (http:/ / skycoast. for Fun: A Human Computer Keeps Speeding Up Chips (http:/ / www. html)».tuxfamily. htm)». com/ en-us/ library/ 503x3e3s(v=VS. [7] NESHLA: The High Level. z80. MSDN Library for Visual Studio 2008 (http:/ / msdn. tuxfamily. [19] Hyde. Microsoft Corp.com.org (13-05-2009).org (01-08-2008). Leland L. New York Times. . Consultado el 04-03-2010. answers. videolan. by Hand. [12] « Bit-field-badness (http:/ / hardwarebug.com (http:/ / www. edu/ AsmTools/ WhichAsm. « The Great Debate (http:/ / webster. http:/ / www. op. Addison Wesley. System Software: An Introduction to Systems Programming. Consultado el 04-03-2010. microsoft. davidsalomon. Consultado el 04-03-2010.W Contador Contador.Z PuntoDecimal d'9' STATUS. hardwarebug. Consultado el 05-03-2010. eigen. radiks. htm)». com/ topic/ assembly-language?cat=technology)». Consultado el 19-10-2007. ucr. Consultado el 03-07-2008. net/ ) [8] Eidolon's Inn : SegaBase Saturn (http:/ / www. drpaulcarter. acceso el 24 de agosto de 2005 [24] Murdocca.com/pcasm/) • Jeff Duntemann: Assembly Language Step-by-Step.computer-books.savannah. John Wiley & Sons. 2004.net/book/) by the ASM Community (http://www.com/).Lenguaje ensamblador [23] Principles of Computer Architecture (http:/ / iiusaedu. Addison Wesley.asmcommunity. asmcommunity.org/projects/pgubook/) by Jonathan Bartlett • The ASM Book (http://www.wustl.zip) by Dr Paul Carter. Bartlett Publishing. ISBN 1-886411-97-2 Draft versions available online (http://webster. Assembler Language Programming and Machine Organization.net/book/) "An online book full of helpful ASM info. Vincent P. • Michael Singer. 2003. • The Art of Assembly Language Programming (http://cs.org/perldoc?Inline::ASM) módulo Perl en CPAN para programar en lenguaje ensamblador dentro de programas Perl (en inglés) • Ejemplos prácticos de ensamblador en GNU/Linux (http://snippets-tricks.us/assembler.pdf) • Paul Carter: PC Assembly Language. 2000.html). tutorials and code examples" by the ASM Community • Jonathan Bartlett: Programming from the Ground Up (http://programminggroundup. Online Assembly Language Brooks • PC Assembly Language(español) (http://www. 2001. ISBN 0-9752838-4-7 Also available online as PDF (http://download.ucr.com/pcasm/) by Paul Carter • Programming from the Ground Up (http://savannah. * PC Assembly Tutorial using NASM and GCC (http://drpaulcarter.smith.org/releases-noredirect/pgubook/ ProgrammingGroundUp-1-0-booksize. Brady Books. ISBN 0-201-39828-1 • ASM Community Book (http://www.html) as PDF and HTML • Peter Norton. (http://www.us (http://www. ISBN 0-201-43664-7 16 Lectura adicional • Dominic Sweetman: See MIPS Run. Miles J.edu/AoA/index.net) • Inline::ASM (http://search.edu/~lockwood/class/cs306/books/artofasm/toc. PDP-11.php).cs. Morgan Kaufmann Publishers. Wiley.cpan.:Principles of Computer Architecture (2000). Prentice Hall. NY: 1986.edu/~thiebaut/ArtOfAssembly/artofasm.org/topico/programacion/ ensamblador/) .html) by Randall Hyde • Computer-Books. ISBN 0-471-37523-3 • Randall Hyde: The Art of Assembly Language. ISBN 1-55860-410-3 • Robert Britton: MIPS Assembly Language Programming. 1999. No Starch Press. Peter Norton's Assembly Language Book for the IBM PC. Enlaces externos Wikilibros • Wikilibros alberga un libro o manual sobre Programación en lenguaje ensamblador. Website (http://drpaulcarter.asmcommunity. ISBN 0-13-142044-5 • John Waldron: Introduction to RISC Assembly Language Programming.nongnu. Prentice Hall. NY: 1980. com/ ~murdocca/ POCA) (POCA) – ARCTools computadora virtual disponible para descarga y ejecución del código.blogspot. 2003.arl. y Heuring.gnu. John Socha. Free ebook.com/pcasm/pcasm-book-spanish. 1998. Vizcarra.0 Unported //creativecommons. Platonides. Elabra sanchez. Gades21.wikipedia. Antur. Locovich.php?oldid=63605778  Contribuyentes: Airunp.png  Fuente: http://es. Lentucky. ^CiViLoN^. Jesuja. Jerowiki. X. Laura Fiorucci. Triku. Sergio Andres Segovia. Mrisco. Marvelshine. Grillitus. Z80user. Digigalos. AlfonsoERomero. Jynus. Piero71.png  Licencia: Public Domain  Contribuyentes: German Archivo:Wikibooks-logo. ManuelGR. Rafa3040. Tirithel.php?title=Archivo:Wikibooks-logo. Diegusjaimes. ILoveSugar. Kved. Qwertyytrewqqwerty. Vitamine. User:Ramac et al. Albertochoa. Kroji. Muro de Aguas. Lu Tup. FrancoGG. Pilaf.org/w/index. Kbradero.org/licenses/by-sa/3. Gothmog. Jcfidy. BuenaGente. Jkbw. Roberto Fiadone.org/w/index. Licencias y contribuyentes Archivo:Codigo de maquina. Sanbec. JorgeGG.svg  Licencia: logo  Contribuyentes: User:Bastique. Biasoli. Netito777. Porao. Andreasmperu. Codename. Matdrodes. Galandil. MatiasBellone. Moriel.0/ .svg  Fuente: http://es. GermanX. Emijrp. R010178. Tomatejc. 197 ediciones anónimas Fuentes de imagen.wikipedia. Jugones55. Isha. Surfaz.wikipedia. Scapegoat001. Oespinosa. Halfdrag. Segedano.Fuentes y contribuyentes del artículo 17 Fuentes y contribuyentes del artículo Lenguaje ensamblador  Fuente: http://es. Maldoror. Licencia Creative Commons Attribution-Share Alike 3.php?title=Archivo:Codigo_de_maquina.org/w/index.Cyclop. Manwë. Ricardogpn. Hann. JoaquinFerrero. Cristianrock2. Sabbut. Santiperez.
Copyright © 2024 DOKUMEN.SITE Inc.