Anda di halaman 1dari 11

Lenguaje ensamblador

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
Lenguaje de máquina del Intel 8088. El código de máquina en utilizado en el desarrollo de controladores de dispositivo
hexadecimal se resalta en rojo, el equivalente en lenguaje en- (en inglés, device drivers) y en el desarrollo de sistemas
samblador en magenta, y las direcciones de memoria donde se operativos, debido a la necesidad del acceso directo a las
encuentra el código, en azul. Abajo se ve un texto en hexadecimal
instrucciones de la máquina. Muchos dispositivos progra-
y ASCII.
mables (como los microcontroladores) aún cuentan con el
ensamblador como la única manera de ser manipulados.
El lenguaje ensamblador, o assembler (en inglés
assembly language y la abreviación asm), es un
lenguaje de programación de bajo nivel. Consiste en 1 Características
un conjunto de mnemónicos que representan instruccio-
nes básicas para los computadores, microprocesadores,
microcontroladores y otros circuitos integrados progra- • El código escrito en lenguaje ensamblador posee
mables. Implementa una representación simbólica de los una cierta dificultad de ser entendido ya que su es-
códigos de máquina binarios y otras constantes necesa- tructura se acerca al lenguaje máquina, es decir, es
rias para programar una arquitectura de procesador y un lenguaje de bajo nivel.
constituye la representación más directa del código má-
• El lenguaje ensamblador es difícilmente portable,
quina específico para cada arquitectura legible por un
es decir, un código escrito para un microprocesa-
programador. Cada arquitectura de procesador tiene su
dor, puede necesitar ser modificado, para poder ser
propio lenguaje ensamblador que usualmente es defini-
usado en otra máquina distinta. Al cambiar a una
da por el fabricante de hardware, y está basada en los
máquina con arquitectura diferente, generalmente
mnemónicos que simbolizan los pasos de procesamien-
es necesario reescribirlo completamente.
to (las instrucciones), los registros del procesador, las po-
siciones de memoria y otras características del lenguaje.
• Los programas hechos por un programador experto
Un lenguaje ensamblador es por lo tanto específico de
en lenguaje ensamblador son generalmente mucho
cierta arquitectura de computador física (o virtual). Esto
más rápidos y consumen menos recursos del siste-
está en contraste con la mayoría de los lenguajes de pro-
ma (memoria RAM y ROM) que el programa equi-
gramación de alto nivel, que idealmente son portátiles.
valente compilado desde un lenguaje de alto nivel.
Un programa utilitario llamado ensamblador es usado pa- Al programar cuidadosamente en lenguaje ensam-
ra traducir sentencias del lenguaje ensamblador al códi- blador se pueden crear programas que se ejecutan
go de máquina del computador objetivo. El ensamblador más rápidamente y ocupan menos espacio que con
realiza una traducción más o menos isomorfa (un mapeo lenguajes de alto nivel.
de uno a uno) desde las sentencias mnemónicas a las ins-
trucciones y datos de máquina. Esto está en contraste con • Con el lenguaje ensamblador se tiene un con-
los lenguajes de alto nivel, en los cuales una sola decla- trol muy preciso de las tareas realizadas por un
ración generalmente da lugar a muchas instrucciones de microprocesador por lo que se pueden crear seg-
máquina. mentos de código difíciles y/o muy ineficientes de
programar en un lenguaje de alto nivel, ya que, entre
Muchos sofisticados ensambladores ofrecen mecanismos
otras cosas, en el lenguaje ensamblador se dispone
adicionales para facilitar el desarrollo del programa, con-
de instrucciones del CPU que generalmente no están
trolar el proceso de ensamblaje, y la ayuda de depuración.
disponibles en los lenguajes de alto nivel.
Particularmente, la mayoría de los ensambladores moder-
nos incluyen una facilidad de macro (descrita más abajo), • También se puede controlar el tiempo en que tarda
y se llaman macro ensambladores. una rutina en ejecutarse, e impedir que se interrum-
Fue usado principalmente en los inicios del desarrollo de pa durante su ejecución.

1
2 3 LENGUAJE

2 Programa ensamblador 2.2 Ensambladores de alto nivel


Los más sofisticados ensambladores de alto nivel propor-
Generalmente, un programa ensamblador (assembler en
cionan abstracciones del lenguaje tales como:
inglés) moderno crea código objeto traduciendo instruc-
ciones mnemónicas de lenguaje ensamblador en opcodes,
y resolviendo los nombres simbólicos para las localizacio- • Estructuras de control avanzadas
nes de memoria y otras entidades.[1] El uso de referencias
• Declaraciones e invocaciones de procedimien-
simbólicas es una característica clave del lenguaje ensam-
tos/funciones de alto nivel
blador, evitando tediosos cálculos y actualizaciones ma-
nuales de las direcciones después de cada modificación • Tipos de datos abstractos de alto nivel, incluyendo
del programa. La mayoría de los ensambladores también las estructuras/records, uniones, clases, y conjuntos
incluyen facilidades de macros para realizar sustitución
textual - ej. generar cortas secuencias de instrucciones co- • Procesamiento de macros sofisticado (aunque está
mo expansión en línea en vez de llamar a subrutinas. disponible en los ensambladores ordinarios desde fi-
Los ensambladores son generalmente más simples de es- nales de 1960 para el IBM/360, entre otras máqui-
cribir que los compiladores para los lenguajes de alto ni- nas)
vel, y han estado disponibles desde los años 1950. Los en- • Características de programación orientada a objetos
sambladores modernos, especialmente para las arquitec-
turas basadas en RISC, tales como MIPS, Sun SPARC, y
HP PA-RISC, así como también para el x86 (−64), op- 2.3 Uso del término
timizan la planificación de instrucciones para explotar la
segmentación del CPU eficientemente. Note que, en el uso profesional normal, el término en-
En los compiladores para lenguajes de alto nivel, son el samblador es frecuentemente usado tanto para referir-
último paso antes de generar el código ejecutable. se 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 se-
rá enlazado para producir lenguaje de máquina). Las dos
2.1 Número de pasos expresiones siguientes utilizan el término “ensamblador":

Hay dos tipos de ensambladores basados en cuántos pa-


