You are on page 1of 14

Lenguaje ensamblador

Lenguaje de mquina del Intel 8088. El cdigo de mquina en


hexadecimal se resalta en rojo, el equivalente en lenguaje en-
samblador en magenta, y las direcciones de memoria donde se
encuentra el cdigo, en azul. Abajo se ve un texto en hexadecimal
y ASCII.
El lenguaje ensamblador, o assembler (assembly lan-
guage en ingls), es un lenguaje de programacin de
bajo nivel para los computadores, microprocesadores,
microcontroladores y otros circuitos integrados progra-
mables. Implementa una representacin simblica de los
cdigos de mquina binarios y otras constantes necesa-
rias para programar una arquitectura dada de CPU y
constituye la representacin ms directa del cdigo m-
quina especco para cada arquitectura legible por un
programador. Esta representacin es usualmente deni-
da por el fabricante de hardware, y est basada en los
mnemnicos que simbolizan los pasos de procesamien-
to (las instrucciones), los registros del procesador, las po-
siciones de memoria y otras caractersticas del lenguaje.
Un lenguaje ensamblador es por lo tanto especco de
cierta arquitectura de computador fsica (o virtual). Esto
est en contraste con la mayora de los lenguajes de pro-
gramacin de alto nivel, que idealmente son porttiles.
Un programa utilitario llamado ensamblador es usado pa-
ra traducir sentencias del lenguaje ensamblador al cdi-
go de mquina del computador objetivo. El ensamblador
realiza una traduccin ms o menos isomorfa (un mapeo
de uno a uno) desde las sentencias mnemnicas a las ins-
trucciones y datos de mquina. Esto est en contraste con
los lenguajes de alto nivel, en los cuales una sola decla-
racin generalmente da lugar a muchas instrucciones de
mquina.
Muchos sosticados ensambladores ofrecen mecanismos
adicionales para facilitar el desarrollo del programa, con-
trolar el proceso de ensamblaje, y la ayuda de depuracin.
Particularmente, la mayora de los ensambladores moder-
nos incluyen una facilidad de macro (descrita ms abajo),
y son llamados macro ensambladores.
Fue usado principalmente en los inicios del desarrollo de
software, cuando an no se contaba con potentes lengua-
jes de alto nivel y los recursos eran limitados. Actual-
mente se utiliza con frecuencia en ambientes acadmi-
cos y de investigacin, especialmente cuando se requiere
la manipulacin directa de hardware, alto rendimiento,
o un uso de recursos controlado y reducido. Tambin es
utilizado en el desarrollo de controladores de dispositivo
(en ingls, device drivers) y en el desarrollo de sistemas
operativos, debido a la necesidad del acceso directo a las
instrucciones de la mquina. Muchos dispositivos progra-
mables (como los microcontroladores) an cuentan con el
ensamblador como la nica manera de ser manipulados.
1 Caractersticas
El cdigo escrito en lenguaje ensamblador posee
una cierta dicultad de ser entendido ya que su es-
tructura se acerca al lenguaje mquina, es decir, es
un lenguaje de bajo nivel.
El lenguaje ensamblador es difcilmente portable,
es decir, un cdigo escrito para un microprocesa-
dor, puede necesitar ser modicado, para poder ser
usado en otra mquina distinta. Al cambiar a una
mquina con arquitectura diferente, generalmente
es necesario reescribirlo completamente.
Los programas hechos por un programador experto
en lenguaje ensamblador son generalmente mucho
ms rpidos y consumen menos recursos del siste-
ma (memoria RAM y ROM) que el programa equi-
valente compilado desde un lenguaje de alto nivel.
Al programar cuidadosamente en lenguaje ensam-
blador se pueden crear programas que se ejecutan
ms rpidamente y ocupan menos espacio que con
lenguajes de alto nivel.
Con el lenguaje ensamblador se tiene un con-
trol muy preciso de las tareas realizadas por un
microprocesador por lo que se pueden crear seg-
mentos de cdigo difciles y/o muy inecientes de
programar en un lenguaje de alto nivel, ya que, entre
otras cosas, en el lenguaje ensamblador se dispone
de instrucciones del CPUque generalmente no estn
disponibles en los lenguajes de alto nivel.
Tambin se puede controlar el tiempo en que tarda
una rutina en ejecutarse, e impedir que se interrum-
pa durante su ejecucin.
1
2 3 LENGUAJE
2 Programa ensamblador
Tpicamente, un programa ensamblador (assembler en in-
gls) moderno crea cdigo objeto traduciendo instruccio-
nes mnemnicas de lenguaje ensamblador en opcodes, y
resolviendo los nombres simblicos para las localizacio-
nes de memoria y otras entidades.
[1]
El uso de referencias
simblicas es una caracterstica clave del lenguaje ensam-
blador, evitando tediosos clculos y actualizaciones ma-
nuales de las direcciones despus de cada modicacin
del programa. La mayora de los ensambladores tambin
incluyen facilidades de macros para realizar sustitucin
textual - ej. generar cortas secuencias de instrucciones co-
mo expansin en lnea en vez de llamar a subrutinas.
Los ensambladores son generalmente ms simples de es-
cribir que los compiladores para los lenguajes de alto ni-
vel, y han estado disponibles desde los aos 1950. Los en-
sambladores modernos, especialmente para las arquitec-
turas basadas en RISC, tales como MIPS, Sun SPARC, y
HP PA-RISC, as como tambin para el x86 (64), op-
timizan la planicacin de instrucciones para explotar la
segmentacin del CPU ecientemente.
En los compiladores para lenguajes de alto nivel, son el
ltimo paso antes de generar el cdigo ejecutable.
2.1 Nmero de pasos
Hay dos tipos de ensambladores basados en cuntos pa-
sos a travs de la fuente son necesarios para producir el
programa ejecutable.
Los ensambladores de un solo paso pasan a travs
del cdigo fuente una vez y asumen que todos los
smbolos sern denidos antes de cualquier instruc-
cin que los reera.
Los ensambladores de dos pasos crean una tabla con
todos los smbolos y sus valores en el primer paso,
despus usan la tabla en un segundo paso para gene-
rar cdigo. El ensamblador debe por lo menos po-
der determinar la longitud de cada instruccin en el
primer paso para que puedan ser calculadas las di-
recciones de los smbolos.
La ventaja de un ensamblador de un solo paso es la ve-
locidad, que no es tan importante como lo fue en un mo-
mento dados los avances en velocidad y capacidades del
computador. La ventaja del ensamblador de dos pasos es
que los smbolos pueden ser denidos dondequiera en el
cdigo fuente del programa. Esto permite a los programas
ser denidos de maneras ms lgicas y ms signicativas,
haciendo los programas de ensamblador de dos paso ms
fciles leer y mantener.
[2]
2.2 Ensambladores de alto nivel
Los ms sosticados ensambladores de alto nivel propor-
cionan abstracciones del lenguaje tales como:
Estructuras de control avanzadas
Declaraciones e invocaciones de procedimien-
tos/funciones de alto nivel
Tipos de datos abstractos de alto nivel, incluyendo
las estructuras/records, uniones, clases, y conjuntos
Procesamiento de macros sosticado (aunque est
disponible en los ensambladores ordinarios desde -
nales 1960 para el IBM/360, entre otras mquinas)
Caractersticas de programacin orientada a objetos
2.3 Uso del trmino
Note que, en el uso profesional normal, el trmino en-
samblador es frecuentemente usado tanto para referir-
se al lenguaje ensamblador como tambin al programa
ensamblador (que convierte el cdigo fuente escrito en
el lenguaje ensamblador a cdigo objeto que luego se-
r enlazado para producir lenguaje de mquina). Las dos
expresiones siguientes utilizan el trmino ensamblador":
El CP/CMS fue escrito en ensamblador del IBM
S/360"
El ASM-H fue un ensamblador del S/370 amplia-
mente usado
La primera se reere al lenguaje y la segundo se reere al
programa.
3 Lenguaje
El lenguaje ensamblador reeja directamente la arqui-
tectura y las instrucciones en lenguaje de mquina de la
CPU, y pueden ser muy diferentes de una arquitectura de
CPU a otra. Cada arquitectura de microprocesador tiene
su propio lenguaje de mquina, y en consecuencia su pro-
pio lenguaje ensamblador ya que este se encuentra muy
ligado a la estructura del hardware para el cual se progra-
ma. Los microprocesadores dieren en el tipo y nmero
de operaciones que soportan; tambin pueden tener dife-
rente cantidad de registros, y distinta representacin de
los tipos de datos en memoria. Aunque la mayora de los
microprocesadores son capaces de cumplir esencialmen-
te las mismas funciones, la forma en que lo hacen diere
y los respectivos lenguajes ensamblador reejan tal dife-
rencia.
3.2 Ensamblado 3
3.1 Instrucciones de CPU
La mayora de las CPU tienen ms o menos los mismos
grupos de instrucciones, aunque no necesariamente tie-
nen todas las instrucciones de cada grupo. Las operacio-
nes que se pueden realizar varan de una CPU a otra. Una
CPU particular puede tener instrucciones que no tenga
otro y viceversa. Los primeros microprocesadores de 8
bits no tenan operaciones para multiplicar o dividir n-
meros, por ejemplo, y haba que hacer subrutinas para
realizar esas operaciones. Otras CPU puede que no ten-
gan operaciones de punto otante y habra que hacer o
conseguir bibliotecas que realicen esas operaciones.
Las instrucciones de la CPU pueden agruparse, de acuer-
do a su funcionalidad, en:
Operaciones con enteros: (de 8, 16, 32 y 64 bits depen-
diendo de la arquitectura de la CPU, en los sistemas muy
viejos tambin de 12, 18, 24, 36 y 48 bits)
Estas son operaciones realizadas por la Unidad aritmtico
lgica de la CPU
Operaciones aritmticas. Como suma, resta, multi-
plicacin, divisin, mdulo, cambio de signo
Operaciones booleanas. Operaciones lgicas bit a bit
como AND, OR, XOR, NOT
Operaciones de bits. Como desplazamiento y
rotaciones de bits (hacia la derecha o hacia la iz-
quierda, a travs del bit del acarreo o sin l)
Comparaciones
Operaciones de mover datos:
Entre los registros y la memoria:
Aunque la instruccin se llama mover, en la
CPU, mover datos signica en realidad co-
piar datos, desde un origen a un destino, sin que
el dato desaparezca del origen.
Se pueden mover valores:
desde un registro a otro
desde un registro a un lugar de la memo-
ria
desde un lugar de la memoria a un regis-
tro
desde un lugar a otro de la memoria
un valor inmediato a un registro
un valor inmediato a un lugar de memoria
Operaciones de pila (stack, en ingls):
PUSH (escribe datos hacia el tope de de
la pila)
POP (lee datos desde el tope de la pila)
Operaciones de entrada/salida:
Son operaciones que mueven datos de un regis-
tro, desde y hacia un puerto; o de la memoria,
desde y hacia un puerto
INPUT Lectura desde un puerto de en-
trada
OUTPUT Escritura hacia un puerto de
salida
Operaciones para el control del ujo del programa:
Llamadas y retornos de subrutinas
Llamadas y retornos de interrupciones
Saltos condicionales de acuerdo al resultado de la
comparaciones
Saltos incondicionales
Operaciones con nmeros reales:
El estndar para las operaciones con nmeros reales en
las CPU est denido por el IEEE 754.
Una CPU puede tener operaciones de punto otante con
nmeros reales mediante el coprocesador numrico (si lo
hay), como las siguientes:
Operaciones aritmticas. Suma, resta, multiplica-
cin, divisin, cambio de signo, valor absoluto, parte
entera
Operaciones trascendentales
Operaciones trigonomtricas. Seno, coseno,
tangente, arcotangente
Operaciones con logaritmos, potencias y races
Otras
El lenguaje ensamblador tiene mnemnicos para cada
una de las instrucciones de la CPU en adicin a otros
mnemnicos a ser procesados por el programa ensam-
blador (como por ejemplo macros y otras sentencias en
tiempo de ensamblado).
3.2 Ensamblado
La transformacin del lenguaje ensamblador en cdigo
mquina la realiza un programa ensamblador, y la traduc-
cin inversa la puede efectuar un desensamblador. Adife-
rencia de los lenguajes de alto nivel, aqu hay usualmente
una correspondencia 1 a 1 entre las instrucciones simples
del ensamblador y el lenguaje de mquina. Sin embargo,
4 4 DISEO DEL LENGUAJE
en algunos casos, un ensamblador puede proveer pseudo
instrucciones que se expanden en un cdigo de mquina
ms extenso a n de proveer la funcionalidad necesaria y
simplicar la programacin. Por ejemplo, para un cdi-
go mquina condicional como si X mayor o igual que,
un ensamblador puede utilizar una pseudoinstruccin al
grupo haga si menor que, y si = 0 sobre el resultado
de la condicin anterior. Los Ensambladores ms com-
pletos tambin proveen un rico lenguaje de macros que
se utiliza para generar cdigo ms complejo y secuencias
de datos.
Para el mismo procesador y el mismo conjunto de ins-
trucciones de CPU, diferentes programas ensambladores
pueden tener, cada uno de ellos, variaciones y diferencias
en el conjunto de mnemnicos o en la sintaxis de su len-
guaje ensamblador. Por ejemplo, en un lenguaje ensam-
blador para la arquitectura x86, se puede expresar la ins-
truccin para mover 5 al registro AL de la siguiente ma-
nera: MOV AL, 5, mientras que para otro ensamblador
para la misma arquitectura se expresara al revs: MOV
5, AL. Ambos lenguajes ensambladores haran exacta-
mente lo mismo, solo que est expresado de manera di-
ferente. El primero usa la sintaxis de Intel, mientras que
el segundo usa la sintaxis de AT&T
El uso del ensamblador no resuelve denitivamente el
problema de cmo programar un sistema basado en mi-
croprocesador de modo sencillo ya que para hacer un
uso eciente del mismo, hay que conocer a fondo el
microprocesador, los registros de trabajo de que dispone,
la estructura de la memoria, y muchas cosas ms referen-
tes a su estructura bsica de funcionamiento.
3.3 Ejemplos
Un programa escrito en lenguaje ensamblador consiste en
una serie de instrucciones que corresponden al ujo de
rdenes ejecutables por un microprocesador.
Por ejemplo, en el lenguaje ensamblador para un proce-
sador x86:
La sentencia
MOV AL, 61h
Asigna el valor hexadecimal 61 (97 decimal) al registro
AL.
El programa ensamblador lee la sentencia de arriba y pro-
duce su equivalente binario en lenguaje de mquina
Binario: 10110000 01100001 (hexadecimal: B61)
El mnemnico MOV es un cdigo de operacin u
"opcode". El opcode es seguido por una lista de argumen-
tos o parmetros, completando una tpica instruccin de
ensamblador. En el ejemplo, AL es un registro de 8 bits
del procesador, al cual se le asignar el valor hexadecimal
61 especicado.
El cdigo de mquina generado por el ensamblador con-
siste de 2 bytes. El primer byte contiene empaquetado la
instruccin MOV y el cdigo del registro hacia donde se
va a mover el dato:
1011 0000 01100001 | | | | | +---- Nmero 61h en binario
| | | +--- Registro AL +-------- Instruccin MOV
En el segundo byte se especica el nmero 61h, escrito en
binario como 01100001, que se asignar al registro AL,
quedando la sentencia ejecutable como:
10110000 01100001
La cual puede ser entendida y ejecutada directamente por
el procesador.
4 Diseo del lenguaje
4.1 Elementos bsicos
Hay un grado grande de diversidad en la manera en que
los autores de los ensambladores categorizan las senten-
cias y en la nomenclatura que usan. En particular, al-
gunos describen cualquier cosa como pseudo-operacin
(pseudo-Op), con excepcin del mnemnico de mquina
o del mnemnico extendido.
Un tpico lenguaje ensamblador consiste en 3 tipos de
sentencias de instruccin que son usadas para denir las
operaciones del programa:
Mnemnicos de opcode
Secciones de datos
Directivas de ensamblador
4.1.1 Mnemnicos de opcode y mnemnicos exten-
didos
A diferencia de las instrucciones (sentencias) de los
lenguajes de alto nivel, instrucciones en el lenguaje en-
samblador son generalmente muy simples. Generalmen-
te, una mnemnico es un nombre simblico para una
sola instruccin en lenguaje de mquina ejecutable (un
opcode), y hay por lo menos un mnemnico de opcode
denido para cada instruccin en lenguaje de mquina.
Cada instruccin consiste tpicamente en una operacin
u opcode ms cero o ms operandos. La mayora de las
instrucciones reeren a un solo valor, o a un par de va-
lores. Los operandos pueden ser inmediatos (tpicamente
valores de un byte, codicados en la propia instruccin),
registros especicados en la instruccin, implcitos o las
direcciones de los datos localizados en otra parte de la
4.2 Macros 5
memoria. Esto est determinado por la arquitectura sub-
yacente del procesador, el ensamblador simplemente re-
eja cmo trabaja esta arquitectura. Los mnemnicos ex-
tendidos son frecuentemente usados para especicar una
combinacin de un opcode con un operando especco,
ej, el ensamblador del System/360 usa a B como un mne-
mnico extendido para el BC con una mscara de 15 y
NOP al BC con una mscara de 0.
Los mnemnicos extendidos son frecuentemente usados
para soportar usos especializados de instrucciones, a me-
nudo para propsitos no obvios con respecto al nombre de
la instruccin. Por ejemplo, muchos CPU no tienen una
instruccin explcita de NOP (No Operacin), pero tie-
nen instrucciones que puedan ser usadas para tal prop-
sito. En el CPU 8086, la instruccin XCHG AX,AX (in-
tercambia el registro AX consigo mismo) es usada para el
NOP, con NOP siendo un pseudo-opcode para codicar
la instruccin XCHG AX,AX. Algunos desensamblado-
res reconocen esto y decodicarn la instruccin XCHG
AX,AX como NOP. Similarmente, los ensambladores de
IBM para el System/360 usan los mnemnicos extendi-
dos NOP y NOPRcon las mscaras cero para BCy BCR.
Algunos ensambladores tambin soportan simples ma-
croinstrucciones incorporadas que generan dos o ms ins-
trucciones de mquina. Por ejemplo, con algunos ensam-
bladores para el Z80, la instruccin
LD HL, BC
genera las instrucciones
LD L, C
LD H, B.
[3]
LD HL, BC es un pseudo-opcode, que en este caso simu-
la ser una instruccin de 16 bits, cuando se expande se
producen dos instrucciones de 8 bits que equivalen a la
simulada de 16 bits.
4.1.2 Secciones de datos
Hay instrucciones usadas para denir elementos de datos
para manejar datos y variables. Denen el tipo de dato, la
longitud y la alineacin de los datos. Estas instrucciones
tambin pueden denir si los datos estn disponibles para
programas exteriores (programas ensamblados separada-
mente) o solamente para el programa en el cual la seccin
de datos est denida. Algunos ensambladores clasican
estas instruccin
4.1.3 Directivas del ensamblador
Los directivas del ensamblador, tambin llamadas los
pseudo opcodes, pseudo-operaciones o pseudo-ops, son
instrucciones que son ejecutadas por un ensamblador en
el tiempo de ensamblado, no por un CPU en el tiempo
de ejecucin. Pueden hacer al ensamblado del programa
dependiente de parmetros entrados por un programador,
de modo que un programa pueda ser ensamblado de dife-
rentes maneras, quizs para diversos aplicaciones. Tam-
bin pueden ser usadas para manipular la presentacin de
un programa para hacerlo ms fcil leer y mantener.
Por ejemplo, las directivas pudieran ser usadas para re-
servar reas de almacenamiento y opcionalmente su para
asignar su contenido inicial. Los nombres de las directi-
vas a menudo comienzan con un punto para distinguirlas
de las instrucciones de mquina.
Los ensambladores simblicos le permiten a los progra-
madores asociar nombres arbitrarios (etiquetas o smbo-
los) a posiciones de memoria. Usualmente, cada constan-
te y variable tiene un nombre para que las instrucciones
pueden referir a esas ubicaciones por nombre, as pro-
moviendo el cdigo autodocumentado. En el cdigo eje-
cutable, el nombre de cada subprograma es asociado a su
punto de entrada, as que cualquier llamada a un subpro-
grama puede usar su nombre. Dentro de subprogramas, a
los destinos GOTO se le dan etiquetas. Algunos ensam-
bladores soportan smbolos locales que son lxicamente
distintos de los smbolos normales (ej, el uso de 10$"
como un destino GOTO).
La mayora de los ensambladores proporcionan un mane-
jo exible de smbolos, permitiendo a los programadores
manejar diversos espacios de nombres, calcular autom-
ticamente osets dentro de estructuras de datos, y asignar
etiquetas que reeren a valores literales o al resultado de
clculos simples realizados por el ensamblador. Las eti-
quetas tambin pueden ser usadas para inicializar cons-
tantes y variables con direcciones relocalizables.
Los lenguajes ensambladores, como la mayora de los
otros lenguajes de computador, permiten que comenta-
rios sean aadidos al cdigo fuente, que son ignorados
por el programa ensamblador. El buen uso de los comen-
tarios es an ms importante con cdigo ensamblador que
con lenguajes de alto nivel, pues el signicado y el pro-
psito de una secuencia de instrucciones es ms duro de
descifrar a partir del cdigo en s mismo.
El uso sabio de estas facilidades puede simplicar gran-
demente los problemas de codicar y mantener el cdigo
de bajo nivel. El cdigo fuente de lenguaje ensamblador
crudo generado por compiladores o desensambladores -
cdigo sin ningn comentario, ni smbolos con algn sen-
tido, ni deniciones de datos - es muy difcil de leer cuan-
do deben hacerse cambios.
4.2 Macros
Muchos ensambladores soportan macros predenidos, y
otras soportan macros denidos (y repetidamente rede-
nibles) por el programador que implican secuencias de
lneas del texto en las cuales las variables y las constantes
6 4 DISEO DEL LENGUAJE
estn empotradas. Esta secuencia de lneas de texto pue-
de incluir opcodes o directivas. Una vez un macro ha sido
denido, su nombre puede ser usado en lugar de un mne-
mnico. Cuando el ensamblador procesa tal sentencia, re-
emplaza la sentencia por las lneas del texto asociadas a
ese macro, entonces las procesa como si hubieran existi-
do en el archivo del cdigo fuente original (incluyendo, en
algunos ensambladores, la expansin de cualquier macro
que exista en el texto de reemplazo).
Puesto que las macros pueden tener nombres cortos pe-
ro se expanden a varias o de hecho muchas lneas de c-
digo, pueden ser usados para hacer que los programas en
lenguaje ensamblador parezcan ser mucho ms cortos, re-
quiriendo menos lneas de cdigo fuente, como sucede
con los lenguajes de alto nivel. Tambin pueden ser usa-
dos para aadir niveles de estructura ms altos a los pro-
gramas ensamblador, opcionalmente introducen cdigo
de depuracin empotrado va parmetros y otras caracte-
rsticas similares.
Muchos ensambladores tienen macros incorporados (o
predenidos) para las llamadas de sistema y otras secuen-
cias especiales de cdigo, tales como la generacin y el
almacenamiento de los datos realizados a travs de avan-
zadas operaciones bitwise y booleanas usadas en juegos,
software de seguridad, gestin de datos, y criptografa.
Los macro ensambladores a menudo permiten a los ma-
cros tomar parmetros. Algunos ensambladores incluyen
lenguajes macro muy sosticados, incorporando elemen-
tos de lenguajes de alto nivel tales como parmetros op-
cionales, variables simblicas, condiciones, manipulacio-
nes de strings operaciones aritmticas, todos usables du-
rante la ejecucin de un macro dado, y permitiendo a los
macros guardar el contexto o intercambiar informacin.
As un macro puede generar un gran nmero de instruc-
ciones o deniciones de datos en lenguaje ensamblador,
basadas en los argumentos del macro. Esto pudiera ser
usado para generar, por ejemplo, estructuras de datos de
estilo de records o bucles desenrrollados, o podra gene-
rar algoritmos enteros basados en parmetros complejos.
Una organizacin, usando lenguaje ensamblador, que ha
sido fuertemente extendido usando tal suite de macros,
puede ser considerada que se est trabajando en un len-
guaje de alto nivel, puesto que tales programadores no
estn trabajando con los elementos conceptuales de ms
bajo nivel del computador.
Las macros fueron usados para adaptar sistemas de soft-
ware de gran escala para clientes especcos en la era
del mainframe, y tambin fueron usados por el personal
del cliente para satisfacer las necesidades de sus patrones
haciendo versiones especcas de los sistemas operativos
del fabricante. Esto fue hecho, por ejemplo, por los pro-
gramadores de sistema que trabajaban con el Conversa-
tional Monitor System / Virtual Machine (CMS/VM) de
IBM y con los add-ons real time transaction processing
de IBM, CICS, Customer Information Control System, y
ACP/TPF, el airline/nancial system que comenz en los
aos 1970 y todava corre con muchos sistemas de reser-
vaciones computarizados (CRS) y sistemas de tarjeta de
crdito de hoy.
Tambin es posible usar solamente las habilidades de pro-
cesamiento de macros de un ensamblador para generar
cdigo escrito en lenguajes completamente diferentes,
por ejemplo, para generar una versin de un programa en
COBOL usando un programa macro ensamblador puro
conteniendo lneas de cdigo COBOL dentro de opera-
dores de tiempo ensamblaje dando instrucciones al en-
samblador para generar cdigo arbitrario.
Esto era porque, como en los aos 1970 fue observado, el
concepto de procesamiento de macro es independiente
del concepto de ensamblaje, siendo el anterior, en tr-
minos modernos, ms un procesamiento de textos, que
una generacin de cdigo objeto. El concepto de proce-
samiento de macro apareci, y aparece, en el lenguaje de
programacin C, que soporta instrucciones de prepro-
cesador de jar variables, y hace pruebas condicionales
en sus valores. Observe que a diferencia de ciertos macro-
procesadores previos dentro de los ensambladores, el pre-
procesador de C no es Turing-completo porque careca la
capacidad de bucle o go to, esto ltimo permitiendo a
los programas hacer bucles.
A pesar del poder del procesamiento macro, ste dej de
usarse en muchos lenguajes de alto nivel (una importante
excepcin es C/C++) mientras que segua siendo perenne
para los ensambladores. Esto era porque muchos progra-
madores estaban bastante confundidos por la sustitucin
de parmetros macro y no distinguan la diferencia entre
procesamiento macro, el ensamblaje y la ejecucin.
La sustitucin de parmetros macro es estrictamente por
nombre: en el tiempo de procesamiento macro, el valor de
un parmetro es sustituido textualmente por su nombre.
La clase ms famosa de bugs resultantes era el uso de un
parmetro que en s mismo era una expresin y no un
nombre primario cuando el escritor macro esperaba un
nombre. En el macro:
foo: macro a
load a*b
la intencin era que la rutina que llama proporcionara el
nombre de una variable, y la variable o constante global
b sera usada para multiplicar a a. Si foo es llamado con
el parmetro a-c, ocurre la expansin macro load a-c*b.
Para evitar cualquier posible ambigedad, los usuarios de
macro procesadores pueden encerrar en parntesis los pa-
rmetros formales dentro de las deniciones de macros, o
las rutinas que llaman pueden envolver en parntesis los
parmetos de entrada.
[4]
As, el macro correcto, con los
parntesis, sera:
foo: macro a
load (a)*b
5.1 Perspectiva histrica 7
y su expansin, dara como resultado: load (a-c)*b
El PL/I y el C/C++ ofrecen macros, pero la esta facilidad
solo puede manipular texto. Por otra parte, los lenguajes
homoicnicos, tales como Lisp, Prolog, y Forth, retienen
el poder de los macros de lenguaje ensamblador porque
pueden manipular su propio cdigo como datos.
4.3 Soporte para programacin estructu-
rada
Algunos ensambladores han incorporado elementos de
programacin estructurada para codicar el ujo de la
ejecucin. El ejemplo ms temprano de este acercamien-
to estaba en el Concept-14 macro set, originalmente pro-
puesto por el Dr. H.D. Mills (marzo de 1970), e imple-
mentado por Marvin Kessler en la Federal Systems Di-
vision de IBM, que extendi el macro ensamblador del
S/360 con bloques de control de ujo IF/ELSE/ENDIF y
similares.
[5]
Esto era una manera de reducir o eliminar el
uso de operaciones GOTO en el cdigo en lenguaje en-
samblador, uno de los principales factores que causaban
cdigo espagueti en el lenguaje ensamblador. Este acer-
camiento fue ampliamente aceptado a principios de los
aos 1980 (los ltimos das del uso de lenguaje ensam-
blador en gran escala).
Un curioso diseo fue A-natural, un ensamblador orien-
tado a la corriente (stream-oriented) para los procesado-
res 8080/Z80
[cita requerida]
de Whitesmiths Ltd. (desarro-
lladores del sistema operativo Idris, similar al Unix), y lo
que fue reportado como el primer compilador C comer-
cial). El lenguaje fue clasicado como un ensamblador,
porque trabajaba con elementos de mquina crudos tales
como opcodes, registros, y referencias de memoria; pe-
ro incorporaba una sintaxis de expresin para indicar el
orden de ejecucin. Los parntesis y otros smbolos es-
peciales, junto con construcciones de programacin es-
tructurada orientadas a bloques, controlaban la secuencia
de las instrucciones generadas. A-natural fue construido
como el lenguaje objeto de un compilador C, en vez de la
codicacin manual, pero su sintaxis lgica gan algunos
seguidores.
Ha habido poca demanda aparente para ensambladores
ms sosticados debido a la declinacin del desarrollo de
lenguaje ensamblador de larga escala.
[6]
A pesar de eso,
todava se estn 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.
[7]
5 Uso del lenguaje ensamblador
5.1 Perspectiva histrica
Los lenguajes ensambladores fueron primero desarro-
llados en los aos 1950, cuando fueron referidos como
lenguajes de programacin de segunda generacin. Por
ejemplo, el SOAP (Symbolic Optimal Assembly Pro-
gram) era un lenguaje ensamblador de 1957 para el
computador IBM 650. Los lenguajes ensambladores eli-
minaron mucha de la propensin a errores y del consumo
de tiempo de la programacin de los lenguajes de prime-
ra generacin que se necesitaba con los primeros compu-
tadores, liberando a los programadores del tedio tal como
recordar cdigos numricos y clculo de direcciones. Una
vez fueron ampliamente usados para todo tipo de pro-
gramacin. Sin embargo, por los aos 1980 (1990 en los
microcomputadores), su uso haba sido en gran parte su-
plantado por los lenguajes de alto nivel,
[cita requerida]
en la
bsqueda de una mejorada productividad en programa-
cin. Hoy en da, aunque el lenguaje ensamblador es casi
siempre manejado y generado por los compiladores, to-
dava se usa para la manipulacin directa del hardware,
acceso a instrucciones especializadas del procesador, o
para resolver problemas de desempeo crtico. Los usos
tpicos son controladores/manejadores (drivers) de dispo-
sitivo, sistemas embebidos de bajo nivel, y sistemas de
tiempo real.
Histricamente, un gran nmero de programas han sido
escritos enteramente en lenguaje ensamblador. Los sis-
temas operativos fueron casi exclusivamente escritos en
lenguaje ensamblador hasta la aceptacin amplia del len-
guaje de programacin C en los aos 1970 y principios
de los 1980. Tambin, muchas aplicaciones comerciales
fueron escritas en lenguaje ensamblador, incluyendo una
gran cantidad del software escrito por grandes corpora-
ciones para mainframes de IBM. Los lenguajes COBOL
y FORTRAN eventualmente desplazaron mucho de es-
te trabajo, aunque un nmero de organizaciones grandes
conservaran las infraestructuras de aplicaciones en len-
guaje ensamblador hasta bien entrados los aos 1990.
La mayora de los primeros microcomputadores cona-
ron en el lenguaje ensamblador codicado a mano, inclu-
yendo la mayora de los sistemas operativos y de las apli-
caciones grandes. Esto era porque estos sistemas tenan
limitaciones severas de recursos, impusieron idiosincrti-
cas arquitecturas de memoria y de pantalla, y proporcio-
naron servicios de sistema limitados y con errores. Quizs
ms importante era la falta de compiladores de primera
clase de lenguajes de alto nivel adecuados para el uso en
el microcomputador. Un factor psicolgico tambin pudo
haber jugado un papel: la primera generacin de progra-
madores de los microcomputadores conserv una actitud
de acionado de alambres y alicates.
En un contexto ms comercial, las ms grandes razones
para usar el lenguaje ensamblador era hacer programas
con mnimo tamao, mnima sobrecarga, mayor veloci-
dad y conabilidad.
8 5 USO DEL LENGUAJE ENSAMBLADOR
Los tpicos 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 clculo Lotus 1-2-3, y casi todos los juegos popu-
lares para la familia Atari 800 de computadores persona-
les. Incluso en los aos 1990, la mayora de los videojue-
gos de cnsola fueron escritos en ensamblador, incluyen-
do la mayora de los juegos para la Mega Drive/Genesis y
el Super Nintendo Entertainment System.
[cita requerida]
Se-
gn algunos insiders de la industria, el lenguaje ensam-
blador era el mejor lenguaje de programacin a usar para
obtener el mejor desempeo del Sega Saturn, una cn-
sola para la cual era notoriamente desaante desarrollar
y programar juegos.
[8]
El popular juego de arcade NBA
Jam (1993) es otro ejemplo. El ensamblador ha sido por
largo trecho, el lenguaje de desarrollo primario en los
computadores hogareos Commodore 64, Atari ST, as
como el ZX Spectrum. Esto fue as en gran parte por-
que los dialectos del BASIC en estos sistemas ofrecie-
ron insuciente velocidad de ejecucin, as como insu-
cientes caractersticas para aprovechar completamente
el hardware disponible. Algunos sistemas, ms notable-
mente el Amiga, incluso tienen IDEs con caractersticas
de depuracin y macros altamente avanzados, tales como
el freeware ASM-One assembler, comparable a las del
Microsoft Visual Studio (el ASM-Uno precede al Micro-
soft Visual Studio).
El ensamblador para el VIC-20 fue escrito por Don
French y publicado por French Silk. Con 1639 bytes
de longitud, su autor cree que es el ms pequeo en-
samblador simblico jams escrito. El ensamblador so-
portaba el direccionamiento simblico usual y la de-
nicin de cadenas de caracteres o cadenas hexade-
cimales. Tambin permita expresiones de direcciones
que podan combinarse con las operaciones de adicin,
substraccin, multiplicacin, divisin, AND lgico, OR
lgico, y exponenciacin.
[9]
5.2 Uso actual
Siempre ha habido debates sobre la utilidad y el desempe-
o del lenguaje ensamblador relativo a lenguajes de alto
nivel. El lenguaje ensamblador tiene nichos especcos
donde es importante (ver abajo). Pero, en general, los
modernos compiladores de optimizacin
[cita requerida]
pa-
ra traducir lenguajes de alto nivel en cdigo que pue-
de correr tan rpidamente como el lenguaje ensambla-
dor escrito a mano, a pesar de los contraejemplos que
pueden ser encontrados.
[10][11][12]
La complejidad de los
procesadores modernos y del subsistema de memoria ha-
ce la optimizacin efectiva cada vez ms difcil para
los compiladores, as como para los programadores en
ensamblador.
[13][14]
Adicionalmente, y para la consterna-
cin de los amantes de la eciencia, el desempeo cada
vez mayor del procesador ha signicado que la mayora
de los CPU estn desocupados la mayor parte del tiempo,
con retardos causados por embotellamientos predecibles
tales como operaciones de entrada/salida y paginacin de
memoria. Esto ha hecho que la velocidad de ejecucin
cruda del cdigo no sea un problema para muchos pro-
gramadores.
Hay algunas situaciones en las cuales los profesionales pu-
dieran elegir utilizar el lenguaje ensamblador. Por ejem-
plo cuando:
Es requerido un ejecutable binario independiente
(stand-alone), es decir uno que deba ejecutarse sin
recursos a componentes de tiempo de ejecucin o a
bibliotecas asociadas con un lenguaje de alto nivel;
sta es quizs la situacin ms comn. Son progra-
mas empotrados que solo almacenan una pequea
cantidad de memoria y el dispositivo est dirigido
para hacer tareas para un simple propsito. Ejem-
plos consisten en telfonos, sistemas de combustible
e ignicin para automviles, sistemas de control del
aire acondicionado, sistemas de seguridad, y senso-
res
Interactuando directamente con el hardware, por
ejemplo en controladores (drivers) de dispositivo y
manejadores de interrupcin
usando instrucciones especcas del procesador no
explotadas o disponibles por el compilador. Un
ejemplo comn es la instruccin de rotacin bitwise
en el ncleo de muchos algoritmos de cifrado
creando funciones vectorizadas para programas en
lenguajes de alto nivel como C. En el lenguaje de
alto nivel esto es a veces ayudado por funciones in-
trnsecas del compilador que mapean directamente
a los mnemnicos del SIMD, pero sin embargo re-
sulta en una conversin de ensamblador de uno a uno
para un procesador de vector asociado
Es requerida la optimizacin extrema, ej, en un
bucle interno en un algoritmo intensivo en el uso
del procesador. Los programadores de juegos toman
ventaja de las habilidades de las caractersticas del
hardware en los sistemas, permitiendo a los juegos
correr ms rpidamente. Tambin las grandes simu-
laciones cientcas requieren algoritmos altamente
optimizados, ej, lgebra lineal con BLAS
[10][15]
o
la transformada de coseno discreta (ej, la versin
SIMD en ensamblador del x264,
[16]
(una biblioteca
para codicar streams de video)
Un sistema con severas limitaciones de recursos (ej,
un sistema empotrado) debe ser codicado a mano
para maximizar el uso de los limitados recursos; pe-
ro esto est llegando a ser menos comn a medida
que el precio del procesador decrece y el desempeo
mejora
No existe ningn lenguaje de alto nivel, en un pro-
cesador nuevo o especializado, por ejemplo
5.3 Aplicaciones tpicas 9
Escribiendo programas de tiempo real que necesi-
tan sincronizacin y respuestas precisas, tales como
sistemas de navegacin de vuelo, y equipo mdico.
Por ejemplo, en un sistema y-by-wire (vuelo por
mandos elctricos), la telemetra debe ser interpre-
tada y hay que actuar dentro de limitaciones estric-
tas de tiempo. Tales sistemas deben eliminar fuentes
de retrasos impredecibles, que pueden ser creados
por (algunos) lenguajes interpretados, recoleccin
de basura automtica, operaciones de paginacin, o
multitarea preventiva. Sin embargo, algunos lengua-
jes de alto nivel incorporan componentes de tiempo
de ejecucin e interfaces de sistema operativo que
pueden introducir tales retrasos. Elegir el ensambla-
dor 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, en si-
tuaciones de seguridad extremadamente alta donde
nada puede darse por sentado.
Se escriben virus de computadora, bootloaders,
ciertos controladores/manejadores de dispositivo, u
otros elementos muy cerca del hardware o al sistema
operativo de bajo nivel
Se escriben simuladores del conjunto de instruccio-
nes para monitoreo, trazado y depuracin de errores
donde la sobrecarga adicional es mantenida al mni-
mo
Se hace ingeniera inversa en binarios existentes que
pueden o no haber sido escritos originalmente en
un lenguaje de alto nivel, por ejemplo al crackear
la proteccin anticopia del software propietario.
Se hace ingeniera inversa y modicacin de video
juegos (tambin denominado ROM hacking), que
es posible por medio de varios mtodos. El ms am-
pliamente implementado es alterando el cdigo del
programa a nivel de lenguaje ensamblador
Se escribe cdigo automodicable, algo para lo que
el lenguaje ensamblador se presta bien
Se escriben juegos y otros softwares para
calculadoras grcas
[17]
Se escribe software compilador que genera cdigo
ensamblador, y por lo tanto los desarrolladores de-
ben ser programadores de lenguaje ensamblador
Se escriben algoritmos criptogrcos que siempre
deben tomar estrictamente el mismo tiempo para
ejecutar, previniendo ataques de tiempo
Sin embargo, el lenguaje ensamblador es todava en-
seado en la mayora de los programas de ciencias de
la computacin e ingeniera electrnica. Aunque hoy en
da, pocos programadores trabajan regularmente con el
lenguaje ensamblador como una herramienta, los con-
ceptos fundamentales continan siendo muy importan-
tes. Tales tpicos fundamentales, como aritmtica bina-
ria, asignacin de memoria, procesamiento del stack, co-
dicacin de conjunto de caracteres, procesamiento de
interrupciones, y diseo de compiladores, seran duros de
estudiar en detalle sin la comprensin de cmo el compu-
tador opera a nivel del hardware. Puesto que el compor-
tamiento del computador es fundamentalmente denido
por su conjunto de instrucciones, la manera lgica de
aprender tales conceptos es estudiar un lenguaje ensam-
blador. La mayora de los computadores modernos tie-
nen un conjunto de instrucciones similares. Por lo tanto,
estudiar un solo lenguaje ensamblador es suciente pa-
ra aprender: i) los conceptos bsicos; ii) reconocer situa-
ciones donde el uso de lenguaje ensamblador puede ser
apropiado; y iii) ver cmo el cdigo ejecutable eciente
puede ser creado por los lenguajes de alto nivel
[18]
5.3 Aplicaciones tpicas
El lenguaje ensamblador hard-coded es tpicamente usa-
do en el ROM de arranque del sistema (BIOS en los sis-
temas compatible IBM PC). Este cdigo de bajo nivel es
usado, entre otras cosas, para inicializar y probar el hard-
ware del sistema antes de cargar el sistema operativo, y
est almacenado en el ROM. Una vez que ha tomado lu-
gar un cierto nivel de inicializacin del hardware, la eje-
cucin se transere a otro cdigo, tpicamente escrito en
lenguajes de alto nivel; pero el cdigo corriendo inmedia-
tamente despus de que es aplicada la energa usualmente
est escrito en lenguaje ensamblador. Lo mismo es cierto
para los boot loaders.
Muchos compiladores traducen lenguajes de alto nivel a
lenguaje ensamblador primero, antes de la compilacin
completa, permitiendo que el cdigo en ensamblador sea
visto para propsitos de depuracin y optimizacin. Len-
guajes de relativo bajo nivel, como C, con frecuencia pro-
veen sintaxis especial para empotrar lenguaje ensambla-
dor en cada plataforma de hardware. El cdigo portable
del sistema entonces puede usar estos componentes espe-
ccos a un procesador a travs de una interface uniforme.
El lenguaje ensamblador tambin es valioso en ingeniera
inversa, puesto que muchos programas solamente son dis-
tribuidos en una forma de cdigo de mquina. El cdigo
de mquina es usualmente fcil de trasladar hacia lengua-
je ensamblador para luego ser cuidadosamente examina-
do en esta forma, pero es muy difcil de trasladar hacia
un lenguaje de alto nivel. Herramientas como Interactive
Disassembler, hacen uso extenso del desensamblador pa-
ra tales propsitos.
Un nicho que hace uso del lenguaje ensamblador es el
demoscene. Ciertas competiciones requieren a los con-
cursantes restringir sus creaciones a un muy pequeo ta-
mao (ej, 256 bytes, 1 KB, 4 KB 64 KB), y el lenguaje
ensamblador es el lenguaje de preferencia para alcanzar
10 7 EJEMPLOS DE LENGUAJE ENSAMBLADOR
este objetivo.
[19]
Cuando los recursos son una preocupa-
cin, es una necesidad la codicacin en ensamblador,
especialmente en sistemas constreidos por el procesa-
miento del CPU, como los primeros modelos del Amiga,
y el Commodore 64. El cdigo optimizado en ensambla-
dor es escrito a mano por los programadores en un in-
tento de minimizar el nmero de ciclos de CPU usados.
Las limitaciones del CPU son tan grandes que cada ciclo
cuenta. Usar tales mtodos ha habilitado, a sistemas co-
mo el Commodore 64, para producir grcos en 3D en
tiempo real con efectos avanzados, una hazaa que puede
ser considerada improbable o incluso imposible para un
sistema con un procesador de 0.99 MHz.
[cita requerida]
6 Detalles adicionales
Para un determinado computador personal, mainframe,
sistema empotrado, y cnsola de juegos, tanto del pasado
como del presente, ha sido escrito al menos uno, y posi-
blemente docenas de ensambladores. Para algunos ejem-
plos, vea la lista de ensambladores.
En los sistemas Unix, el ensamblador es llamado tradicio-
nalmente as, aunque no es un simple cuerpo de cdigo,
siendo tpicamente escrito uno nuevo por cada port. Un
nmero de variantes de Unix usan el GAS
Dentro de los grupos de procesadores, cada ensamblador
tiene su propio dialecto. A veces, algunos ensambladores
pueden leer el dialecto de otro, por ejemplo, TASMpuede
leer el viejo cdigo del MASM, pero no al revs. FASM y
NASM tienen una sintaxis similar, pero cada uno soporta
diferentes macros que pueden ser difcil de trasladar de
uno al otro. Las cosas bsicas son siempre las mismas,
pero las caractersticas avanzadas sern diferentes
[20]
Tambin, los lenguajes ensambladores a veces pueden
ser portables a travs de diferentes sistemas operativos
en el mismo tipo de CPU. Las convenciones de llama-
das entre los sistemas operativos con frecuencia dieren
ligeramente o en nada. y con cuidado es posible ganar
portabilidad en el lenguaje ensamblador, usualmente al
enlazar con una biblioteca de lenguaje C que no cambia
entre sistemas operativos. Un simulador de conjunto de
instrucciones (que idealmente sera escrito en lenguaje
ensamblador) puede, en teora, procesar el cdigo obje-
to/binario de cualquier ensamblador) para lograr la por-
tabilidad incluso a travs de plataformas (con una sobre-
cargue no mayor que la de un interpretador de bytecode
tpico). Esto es esencialmente lo que logra el microcdigo
cuando una plataforma de hardware cambia internamen-
te.
Por ejemplo, muchas cosas en libc dependen del
preprocesador para hacer, al programa antes de compilar,
cosas que son especcas del sistema operativo o espec-
cas del C. De hecho, algunas funciones y smbolos ni
siquiera estn garantizados que existan fuera del prepro-
cesador. Peor an, el tamao y el orden de los campos de
las estructuras, tanto como el tamao de ciertas typedefs
como o_t, no estn disponibles en lenguaje ensambla-
dor sin la ayuda de un script de conguracin, y die-
ren incluso entre versiones de Linux, haciendo imposible
portar llamadas de funciones en libc diferentes de los que
toman simples enteros o punteros como parmetros. Pa-
ra manejar estos problemas, el proyecto FASMLIB pro-
vee una biblioteca de lenguaje ensamblador portable pa-
ra las plataformas Win32 y Linux, pero todava est muy
incompleta.
[21]
Algunos lenguajes de muy alto nivel, como C y Borland
Pascal, soportan ensamblado en lnea, donde relativamen-
te secciones cortas de cdigo en ensamblador puede ser
empotradas dentro del cdigo del lenguaje de alto nivel.
El lenguaje Forth comnmente contiene un ensamblador
usado para codicar palabras.
La mayora de la gente usa un emulador para depurar sus
programas en lenguaje ensamblador.
7 Ejemplos de lenguaje ensambla-
dor
7.1 Ejemplo para la arquitectura x86
El siguiente es un ejemplo del programa clsico Hola
mundo escrito para la arquitectura de procesador x86 (ba-
jo el sistema operativo DOS).
; --------------------------------------------- ; Programa
que imprime un string en la pantalla ; ---------------
------------------------------ .model small ; modelo de
memoria .stack ; segmento del stack .data ; segmento de
datos Cadena1 DB 'Hola Mundo.$' ; string a imprimir
(nalizado en $) .code ; segmento del cdigo ; -------
-------------------------------------- ; Inicio del programa
; --------------------------------------------- programa: ;
----------------------------------------------------------------
------------------------------------ ; inicia el segmento de
datos ; ---------------------------------------------------------
------------------------------------------- MOV AX, @data
; carga en AX la direccin del segmento de datos MOV
DS, AX ; mueve la direccin al registro de segmento por
medio de AX ; -----------------------------------------------
----------------------------------------------------- ; Imprime
un string en pantalla ; ------------------------------------
----------------------------------------------------------------
MOV DX, oset Cadena1 ; mueve a DX la direccin
del string a imprimir MOV AH, 9 ; AH = cdigo para
indicar al MS DOS que imprima en la pantalla, el
string en DS:DX INT 21h ; llamada al MS DOS para
ejecutar la funcin (en este caso especicada en AH) ;
----------------------------------------------------------------
------------------------------------ ; Finaliza el programa ;
-----------------------------------------------------------------
----------------------------------- INT 20h ; llamada al MS
DOS para nalizar el programa end programa
11
7.2 Ejemplo para el computador virtual
(POCA)
Una seleccin de instrucciones para una computadora
virtual
[22]
) con las correspondientes direcciones de me-
moria en las que se ubicarn las instrucciones. Estas di-
recciones NO son estticas. Cada instruccin se acompa-
a del cdigo en lenguaje ensamblador generado (cdigo
objeto) que coincide con la arquitectura de computador
virtual, o conjunto de instrucciones ISA.
7.3 Ejemplo para el C Intel 8051
Cdigo en lenguaje ensamblador para C Intel 80C51:
ORG 8030H include T05SEG: SETB TR0 JNB
uSEG,T05SEG ;esta subrutina es utilizada CLR TR0
;para realizar una cuenta de CPL uSEG ;0,5 segundos
mediante la MOV R1,DPL ;interrupcin del timer 0.
INVOKE MOV R2,DPH CJNE R2,#07H,T05SEG
CJNE R1,#78H,T05SEG MOV DPTR,#0 RET
7.4 Ejemplo para el Microchip PIC16F84
Cdigo en lenguaje ensamblador para el
microcontrolador 16F84 de Microchip:
ORG 0 Inicio bsf STATUS,RP0 clrf PORTB movlw
0xFF movwf PORTA bcf STATUS,RP0 Principal
movf PORTA,W movwf Contador movf Contador,F
btfsc STATUS,Z goto PuntoDecimal sublw d'9' btfss
STATUS,C END
8 Referencias
[1] David Salomon (1993). Assemblers and Loaders
[2] Beck, Leland L. (1996). 2. System Software: An Intro-
duction to Systems Programming. Addison Wesley.
[3] http://www.z80.de/z80/z80code.htm
[4] Macros (C/C++), MSDN Library for Visual Studio
2008. Microsoft Corp.. Consultado el 22-06-2010.
[5] Concept 14 Macros. MVS Software. Consultado el 25
de mayo de 2009.
[6] Answers.com. assembly language: Denition and Much
More from Answers.com. Consultado el 19-06-2008.
[7] NESHLA: The High Level, Open Source, 6502 Assem-
bler for the Nintendo Entertainment System
[8] Eidolons Inn : SegaBase Saturn
[9] Jim Lawless (21-05-2004). Speaking with Don French :
The Man Behind the French Silk Assembler Tools. Con-
sultado el 25-07-2008.
[10] Writing the Fastest Code, by Hand, for Fun: A Human
Computer Keeps Speeding Up Chips. New York Times,
John Marko (28-11-2005). Consultado el 04-03-2010.
[11] Bit-eld-badness. hardwarebug.org (30-01-2010).
Consultado el 04-03-2010.
[12] GCC makes a mess. hardwarebug.org (13-05-2009).
Consultado el 04-03-2010.
[13] Randall Hyde. The Great Debate. Consultado el 03-07-
2008.
[14] Code sourcery fails again. hardwarebug.org (30-01-
2010). Consultado el 04-03-2010.
[15] BLAS Benchmark-August2008. eigen.tuxfamily.org
(01-08-2008). Consultado el 04-03-2010.
[16] x264.git/common/x86/dct-32.asm. git.videolan.org
(29-09-2010). Consultado el 29-09-2010.
[17] 68K Programming in Fargo II. Consultado el 03-07-
2008.
[18] Hyde, Randall (30-09-1996). Foreword (Why would
anyone learn this stu?"), op. cit.. Consultado el 05-03-
2010.
[19] 256bytes demos archives. Consultado el 03-07-2008.
[20] Randall Hyde. Which Assembler is the Best?. Consul-
tado el 19-10-2007.
[21] "vid". FASMLIB: Features. Consultado el 19-10-2007.
[22] Principles of Computer Architecture (POCA) AR-
CTools computadora virtual disponible para descarga y
ejecucin del cdigo, acceso el 24 de agosto de 2005
[23] Murdocca, Miles J. y Heuring, Vincent P.:Principles of
Computer Architecture (2000), Prentice Hall, ISBN0-201-
43664-7
9 Lectura adicional
Dominic Sweetman: See MIPS Run. Morgan Kauf-
mann Publishers, 1999. ISBN 1-55860-410-3
Robert Britton: MIPS Assembly Language Program-
ming. Prentice Hall, 2003. ISBN 0-13-142044-5
John Waldron: Introduction to RISC Assembly Lan-
guage Programming. Addison Wesley, 1998. ISBN
0-201-39828-1
ASM Community Book An online book full of help-
ful ASM info, tutorials and code examples by the
ASM Community
12 11 ENLACES EXTERNOS
Jonathan Bartlett: Programming from the Ground
Up. Bartlett Publishing, 2004. ISBN 0-9752838-4-
7
Also available online as PDF
Paul Carter: PC Assembly Language. Free ebook,
2001.
Website
Je Duntemann: Assembly Language Step-by-Step.
Wiley, 2000. ISBN 0-471-37523-3
Randall Hyde: The Art of Assembly Language. No
Starch Press, 2003. ISBN 1-886411-97-2
Draft versions available online as PDF and HTML
Peter Norton, John Socha, Peter Nortons Assembly
Language Book for the IBM PC, Brady Books, NY:
1986.
Michael Singer, PDP-11. Assembler Language Pro-
gramming and Machine Organization, John Wiley &
Sons, NY: 1980.
10 Vase tambin
Lenguaje ensamblador x86
Anexo:Listados de instrucciones x86
Ensamblador
Macro ensamblador
Ensamblador de alto nivel
Lenguaje ensamblador tipeado
Desensamblador
Compilador
Decompilador
Intrprete (informtica)
Depurador
Lenguaje de alto nivel
Lenguaje de bajo nivel
Lenguaje de mquina
Conjunto de instrucciones
Tipos de datos mquina
Little man computer
Ensambladores
Comparacin de ensambladores
High Level Assembly
Netwide Assembler
Flat assembler
GNU Assembler
Microsoft Macro Assembler
RosASM
GoASM
A86 y A386 assemblers
Turbo Assembler
GNU toolchain
Desensambladores
Interactive Disassembler
Depuradores
SoftICE
GNU Debugger
OllyDbg
Valgrind
RosASM
A86 y A386 assemblers
Data Display Debugger
debug (comando)
Otros
Sistemas operativos escritos completamente en assem-
bler:
MenuetOS
KolibriOS
BareMetal OS
11 Enlaces externos
Wikilibros
Wikilibros alberga un libro o manual sobre
Programacin en lenguaje ensamblador.
The Art of Assembly Language Programming, by
Randall Hyde
13
Computer-Books.us, Online Assembly Language
Brooks
PCAssembly Language(espaol) by Dr Paul Carter;
*PC Assembly Tutorial using NASM and GCC by
Paul Carter
Programming from the Ground Up by Jonathan
Bartlett
The ASM Book by the ASM Community
Inline::ASM mdulo Perl en CPAN para programar
en lenguaje ensamblador dentro de programas Perl
(en ingls)
Ejemplos prcticos de ensamblador en GNU/Linux
14 12 TEXT AND IMAGE SOURCES, CONTRIBUTORS, AND LICENSES
12 Text and image sources, contributors, and licenses
12.1 Text
Lenguaje ensamblador Fuente: http://es.wikipedia.org/wiki/Lenguaje_ensamblador?oldid=77011224 Colaboradores: Sabbut, Moriel,
JorgeGG, Pilaf, ManuelGR, Robbot, Sanbec, Triku, Jynus, Sms, Robotito, Bgbot, Porao, Darz Mol, Vizcarra, Z80user, MatiasBellone,
Richy, Digigalos, Boticario, AlfonsoERomero, Airunp, Emijrp, RobotQuistnix, Platonides, Chobot, Yrbot, Vitamine, GermanX, Beto29,
Gothmog, Jesuja, Santiperez, Maldoror, Tomatejc, BOTpolicia, Qwertyytrewqqwerty, CEM-bot, Jorgelrm, Laura Fiorucci, X.Cyclop, ^Ci-
ViLoN^, Cristianrock2, Antur, FrancoGG, Thijs!bot, Roberto Fiadone, JoaquinFerrero, Locovich, Isha, JAnDbot, Jugones55, Kved, Se-
gedano, Rafa3040, Muro de Aguas, TXiKiBoT, Oespinosa, Netito777, Marvelshine, Biasoli, VolkovBot, Technopat, Galandil, Matdrodes,
Elabra sanchez, House, Erickmr, Barri, Muro Bot, BotMultichill, SieBot, Loveless, Drinibot, BOTarate, Manw, El bot de la dieta, Bue-
naGente, Mrisco, DorganBot, Tirithel, Piero71, Lentucky, Botelln, CestBOT, Valentin estevanez navarro, Kroji, AVBOT, LucienBOT,
Tanhabot, NjardarBot, Gades21, Diegusjaimes, Hann, Innv, Andreasmperu, Luckas-bot, Lu Tup, Kbradero, SuperBraulio13, Xqbot, Jkbw,
Ricardogpn, Albertochoa, Surfaz, Botarel, AstaBOTh15, TiriBOT, Scapegoat001, Jcdy, Halfdrag, Kizar, Codename, Jerowiki, PatruBOT,
Dinamik-bot, GrouchoBot, G Garro, EmausBot, Sergio Andres Segovia, Grillitus, WikitanvirBot, R010178, ILoveSugar, ChayitaBOT, Al-
bertoCamilo, Addbot, Carlos7755 y Annimos: 156
12.2 Images
Archivo:Check_mark.png Fuente: http://upload.wikimedia.org/wikipedia/commons/f/f0/Check_mark.png Licencia: ? Colaboradores:
Wikipedia Artista original: Wikipedia
Archivo:Codigo_de_maquina.png Fuente: http://upload.wikimedia.org/wikipedia/commons/f/f3/Codigo_de_maquina.png Licencia:
Public domain Colaboradores: Trabajo propio Artista original: German
Archivo:Commons-emblem-copyedit.svg Fuente: http://upload.wikimedia.org/wikipedia/commons/e/e8/Commons-emblem-copyedit.
svg Licencia: CC-BY-SA-3.0 Colaboradores:
File:Gnome-emblem-important.svg Artista original: GNOME icon artists, Fitoschido
Archivo:Wikibooks-logo.svg Fuente: http://upload.wikimedia.org/wikipedia/commons/f/fa/Wikibooks-logo.svg Licencia: CC-BY-SA-
3.0 Colaboradores: Trabajo propio Artista original: User:Bastique, User:Ramac et al.
12.3 Content license
Creative Commons Attribution-Share Alike 3.0

You might also like