sos a través de la fuente son necesarios para producir el 3 Lenguaje
programa ejecutable.
El lenguaje ensamblador refleja directamente la arqui-
tectura y las instrucciones en lenguaje de máquina de la
• Los ensambladores de un solo paso pasan a través
CPU, y pueden ser muy diferentes de una arquitectura de
del código fuente una vez y asumen que todos los
CPU a otra. Cada arquitectura de microprocesador tiene
símbolos serán definidos antes de cualquier instruc-
su propio lenguaje de máquina, y en consecuencia su pro-
ción que los refiera.
pio lenguaje ensamblador ya que este se encuentra muy
ligado a la estructura del hardware para el cual se progra-
• Los ensambladores de dos pasos crean una tabla con ma. Los microprocesadores difieren en el tipo y número
todos los símbolos y sus valores en el primer paso, de operaciones que soportan; también pueden tener dife-
después usan la tabla en un segundo paso para gene- rente cantidad de registros, y distinta representación de
rar código. El ensamblador debe por lo menos po- los tipos de datos en memoria. Aunque la mayoría de los
der determinar la longitud de cada instrucción en el microprocesadores son capaces de cumplir esencialmen-
primer paso para que puedan ser calculadas las di- te las mismas funciones, la forma en que lo hacen difiere
recciones de los símbolos. y los respectivos lenguajes ensamblador reflejan tal dife-
rencia.

La ventaja de un ensamblador de un solo paso es la ve-


locidad, que no es tan importante como lo fue en un mo- 3.1 Instrucciones de CPU
mento dados los avances en velocidad y capacidades del
computador. La ventaja del ensamblador de dos pasos es La mayoría de las CPU tienen más o menos los mismos
que los símbolos pueden ser definidos dondequiera en el grupos de instrucciones, aunque no necesariamente tie-
código fuente del programa. Esto permite a los progra- nen todas las instrucciones de cada grupo. Las operacio-
mas ser definidos de maneras más lógicas y más signifi- nes que se pueden realizar varían de una CPU a otra. Una
cativas, haciendo los programas de ensamblador de dos CPU particular puede tener instrucciones que no tenga
pasos más fáciles de leer y mantener.[2] otro y viceversa. Los primeros microprocesadores de 8
3.2 Ensamblado 3

bits no tenían operaciones para multiplicar o dividir nú- Son operaciones que mueven datos de un regis-
meros, por ejemplo, y había que hacer subrutinas para tro, desde y hacia un puerto; o de la memoria,
realizar esas operaciones. Otras CPU puede que no ten- desde y hacia un puerto
gan operaciones de punto flotante y habría que hacer o
conseguir bibliotecas que realicen esas operaciones. • INPUT Lectura desde un puerto de en-
Las instrucciones de la CPU pueden agruparse, de acuer- trada
do a su funcionalidad, en: • OUTPUT Escritura hacia un puerto de
Operaciones con enteros: (de 8, 16, 32 y 64 bits depen- salida
diendo de la arquitectura de la CPU, en los sistemas muy
viejos también de 12, 18, 24, 36 y 48 bits) Operaciones para el control del flujo del programa:
Estas son operaciones realizadas por la Unidad aritmético
lógica de la CPU • Llamadas y retornos de subrutinas

• Llamadas y retornos de interrupciones


• Operaciones aritméticas. Como suma, resta, multi-
plicación, división, módulo, cambio de signo • Saltos condicionales de acuerdo al resultado de la
comparaciones
• Operaciones booleanas. Operaciones lógicas bit a bit
como AND, OR, XOR, NOT • Saltos incondicionales
• Operaciones de bits. Como desplazamiento o shift
lógico y rotaciones u Operadores a nivel de bits (ha- Operaciones con números reales:
cia la derecha o hacia la izquierda, a través del bit El estándar para las operaciones con números reales en
del acarreo o sin él) las CPU está definido por el IEEE 754.
• Comparaciones Una CPU puede tener operaciones de punto flotante con
números reales mediante el coprocesador numérico (si lo
Operaciones de mover datos: hay), como las siguientes:

Entre los registros y la memoria: • Operaciones aritméticas. Suma, resta, multiplica-


ción, división, cambio de signo, valor absoluto, parte
entera
Aunque la instrucción se llama “mover”, en la
CPU, “mover datos” significa en realidad co- • Operaciones trascendentales
piar datos, desde un origen a un destino, sin que
el dato desaparezca del origen. • Operaciones trigonométricas. Seno, coseno,
tangente, arcotangente
Se pueden mover valores: • Operaciones con logaritmos, potencias y raíces

• Desde un registro a otro • Otras


• Desde un registro a un lugar de la memo-
ria El lenguaje ensamblador tiene mnemónicos para cada
una de las instrucciones de la CPU en adición a otros
• Desde un lugar de la memoria a un regis-
mnemónicos a ser procesados por el programa ensam-
tro
blador (como por ejemplo macros y otras sentencias en
• Desde un lugar a otro de la memoria tiempo de ensamblado).
• Un valor inmediato a un registro
• Un valor inmediato a un lugar de memo- 3.2 Ensamblado
ria
La transformación del lenguaje ensamblador en código
Operaciones de pila (stack, en inglés): máquina la realiza un programa ensamblador, y la traduc-
ción inversa la puede efectuar un desensamblador. A dife-
• PUSH (escribe datos hacia el tope de la rencia de los lenguajes de alto nivel, aquí hay usualmente
pila) una correspondencia 1 a 1 entre las instrucciones simples
del ensamblador y el lenguaje de máquina. Sin embargo,
• POP (lee datos desde el tope de la pila) en algunos casos, un ensamblador puede proveer “pseudo
instrucciones” que se expanden en un código de máquina
Operaciones de entrada/salida: más extenso a fin de proveer la funcionalidad necesaria y
4 4 DISEÑO DEL LENGUAJE

simplificar la programación. Por ejemplo, para un códi- instrucción MOV y el código del registro hacia donde se
go máquina condicional como “si X mayor o igual que”, va a mover el dato:
un ensamblador puede utilizar una pseudoinstrucción al 1011 0000 01100001 | | | | | +---- Número 61h en binario
grupo “haga si menor que”, y “si = 0” sobre el resultado | | | +--- Registro AL +-------- Instrucción MOV
de la condición anterior. Los Ensambladores más com-
pletos también proveen un rico lenguaje de macros que En el segundo byte se especifica el número 61h, escrito en
se utiliza para generar código más complejo y secuencias binario como 01100001, que se asignará al registro AL,
de datos. quedando la sentencia ejecutable como:
Para el mismo procesador y el mismo conjunto de ins-
trucciones de CPU, diferentes programas ensambladores • 10110000 01100001
pueden tener, cada uno de ellos, variaciones y diferencias
en el conjunto de mnemónicos o en la sintaxis de su len- La cual puede ser entendida y ejecutada directamente por
guaje ensamblador. Por ejemplo, en un lenguaje ensam- el procesador.
blador para la arquitectura x86, se puede expresar la ins-
trucción para mover 5 al registro AL de la siguiente ma-
nera: MOV AL, 5, mientras que para otro ensamblador 4 Diseño del lenguaje
para la misma arquitectura se expresaría al revés: MOV
5, AL. Ambos lenguajes ensambladores harían exacta-
mente lo mismo, solo que está expresado de manera di-
4.1 Elementos básicos
ferente. El primero usa la sintaxis de Intel, mientras que
Hay un grado grande de diversidad en la manera en que
el segundo usa la sintaxis de AT&T
los autores de los ensambladores categorizan las senten-
El uso del ensamblador no resuelve definitivamente el cias y en la nomenclatura que usan. En particular, al-
problema de cómo programar un sistema basado en mi- gunos describen cualquier cosa como pseudo-operación
croprocesador de modo sencillo ya que para hacer un (pseudo-Op), con excepción del mnemónico de máquina
uso eficiente del mismo, hay que conocer a fondo el o del mnemónico extendido.
microprocesador, los registros de trabajo de que dispone,
Un típico lenguaje ensamblador consiste en 3 tipos de
la estructura de la memoria, y muchas cosas más referen-
sentencias de instrucción que son usadas para definir las
tes a su estructura básica de funcionamiento.
operaciones del programa:

3.3 Ejemplos • Mnemónicos de opcode

Un programa escrito en lenguaje ensamblador consiste en • Secciones de datos


una serie de instrucciones que corresponden al flujo de • Directivas de ensamblador
órdenes ejecutables por un microprocesador.
Por ejemplo, en el lenguaje ensamblador para un proce-
4.1.1 Nemónicos de opcode y mnemónicos extendi-
sador x86:
dos
La sentencia
A diferencia de las instrucciones (sentencias) de los
• MOV AL, 61h lenguajes de alto nivel, las instrucciones en el lengua-
je ensamblador son generalmente muy simples. General-
Asigna el valor hexadecimal 61 (97 decimal) al registro mente, una mnemónico es un nombre simbólico para una
“AL”. sola instrucción en lenguaje de máquina ejecutable (un
opcode), y hay por lo menos un mnemónico de opcode
El programa ensamblador lee la sentencia de arriba y pro-
definido para cada instrucción en lenguaje de máquina.
duce su equivalente binario en lenguaje de máquina
Cada instrucción consiste típicamente en una operación
u opcode más cero o más operandos. La mayoría de las
• Binario: 10110000 01100001 (hexadecimal: B61)
instrucciones refieren a un solo valor, o a un par de va-
lores. Los operandos pueden ser inmediatos (típicamente
El mnemónico MOV es un código de operación u valores de un byte, codificados en la propia instrucción),
"opcode". El opcode es seguido por una lista de argumen- registros especificados en la instrucción, implícitos o las
tos o parámetros, completando una típica instrucción de direcciones de los datos localizados en otra parte de la
ensamblador. En el ejemplo, AL es un registro de 8 bits memoria. Esto está determinado por la arquitectura sub-
del procesador, al cual se le asignará el valor hexadecimal yacente del procesador, el ensamblador simplemente re-
61 especificado. fleja cómo trabaja esta arquitectura. Los mnemónicos ex-
El código de máquina generado por el ensamblador con- tendidos son frecuentemente usados para especificar una
siste de 2 bytes. El primer byte contiene empaquetado la combinación de un opcode con un operando específico,
4.2 Macros 5

ej, el ensamblador del System/360 usa a B como un mne- Por ejemplo, las directivas pudieran ser usadas para re-
mónico extendido para el BC con una máscara de 15 y servar áreas de almacenamiento y opcionalmente su para
NOP al BC con una máscara de 0. asignar su contenido inicial. Los nombres de las directi-
Los mnemónicos extendidos son frecuentemente usados vas a menudo comienzan con un punto para distinguirlas
para soportar usos especializados de instrucciones, a me- de las instrucciones de máquina.
nudo para propósitos no obvios con respecto al nombre de Los ensambladores simbólicos le permiten a los progra-
la instrucción. Por ejemplo, muchos CPU no tienen una madores asociar nombres arbitrarios (etiquetas o símbo-
instrucción explícita de NOP (No Operación), pero tie- los) a posiciones de memoria. Usualmente, cada constan-
nen instrucciones que puedan ser usadas para tal propó- te y variable tiene un nombre para que las instrucciones
sito. En el CPU 8086, la instrucción XCHG AX,AX (in- pueden referir a esas ubicaciones por nombre, así promo-
tercambia el registro AX consigo mismo) es usada para el viendo el código autodocumentado. En el código ejecu-
NOP, con NOP siendo un pseudo-opcode para codificar table, el nombre de cada subprograma es asociado a su
la instrucción XCHG AX,AX. Algunos desensamblado- punto de entrada, así que cualquier llamada a un subpro-
res reconocen esto y decodificarán la instrucción XCHG grama puede usar su nombre. Dentro de subprogramas, a
AX,AX como NOP. Similarmente, los ensambladores de los destinos GOTO se le dan etiquetas. Algunos ensam-
IBM para el System/360 usan los mnemónicos extendi- bladores soportan símbolos locales que son léxicamente
dos NOP y NOPR con las máscaras cero para BC y BCR. distintos de los símbolos normales (ej, el uso de “10$"
Algunos ensambladores también soportan simples ma- como un destino GOTO).
croinstrucciones incorporadas que generan dos o más ins- La mayoría de los ensambladores proporcionan un mane-
trucciones de máquina. Por ejemplo, con algunos ensam- jo flexible de símbolos, permitiendo a los programadores
bladores para el Z80, la instrucción manejar diversos espacios de nombres, calcular automá-
ticamente offsets dentro de estructuras de datos, y asignar
LD HL, BC etiquetas que refieren a valores literales o al resultado de
cálculos simples realizados por el ensamblador. Las eti-
genera las instrucciones quetas también pueden ser usadas para inicializar cons-
tantes y variables con direcciones relocalizables.
LD L, C
LD H, B.[3] Los lenguajes ensambladores, como la mayoría de los
otros lenguajes de computador, permiten que comenta-
LD HL, BC es un pseudo-opcode, que en este caso simu- rios sean añadidos al código fuente, que son ignorados
la ser una instrucción de 16 bits, cuando se expande se por el programa ensamblador. El buen uso de los comen-
producen dos instrucciones de 8 bits que equivalen a la tarios es aún más importante con código ensamblador que
simulada de 16 bits. con lenguajes de alto nivel, pues el significado y el pro-
pósito de una secuencia de instrucciones es más duro de
descifrar a partir del código en sí mismo.
4.1.2 Secciones de datos
El uso sabio de estas facilidades puede simplificar gran-
Hay instrucciones usadas para definir elementos de datos demente los problemas de codificar y mantener el código
para manejar datos y variables. Definen el tipo de dato, la de bajo nivel. El código fuente de lenguaje ensamblador
longitud y la alineación de los datos. Estas instrucciones crudo generado por compiladores o desensambladores -
también pueden definir si los datos están disponibles para código sin ningún comentario, ni símbolos con algún sen-
programas exteriores (programas ensamblados separada- tido, ni definiciones de datos - es muy difícil de leer cuan-
mente) o solamente para el programa en el cual la sección do deben hacerse cambios.
de datos está definida. Algunos ensambladores clasifican
estas instrucción
4.2 Macros

4.1.3 Directivas del ensamblador Muchos ensambladores soportan macros predefinidas, y


otras soportan macros definidas (y repetidamente rede-
Los directivas del ensamblador, también llamadas los finibles) por el programador que implican secuencias de
pseudo opcodes, pseudo-operaciones o pseudo-ops, son líneas del texto en las cuales las variables y las constantes
instrucciones que son ejecutadas por un ensamblador en están empotradas. Esta secuencia de líneas de texto puede
el tiempo de ensamblado, no por un CPU en el tiempo incluir opcodes o directivas. Una vez una macro se defi-
de ejecución. Pueden hacer al ensamblado del programa ne, su nombre se puede usar en lugar de un mnemónico.
dependiente de parámetros entrados por un programador, Cuando el ensamblador procesa tal sentencia, reemplaza
de modo que un programa pueda ser ensamblado de dife- la sentencia por las líneas del texto asociadas a esa ma-
rentes maneras, quizás para diversos aplicaciones. Tam- cro, entonces las procesa como si hubieran existido en el
bién pueden ser usadas para manipular la presentación de archivo del código fuente original (incluyendo, en algu-
un programa para hacerlo más fácil leer y mantener. nos ensambladores, la expansión de cualquier macro que
6 4 DISEÑO DEL LENGUAJE

exista en el texto de reemplazo). COBOL usando un programa macro ensamblador puro


Puesto que las macros pueden tener nombres cortos pero conteniendo líneas de código COBOL dentro de opera-
se expanden a varias, o de hecho, muchas líneas de códi- dores de tiempo ensamblaje dando instrucciones al en-
go, pueden usarse para hacer que los programas en len- samblador para generar código arbitrario.
guaje ensamblador parezcan ser mucho más cortos, re- Esto era porque, como en los años 1970 fue observado, el
quiriendo menos líneas de código fuente, como sucede concepto de “procesamiento de macro” es independiente
con los lenguajes de alto nivel. También se pueden usar del concepto de “ensamblaje”, siendo el anterior, en tér-
para añadir niveles de estructura más altos a los progra- minos modernos, más un procesamiento de textos, que
mas ensamblador; opcionalmente introducen código de una generación de código objeto. El concepto de proce-
depuración empotrado vía parámetros y otras caracterís- samiento de macro apareció, y aparece, en el lenguaje de
ticas similares. programación C, que soporta “instrucciones de prepro-
Muchos ensambladores tienen macros incorporadas (o cesador” de fijar variables, y hace pruebas condicionales
predefinidas) para las llamadas de sistema y otras secuen- en sus valores. Observe que a diferencia de ciertos ma-
cias especiales de código, tales como la generación y el croprocesadores previos dentro de los ensambladores, el
almacenamiento de los datos realizados a través de avan- preprocesador de C no es Turing-completo porque care-
zadas operaciones bitwise y operaciones booleanas usadas cía de la capacidad de bucle o go to, esto último permi-
en juegos, software de seguridad, gestión de datos y crip- tiendo a los programas hacer bucles.
tografía. A pesar del poder del procesamiento macro, éste dejó de
Los macro ensambladores a menudo permiten a las ma- usarse en muchos lenguajes de alto nivel (una importante
cros tomar parámetros. Algunos ensambladores incluyen excepción es C/C++) mientras que seguía siendo perenne
lenguajes macro muy sofisticados, incorporando elemen- para los ensambladores. Esto era porque muchos progra-
madores estaban bastante confundidos por la sustitución
tos de lenguajes de alto nivel tales como parámetros op-
cionales, variables simbólicas, condiciones, manipulacio- de parámetros macro y no distinguían la diferencia entre
procesamiento macro, el ensamblaje y la ejecución.
nes de strings, operaciones aritméticas, todos usables du-
rante la ejecución de una macro dada, y permitiendo a las La sustitución de parámetros macro es estrictamente por
macros guardar el contexto o intercambiar información. nombre: en el tiempo de procesamiento macro, el valor de
Así una macro puede generar un gran número de instruc- un parámetro es sustituido textualmente por su nombre.
ciones o definiciones de datos en lenguaje ensamblador, La clase más famosa de Error de software resultantes era
basadas en los argumentos de la macro. Esto se podría el uso de un parámetro que en sí mismo era una expre-
usar para generar, por ejemplo, estructuras de datos de sión y no un nombre primario cuando el escritor macro
estilo de récord o bucles “desenrollados”, o podría gene- esperaba un nombre. En el macro:
rar algoritmos enteros basados en parámetros complejos.
Una organización, usando lenguaje ensamblador, que ha foo: macro a
sido fuertemente extendido usando tal suite de macros,
puede ser considerada que se está trabajando en un len- load a*b
guaje de alto nivel, puesto que tales programadores no
están trabajando con los elementos conceptuales de más la intención era que la rutina que llama proporcionaría el
bajo nivel del computador. nombre de una variable, y la variable o constante “global
b” sería usada para multiplicar a “a”. Si foo se llama con
Las macros se usaron para adaptar sistemas de softwa-
el parámetro a-c, ocurre la expansión macro load a-c*b.
re de gran escala para clientes específicos en la era del
Para evitar cualquier posible ambigüedad, los usuarios de
mainframe, y también se usaron por el personal del clien-
macro procesadores pueden encerrar en paréntesis los pa-
te para satisfacer las necesidades de sus patrones hacien-
rámetros formales dentro de las definiciones de macros, o
do versiones específicas de los sistemas operativos del
las rutinas que llaman pueden envolver en paréntesis los
fabricante. Esto fue hecho, por ejemplo, por los progra-
parámetos de entrada.[4] Así, el macro correcto, con los
madores de sistema que trabajaban con el Conversatio-
paréntesis, sería:
nal Monitor System / Virtual Machine (CMS/VM) de IBM
y con los complementos real time transaction processing
de IBM, CICS, Customer Information Control System, el foo: macro a
airline/financial system que comenzó en los años 1970 load (a)*b
y todavía corre con muchos sistemas de reservaciones
computarizados (CRS) y sistemas de tarjeta de crédito
y su expansión, daría como resultado: load (a-c)*b
de hoy.
El PL/I y el C/C++ ofrecen macros, pero la esta facilidad
También es posible usar solamente las habilidades de pro-
solo puede manipular texto. Por otra parte, los lenguajes
cesamiento de macros de un ensamblador para generar
homoicónicos, tales como Lisp, Prolog, y Forth, retienen
código escrito en lenguajes completamente diferentes.
el poder de los macros de lenguaje ensamblador porque
Por ejemplo, para generar una versión de un programa en
pueden manipular su propio código como datos.
5.1 Perspectiva histórica 7

4.3 Soporte para programación estructu- tadores, liberando a los programadores del tedio tal como
rada recordar códigos numéricos y cálculo de direcciones. Una
vez fueron ampliamente usados para todo tipo de pro-
Algunos ensambladores han incorporado elementos de gramación. Sin embargo, por los años 1980 (1990 en los
programación estructurada para codificar el flujo de la microcomputadores), su uso había sido en gran parte su-
ejecución. El ejemplo más temprano de este acercamien- plantado por los lenguajes de alto nivel,[cita requerida] en la
to estaba en el Concept-14 macro set, originalmente pro- búsqueda de una mejorada productividad en programa-
puesto por el Dr. H.D. Mills (marzo de 1970), e imple- ción. Hoy en día, aunque el lenguaje ensamblador es casi
mentado por Marvin Kessler en la Federal Systems Di- siempre manejado y generado por los compiladores, to-
vision de IBM, que extendió el macro ensamblador del davía se usa para la manipulación directa del hardware,
S/360 con bloques de control de flujo IF/ELSE/ENDIF y acceso a instrucciones especializadas del procesador, o
similares.[5] Esto era una manera de reducir o eliminar el para resolver problemas de desempeño crítico. Los usos
uso de operaciones GOTO en el código en lenguaje en- típicos son controladores/manejadores (drivers) de dispo-
samblador, uno de los principales factores que causaban sitivo, sistemas embebidos de bajo nivel, y sistemas de
código espagueti en el lenguaje ensamblador. Este acer- tiempo real.
camiento fue ampliamente aceptado a principios de los Históricamente, un gran número de programas han sido
años 1980 (los últimos días del uso de lenguaje ensam- escritos enteramente en lenguaje ensamblador. Los sis-
blador en gran escala). temas operativos fueron casi exclusivamente escritos en
Un curioso diseño fue A-natural, un ensamblador “orien- lenguaje ensamblador hasta la aceptación amplia del len-
tado a la corriente” (stream-oriented) para los procesado- guaje de programación C en los años 1970 y principios
res 8080/Z80[cita requerida] de Whitesmiths Ltd. (desarro- de los 1980. También, muchas aplicaciones comerciales
lladores del sistema operativo Idris, similar al Unix), y lo fueron escritas en lenguaje ensamblador, incluyendo una
que fue reportado como el primer compilador C comer- gran cantidad del software escrito por grandes corpora-
cial). El lenguaje fue clasificado como un ensamblador, ciones para mainframes de IBM. Los lenguajes COBOL
porque trabajaba con elementos de máquina crudos tales y FORTRAN eventualmente desplazaron mucho de es-
como opcodes, registros, y referencias de memoria; pe- te trabajo, aunque un número de organizaciones grandes
ro incorporaba una sintaxis de expresión para indicar el conservaran las infraestructuras de aplicaciones en len-
orden de ejecución. Los paréntesis y otros símbolos es- guaje ensamblador hasta bien entrados los años 1990.
peciales, junto con construcciones de programación es- La mayoría de los primeros microcomputadores confia-
tructurada orientadas a bloques, controlaban la secuencia ron en el lenguaje ensamblador codificado a mano, inclu-
de las instrucciones generadas. A-natural fue construido yendo la mayoría de los sistemas operativos y de las apli-
como el lenguaje objeto de un compilador C, en vez de la caciones grandes. Esto era porque estos sistemas tenían
codificación manual, pero su sintaxis lógica ganó algunos limitaciones severas de recursos, impusieron idiosincráti-
seguidores. cas arquitecturas de memoria y de pantalla, y proporcio-
Ha habido poca demanda aparente para ensambladores naron servicios de sistema limitados y con errores. Quizás
más sofisticados debido a la declinación del desarrollo de más importante era la falta de compiladores de primera
lenguaje ensamblador de larga escala.[6] A pesar de eso, clase de lenguajes de alto nivel adecuados para el uso en
todavía se están desarrollando y aplicando en casos donde el microcomputador. Un factor psicológico también pudo
las limitaciones de recursos o las particularidades en la haber jugado un papel: la primera generación de progra-
arquitectura de sistema objetivo previenen el efectivo uso madores de los microcomputadores conservó una actitud
de lenguajes de alto nivel.[7] de aficionado de “alambres y alicates”.
En un contexto más comercial, las más grandes razones
para usar el lenguaje ensamblador era hacer programas
con mínimo tamaño, mínima sobrecarga, mayor veloci-
5 Uso del lenguaje ensamblador dad y confiabilidad.
Los típicos ejemplos de programas grandes en lenguaje
5.1 Perspectiva histórica ensamblador de ese tiempo son los sistemas operativos
IBM PC DOS y aplicaciones tempranas tales como la
Los lenguajes ensambladores fueron primero desarro- hoja de cálculo Lotus 1-2-3, y casi todos los juegos popu-
llados en los años 1950, cuando fueron referidos como lares para la familia Atari 800 de computadores persona-
lenguajes de programación de segunda generación. Por les. Incluso en los años 1990, la mayoría de los videojue-
ejemplo, el SOAP (Symbolic Optimal Assembly Pro- gos de consola fueron escritos en ensamblador, incluyen-
gram) era un lenguaje ensamblador de 1957 para el do la mayoría de los juegos para la Mega Drive/Genesis y
computador IBM 650. Los lenguajes ensambladores eli- el Super Nintendo Entertainment System.[cita requerida] Se-
minaron mucha de la propensión a errores y del consumo gún algunos insiders de la industria, el lenguaje ensam-
de tiempo de la programación de los lenguajes de prime- blador era el mejor lenguaje de programación a usar para
ra generación, que se necesitaba con los primeros compu-
8 5 USO DEL LENGUAJE ENSAMBLADOR

obtener el mejor desempeño del Sega Saturn, una con- bibliotecas asociadas con un lenguaje de alto nivel;
sola para la cual era notoriamente desafiante desarrollar ésta es quizás la situación más común. Son progra-
y programar juegos.[8] El popular juego de arcade NBA mas empotrados que solo almacenan una pequeña
Jam (1993) es otro ejemplo. El ensamblador ha sido por cantidad de memoria y el dispositivo está dirigido
largo trecho, el lenguaje de desarrollo primario en los para hacer tareas para un simple propósito. Ejem-
computadores hogareños Commodore 64, Atari ST, así plos consisten en teléfonos, sistemas de combustible
como el ZX Spectrum. Esto fue así en gran parte porque e ignición para automóviles, sistemas de control del
los dialectos del BASIC en estos sistemas ofrecieron in- aire acondicionado, sistemas de seguridad, y senso-
suficiente velocidad de ejecución, así como insuficientes res
características para aprovechar completamente el hard-
ware disponible. Algunos sistemas, más notablemente el • Interactuando directamente con el hardware, por
Amiga, incluso tienen IDEs con características de depu- ejemplo en controladores (drivers) de dispositivo y
ración y macros altamente avanzados, tales como el free- manejadores de interrupción
ware ASM-One assembler, comparable a las del Microsoft • Usando instrucciones específicas del procesador no
Visual Studio (el ASM-Uno precede al Microsoft Visual explotadas o disponibles por el compilador. Un
Studio). ejemplo común es la instrucción de rotación bitwise
El ensamblador para el VIC-20 fue escrito por Don en el núcleo de muchos algoritmos de cifrado
French y publicado por French Silk. Con 1639 bytes
• Creando funciones vectorizadas para programas en
de longitud, su autor cree que es el más pequeño en-
lenguajes de alto nivel como C. En el lenguaje de
samblador simbólico jamás escrito. El ensamblador so-
alto nivel esto es a veces ayudado por funciones in-
portaba el direccionamiento simbólico usual y la de-
trínsecas del compilador que mapean directamente
finición de cadenas de caracteres o cadenas hexade-
a los mnemónicos del SIMD, pero sin embargo re-
cimales. También permitía expresiones de direcciones
sulta en una conversión de ensamblador de uno a uno
que podían combinarse con las operaciones de adición,
para un procesador de vector asociado
sustracción, multiplicación, división, AND lógico, OR ló-
gico, y exponenciación.[9] • Es requerida la optimización extrema, ej, en un
bucle interno en un algoritmo intensivo en el uso
del procesador. Los programadores de juegos to-
5.2 Uso actual man ventaja de las habilidades de las característi-
cas del hardware en los sistemas, permitiendo a los
Siempre ha habido debates sobre la utilidad y el desem-
juegos correr más rápidamente. También las gran-
peño del lenguaje ensamblador relativo a lenguajes de
des simulaciones científicas requieren algoritmos al-
alto nivel. El lenguaje ensamblador tiene nichos espe-
tamente optimizados, ej, álgebra lineal con BLAS
cíficos donde es importante (ver abajo). Pero, en gene-
o la transformada de coseno discreta (ej, la versión
ral, los modernos compiladores de optimización para tra-
SIMD en ensamblador del x264,[15] (una biblioteca
ducir lenguajes de alto nivel en código que puede co-
para codificar streams de video)
rrer tan rápidamente como el lenguaje ensamblador es-
crito a mano, a pesar de los contraejemplos que pue- • Un sistema con severas limitaciones de recursos (ej,
den ser encontrados.[10][11][12] La complejidad de los pro- un sistema empotrado) debe ser codificado a mano
cesadores modernos y del subsistema de memoria ha- para maximizar el uso de los limitados recursos; pe-
ce la optimización efectiva cada vez más difícil para ro esto está llegando a ser menos común a medida
los compiladores, así como para los programadores en que el precio del procesador decrece y el desempeño
ensamblador.[13][14] Adicionalmente, y para la consterna- mejora
ción de los amantes de la eficiencia, el desempeño cada
vez mayor del procesador ha significado que la mayoría • No existe ningún lenguaje de alto nivel, en un pro-
de los CPU estén desocupados la mayor parte del tiempo, cesador nuevo o especializado, por ejemplo
con retardos causados por embotellamientos predecibles • Escribiendo programas de tiempo real que necesi-
tales como operaciones de entrada/salida y paginación de tan sincronización y respuestas precisas, tales como
memoria. Esto ha hecho que la velocidad de ejecución sistemas de navegación de vuelo, y equipo médico.
cruda del código no sea un problema para muchos pro- Por ejemplo, en un sistema fly-by-wire (vuelo por
gramadores. mandos eléctricos), la telemetría debe ser interpre-
Hay algunas situaciones en las cuales los profesionales pu- tada y hay que actuar dentro de limitaciones estric-
dieran elegir utilizar el lenguaje ensamblador. Por ejem- tas de tiempo. Tales sistemas deben eliminar fuentes
plo cuando: de retrasos impredecibles, que pueden ser creados
por (algunos) lenguajes interpretados, recolección
• Es requerido un ejecutable binario independiente de basura automática, operaciones de paginación, o
(stand-alone), es decir uno que deba ejecutarse sin multitarea preventiva. Sin embargo, algunos lengua-
recursos a componentes de tiempo de ejecución o a jes de alto nivel incorporan componentes de tiempo
5.3 Aplicaciones típicas 9

de ejecución e interfaces de sistema operativo que estudiar un solo lenguaje ensamblador es suficiente pa-
pueden introducir tales retrasos. Elegir el ensambla- ra aprender: i) los conceptos básicos; ii) reconocer situa-
dor o lenguajes de bajo nivel para tales sistemas da a ciones donde el uso de lenguaje ensamblador puede ser
los programadores mayor visibilidad y control sobre apropiado; y iii) ver cómo el código ejecutable eficiente
el proceso de los detalles puede ser creado por los lenguajes de alto nivel[17]
• Es requerido control total sobre el ambiente, en si-
tuaciones de seguridad extremadamente alta donde
nada puede darse por sentado. 5.3 Aplicaciones típicas
• Se escriben virus de computadora, bootloaders, El lenguaje ensamblador hard-coded es típicamente usa-
ciertos controladores/manejadores de dispositivo, u do en el ROM de arranque del sistema (BIOS en los sis-
otros elementos muy cerca del hardware o al sistema temas compatible IBM PC). Este código de bajo nivel es
operativo de bajo nivel usado, entre otras cosas, para inicializar y probar el hard-
ware del sistema antes de cargar el sistema operativo, y
• Se escriben simuladores del conjunto de instruccio-
está almacenado en el ROM. Una vez que ha tomado lu-
nes para monitoreo, trazado y depuración de errores
gar un cierto nivel de inicialización del hardware, la eje-
donde la sobrecarga adicional es mantenida al míni-
cución se transfiere a otro código, típicamente escrito en
mo
lenguajes de alto nivel; pero el código corriendo inmedia-
• Se hace ingeniería inversa en binarios existentes que tamente después de que es aplicada la energía usualmente
pueden o no haber sido escritos originalmente en está escrito en lenguaje ensamblador. Lo mismo es cierto
un lenguaje de alto nivel, por ejemplo al crackear para los boot loaders.
la protección anticopia del software propietario. Muchos compiladores traducen lenguajes de alto nivel a
• Se hace ingeniería inversa y modificación de video lenguaje ensamblador primero, antes de la compilación
juegos (también denominado ROM hacking), que completa, permitiendo que el código en ensamblador sea
es posible por medio de varios métodos. El más am- visto para propósitos de depuración y optimización. Len-
pliamente implementado es alterando el código del guajes de relativo bajo nivel, como C, con frecuencia pro-
programa a nivel de lenguaje ensamblador veen sintaxis especial para empotrar lenguaje ensambla-
dor en cada plataforma de hardware. El código portable
• Se escribe código automodificable, algo para lo que del sistema entonces puede usar estos componentes espe-
el lenguaje ensamblador se presta bien cíficos a un procesador a través de una interface uniforme.
• Se escriben juegos y otros softwares para El lenguaje ensamblador también es valioso en ingeniería
calculadoras gráficas[16] inversa, puesto que muchos programas solamente son dis-
tribuidos en una forma de código de máquina. El código
• Se escribe software compilador que genera código de máquina es usualmente fácil de trasladar hacia lengua-
ensamblador, y por lo tanto los desarrolladores de- je ensamblador para luego ser cuidadosamente examina-
ben ser programadores de lenguaje ensamblador do en esta forma, pero es muy difícil de trasladar hacia
• Se escriben algoritmos criptográficos que siempre un lenguaje de alto nivel. Herramientas como Interactive
deben tomar estrictamente el mismo tiempo para Disassembler, hacen uso extenso del desensamblador pa-
ejecutar, previniendo ataques de tiempo ra tales propósitos.
Un nicho que hace uso del lenguaje ensamblador es el
Sin embargo, el lenguaje ensamblador es todavía en- demoscene. Ciertas competiciones requieren a los con-
señado en la mayoría de los programas de ciencias de cursantes restringir sus creaciones a un muy pequeño ta-
la computación e ingeniería electrónica. Aunque hoy en maño (ej, 256 bytes, 1 KB, 4 KB ó 64 KB), y el lenguaje
día, pocos programadores trabajan regularmente con el ensamblador es el lenguaje de preferencia para alcanzar
lenguaje ensamblador como una herramienta, los con- este objetivo.[18] Cuando los recursos son una preocupa-
ceptos fundamentales continúan siendo muy importan- ción, es una necesidad la codificación en ensamblador,
tes. Tales tópicos fundamentales, como aritmética bina- especialmente en sistemas constreñidos por el procesa-
ria, asignación de memoria, procesamiento del stack, co- miento del CPU, como los primeros modelos del Amiga,
dificación de conjunto de caracteres, procesamiento de y el Commodore 64. El código optimizado en ensambla-
interrupciones, y diseño de compiladores, serían duros de dor es escrito “a mano” por los programadores en un in-
estudiar en detalle sin la comprensión de cómo el compu- tento de minimizar el número de ciclos de CPU usados.
tador opera a nivel del hardware. Puesto que el compor- Las limitaciones del CPU son tan grandes que cada ciclo
tamiento del computador es fundamentalmente definido cuenta. Usar tales métodos ha habilitado, a sistemas co-
por su conjunto de instrucciones, la manera lógica de mo el Commodore 64, para producir gráficos en 3D en
aprender tales conceptos es estudiar un lenguaje ensam- tiempo real con efectos avanzados, una hazaña que puede
blador. La mayoría de los computadores modernos tie- ser considerada improbable o incluso imposible para un
nen un conjunto de instrucciones similares. Por lo tanto, sistema con un procesador de 0.99 MHz.[cita requerida]
10 7 EJEMPLOS DE LENGUAJE ENSAMBLADOR

6 Detalles adicionales blador usado para codificar palabras.


La mayoría de la gente usa un emulador para depurar sus
Para un determinado computador personal, mainframe, programas en lenguaje ensamblador.
sistema empotrado, y consola de juegos, tanto del pasado
como del presente, ha sido escrito al menos uno, y posi-
blemente docenas de ensambladores. Para algunos ejem- 7 Ejemplos de lenguaje ensambla-
plos, vea la lista de ensambladores.
dor
En los sistemas Unix, el ensamblador es llamado tradicio-
nalmente as, aunque no es un simple cuerpo de código,
siendo típicamente escrito uno nuevo por cada port. Un 7.1 Ejemplo para la arquitectura x86
número de variantes de Unix usan el GAS
El siguiente es un ejemplo del programa clásico Hola
Dentro de los grupos de procesadores, cada ensamblador mundo escrito para la arquitectura de procesador x86 (ba-
tiene su propio dialecto. A veces, algunos ensambladores jo el sistema operativo DOS).
pueden leer el dialecto de otro, por ejemplo, TASM puede
leer el viejo código del MASM, pero no al revés. FASM y ; --------------------------------------------- ; Programa
NASM tienen una sintaxis similar, pero cada uno soporta que imprime un string en la pantalla ; ---------------
diferentes macros que pueden ser difícil de trasladar de ------------------------------ .model small ; modelo de
uno al otro. Las cosas básicas son siempre las mismas, memoria .stack ; segmento del stack .data ; segmento de
pero las características avanzadas serán diferentes[19] datos Cadena1 DB 'Hola Mundo.$' ; string a imprimir
(finalizado en $) .code ; segmento del código ; -------
También, los lenguajes ensambladores a veces pueden -------------------------------------- ; Inicio del programa
ser portables a través de diferentes sistemas operativos ; --------------------------------------------- programa: ;
en el mismo tipo de CPU. Las convenciones de llama- ----------------------------------------------------------------
das entre los sistemas operativos con frecuencia difieren ------------------------------------ ; inicia el segmento de
ligeramente o en nada. y con cuidado es posible ganar datos ; ---------------------------------------------------------
portabilidad en el lenguaje ensamblador, usualmente al ------------------------------------------- MOV AX, @data
enlazar con una biblioteca de lenguaje C que no cambia ; carga en AX la dirección del segmento de datos MOV
entre sistemas operativos. Un simulador de conjunto de DS, AX ; mueve la dirección al registro de segmento por
instrucciones (que idealmente sería escrito en lenguaje medio de AX ; -----------------------------------------------
ensamblador) puede, en teoría, procesar el código obje- ----------------------------------------------------- ; Imprime
to/binario de cualquier ensamblador) para lograr la por- un string en pantalla ; ------------------------------------
tabilidad incluso a través de plataformas (con una sobre- ----------------------------------------------------------------
cargue no mayor que la de un interpretador de bytecode MOV DX, offset Cadena1 ; mueve a DX la dirección
típico). Esto es esencialmente lo que logra el microcódigo del string a imprimir MOV AH, 9 ; AH = código para
cuando una plataforma de hardware cambia internamen- indicar al MS DOS que imprima en la pantalla, el
te. string en DS:DX INT 21h ; llamada al MS DOS para
Por ejemplo, muchas cosas en libc dependen del ejecutar la función (en este caso especificada en AH) ;
preprocesador para hacer, al programa antes de compilar, ----------------------------------------------------------------
cosas que son específicas del sistema operativo o especí- ------------------------------------ ; Finaliza el programa ;
ficas del C. De hecho, algunas funciones y símbolos ni -----------------------------------------------------------------
siquiera están garantizados que existan fuera del prepro- ----------------------------------- INT 20h ; llamada al MS
cesador. Peor aún, el tamaño y el orden de los campos de DOS para finalizar el programa end programa
las estructuras, tanto como el tamaño de ciertas typedefs
como off_t, no están disponibles en lenguaje ensambla-
dor sin la ayuda de un script de configuración, y difie-
ren incluso entre versiones de Linux, haciendo imposible 7.2 Ejemplo para el computador virtual
portar llamadas de funciones en libc diferentes de los que (POCA)
toman simples enteros o punteros como parámetros. Pa-
ra manejar estos problemas, el proyecto FASMLIB pro- Una selección de instrucciones para una computadora
[21]
vee una biblioteca de lenguaje ensamblador portable pa- virtual ) con las correspondientes direcciones de me-
ra las plataformas Win32 y Linux, pero todavía está muy moria en las que se ubicarán las instrucciones. Estas di-
incompleta.[20] recciones NO son estáticas. Cada instrucción se acompa-
ña del código en lenguaje ensamblador generado (código
Algunos lenguajes de muy alto nivel, como C y Bor- objeto) que coincide con la arquitectura de computador
land/Pascal, soportan ensamblado en línea, donde relati- virtual, o conjunto de instrucciones ISA.
vamente secciones cortas de código en ensamblador pue-
de ser empotradas dentro del código del lenguaje de alto
nivel. El lenguaje Forth comúnmente contiene un ensam-
11

8 Origen del texto y las imágenes, colaboradores y licencias


8.1 Texto
• Lenguaje ensamblador Fuente: https://es.wikipedia.org/wiki/Lenguaje_ensamblador?oldid=95465017 Colaboradores: Sabbut, Moriel,
JorgeGG, Pilaf, ManuelGR, Robbot, Sanbec, Triku, Jynus, Sms, Robotito, Bgbot, Porao, Darz Mol, Vizcarra~eswiki, Z80user, Matias-
Bellone, Richy, Digigalos, Boticario, AlfonsoERomero, Airunp, Emijrp, RobotQuistnix, Platonides, Chobot, Yrbot, Vitamine, GermanX,
Beto29, Gothmog, Jesuja, Santiperez, Banfield, Maldoror, Tomatejc, BOTpolicia, Qwertyytrewqqwerty, CEM-bot, Jorgelrm, Laura Fio-
rucci, X.Cyclop, ^CiViLoN^, Psicodelico6, Antur, FrancoGG, Thijs!bot, Roberto Fiadone, JoaquinFerrero, Locovich, Isha, JAnDbot, Ju-
gones55, Kved, Segedano, Rafa3040, Muro de Aguas, TXiKiBoT, Oespinosa, Netito777, Marvelshine, DonBarredora, VolkovBot, Techno-
pat, Galandil, Matdrodes, Elabra sanchez, House, Erickmr, Barri, Muro Bot, BotMultichill, SieBot, Loveless, Drinibot, BOTarate, Manwë,
Correogsk, El bot de la dieta, BuenaGente, Mrisco, DorganBot, Tirithel, Piero71, Lentucky, Botellín, CestBOT, Valentin estevanez nava-
rro, Kroji, AVBOT, LucienBOT, Tanhabot, NjardarBot, Gades21, Diegusjaimes, Hann~eswiki, Innv, Saloca, Andreasmperu, Luckas-bot,
Lu Tup, Kbradero, SuperBraulio13, Xqbot, Jkbw, Ricardogpn, Albertochoa, Surfaz, Botarel, AstaBOTh15, TiriBOT, Scapegoat001, Jc-
fidy, Halfdrag, Kizar, Codename, Jerowiki, PatruBOT, Dinamik-bot, GrouchoBot, G Garro, EmausBot, Sergio Andres Segovia, Grillitus,
WikitanvirBot, R010178, ILoveSugar, ChayitaBOT, Mane2517, Elvisor, DanielithoMoya, AlbertoCamilo, Addbot, Carlos7755, Splatad,
MarioFinale, Jarould, BenjaBot, HannaTheKitty12, Fernando2812l, Ks-M9, Labashi-Marduk, FrancoCaviglia, Shaky shaky, FSDmar y
Anónimos: 179

8.2 Imágenes
• Archivo:Codigo_de_maquina.png Fuente: https://upload.wikimedia.org/wikipedia/commons/f/f3/Codigo_de_maquina.png Licencia:
Public domain Colaboradores: Trabajo propio Artista original: German
• Archivo:Wikibooks-logo.svg Fuente: https://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.

8.3 Licencia del contenido


• Creative Commons Attribution-Share Alike 3.0

Anda mungkin juga menyukai