1. SISTEMAS OPERATIVOS, ABRIL 2013 1
programacion en lenguaje ensamblador usando
NASM
Alexander Pinchao
Facultad de Ingenier´ıa en Sistemas
Escuela Polit´ecnica Nacional
alexander.pinchao@gmail.com
Resumen—
Creaci´on de un programa en lenguaje ensamblador usando el ensamblador de Linux (nasm), que defina
una variable, asigne el valor de 100 a dicha variable, posteriormente sume 9 a la variable e imprima. La
importancia de este trabajo radica en la posibilidad de manipular un valor en memoria para experimentar la
forma de trabajo de la upc con la memoria, y usar las interrupciones para realizar la impresi´on ya que este
es un m´etodo m´as f´acil de realizar la presentaci´on de los valores generados
Index Terms— nasm, ensamblador, interrupcion.
!
1. INTRODUCCI ´ON
CAda variante de procesador posee su pro-
pio lenguaje m´aquina, el cual invarian-
temente reconoce las instrucciones en forma
de n´umeros y los almacena en la memoria,
cada operaci´on posee su propio c´odigo llamado
upcode. Las instrucciones pueden variar de ta-
ma˜no, el upcode se encuentra invariantemente
al inicio de cada instrucci´on, adem´as del up-
code las instrucciones mayoritariamente suelen
llevar adem´as datos (direcciones, constantes o
variables), que van a ser usados por la instruc-
ci´on. Hay que tener en cuenta que programar
en lenguaje de maquina es muy complicado
para realizarse directamente ya que las instruc-
ciones se encuentran codificadas num´ericamen-
te y esto resulta sumamente tedioso y compli-
cado de interpretar para los humanos , para
saltar esta limitaci´on se desarroll´o el lenguaje
ensamblador el cual permite facilitar el traba-
jo al desarrollador de software, un programa
escrito en lenguaje ensamblador esta escrito y
almacenado en forma textual al igual que los
lenguajes de alto nivel, el cual se maneja con
instrucciones de forma muy sencilla como por
ejemplo: sum eax,ebx Es decir una instrucci´on
representara una operaci´on que realizara la ma-
quina en este caso sumar ebx a eax. A simple
vista se puede ver que esto es m´as f´acil de
entender y ser´ıa mucho m´as f´acil de encontrar
para una depuraci´on que 03 C3 la cual es la
forma de la instrucci´on en lenguaje puramente
m´aquina.
2. METODOLOG´IA
El lenguaje ensamblador en su estructura
m´as b´asica se puede representar en forma de
c´odigos nem´onicos, los m´as usados son: sum,
sub, mul, div, int ya que como se sabe la
computadora solo sabe sumar, restar, multipli-
car y dividir, estas instrucciones son le´ıdas por
el programa ensamblador y las transforma a
lenguaje de m´aquina, es decir como un com-
pilador en lenguaje de alto nivel, pero mucho
mas sencillo ya que en ensamblador una ins-
trucci´on es una instrucci´on en lenguaje maqui-
na con seguridad, mientras que en lenguaje
de alto nivel una instrucci´on puede necesitar
muchas instrucciones en lenguajes maquina,
adem´as de que los lenguajes de alto nivel son
iguales sin importar que tipo de maquina se
use, mientras que los lenguajes de ensamblador
2. SISTEMAS OPERATIVOS, ABRIL 2013 2
var´ıan con la arquitectura del procesador exis-
tiendo tres variables NASM(Netwide Assem-
bler) de Linux, MASM(Microsoft Assembler)
de Microsoft y TASM (Turbo Assembler) de
Borland. En lenguaje ensamblador la estructura
de las instrucciones es: c´odigo,operando. Los
operando puede ser de distintos tipos:
1. Registros.- Se refieren directamente a los
registros de la UCP
2. Memoria.- Son los datos almacenados en
memoria, teniendo en cuenta que la di-
recci´on de los datos puede estar descrita
en una instrucci´on o calculada usando
los valores de registros, ya que estas son
simples desplazamientos relativos al co-
mienzo de un segmento
3. Inmediato.- Son valores fijos que est´an
dentro del mismo segmento de c´odigo,
es decir se valores que est´an en ”section
.text”no en ”section .data”
4. Impl´ıcito.- Es decir aquellos que no apa-
recen de forma visible pero interact´uan
con los registros o la memoria como es
el caso de los decrementos, el cual resta
una al valor de un registro o a un valor
en memoria.
Dejando de lado por un momento de los opera-
dores, podemos decir que la instrucci´on esen-
cial en el lenguaje ensamblador es: mov, ya que
esta traslada los valores de un operando a otro
es decir realiza las funciones de un operador de
asignaci´on visto desde el punto de vista de los
lenguajes de alto nivel, la estructura base para
realizar esta operaci´on es por ejemplo: mov
eax,ebx en este fragmento de programa se a
asignado a eax el valor que esta dentro de ebx.
Pero este operando presenta la restricci´on que
los dos operandos no deben de ser operandos
de memoria, adem´as de que los operando de-
ben tener tama˜nos iguales. Lo cual nos plantea
la duda que esta bien y que esta mal, esto
se resuelve con el uso de las directivas del
programa ensamblador, las directivas son pro-
pias del lenguaje ensamblador no del lenguaje
m´aquina, y estas se usan para comunicarle al
ensamblador que realice alguna acci´on, estas se
traducen luego a c´odigo maquina, sus usos mas
comunes son:
1. Definir constantes
2. Definir la memoria para almacenar datos
en ella.
3. Agrupar la memoria en segmentos.
4. Incluir codigo fuente condicionalmente
5. Incluir otros archivos
Las directivas existentes son:
Directiva equ.- esta directiva se usa para
definir un s´ımbolo. Los s´ımbolos son cons-
tantes que poseen un nombre que puede
ser usado dentro de la estructura del pro-
grama ensamblador
Directiva %define.- es similar al define en
C, ya que genera un macro con el cual
trabajar
Algunas veces el flujo ordinario de un pro-
grama debe ser interrumpido para procesar
eventos que requieren una respuesta r´apida. El
hardware de un computador provee un me-
canismo llamado interrupci´on para manipular
estos eventos. Por ejemplo cuando se mueve el
rat´on la interrupci´on de hardware del rat´on es
el programa actual para manejar el movimiento
del rat´on (para mover el cursor del mouse,
etc) Las interrupciones hacen que el control se
pase a un manipulador de interrupciones. Los
manipuladores de interrupciones son rutinas
que procesan la interrupci´on. A cada tipo de
interrupci´on se le asigna un n´umero entero.
En el comienzo de la memoria f´ısica una tabla
de vectores de interrupci´on que contiene la di-
recci´on del segmento de los manipuladores de
la interrupci´on. El n´umero de la interrupci´on
es esencialmente un ´ındice en esta tabla. Las
interrupciones externas son levantadas desde
el exterior de la CPU (el rat´on es un ejemplo
de este tipo de interrupci´on). Muchos disposi-
tivos de E/S levantan interrupciones (teclado,
temporizador, disco duro CD ROM y tarjetas
de sonido) Las interrupciones internas son le-
vantadas desde la CPU, por una instrucci´on
de error o por una instrucci´on de interrupci´on.
Las instrucciones de error tambi´en se llaman
trampas. Las interrupciones generadas desde
la instrucci´on de interrupci´on son llamadas
interrupciones de software. DOS usa estas inte-
rrupciones para implementar su API (Interfaz
de programas de Aplicaci´on). Sistemas opera-
tivos m´as modernos (como Windows y Linux)
usan una interfaz basada en C. Muchos mani-
3. SISTEMAS OPERATIVOS, ABRIL 2013 3
puladores de interrupci´on devuelven el control
al programa interrumpido cuando ella culmina.
Ella restaura todos los registros con los mis-
mos valores que ten´ıan antes que ocurriera la
interrupci´on. As´ı el programa interrumpido se
ejecuta como si nada hubiese pasado (excepto
que se perdieron algunos ciclos de CPU) Las
trampas generalmente no retornan. A menudo
ellas acaban el programa.
2.1. Resultados obtenidos
Luego de haber revisado los lineamientos
de la programaci´on en lenguaje ensamblador
nos permiti´o realizar el programa solicitado del
cual paso a colocar el c´odigo fuente
section .data
m: db ”La x= ”;mensaje a mostrar
lm: equ $-m ;tama˜no del mensaje
x: db ”100”;se define el valor de la variable
xl: equ $-x ;se define el tama˜no de la variable
de: db ”9”;se define el valor de la variable 2
del: equ $-de;se define el tama˜no
se: db 10,0,0; generamos un salto de linea
sel: equ $-se; generamos el espacio
section .bss
result resw 2 ; creamos la variable resultado
section .text
global start: ;Punto de entrada para Linker
start:
mov eax,4;Especifica la llamada al sys write
mov ebx,1;Standar de Output
mov ecx,m;se pasa la direcion del mensaje
mov edx,lm;Se pasa la longitud del mensaje
int 80h;invoca la interrupcion 80h
mov eax,4;Especifica la llamada al sys write
mov ebx,1;Standar de Output
mov ecx,x;se pasa la direcion del mensaje
mov edx,xl;Se pasa la longitud del mensaje
int 80h;invoca la interrupcion 80h
mov eax,4;Especifica la llamada al sys write
mov ebx,1;Standar de Output
mov ecx,se;se pasa la direcion del mensaje
mov edx,sel;Se pasa la longitud del mensaje
int 80h;invoca la interrupcion 80h
mov eax,[m];pasamos m a un registro
mov ebx,[x];pasamos x a un registro
sub eax,’0’;transforma m de String a Entero
sub ebx,’0’;transforma x de String a Entero
add eax,ebx;Sumamos los dos valores
add eax,’0’;transforma de entero a string
mov [result],eax;almacenamos en result
mov eax,4;Especifica la llamada al sys write
mov ebx,1;Standar de Output
mov ecx,result;Se imprime resultado
mov edx,1;Standar de Output
int 80h;invoca la interrupcion 80h
mov eax,4;Especifica la llamada al sys write
mov ebx,1;Standar de Output
mov ecx,se;se pasa la direcion del mensaje
mov edx,sel;Se pasa la longitud del mensaje
int 80h;invoca la interrupcion 80h
mov eax,1;Standar de Output
mov ebx,0; se especifica el codigo de salida
int 80h;invoca la interrupcion 80h
2.2. Conclusiones
El c´odigo fuente puede ser en algunos
casos de menor tama˜no y complejidad que
el lenguaje de alto nivel
El lenguaje ensamblador nos permite in-
teractuar de manera directa a las carac-
ter´ısticas del sistema lo que puede ser
complicado de lograr con los lenguaje s
de alto nivel
La programaci´on en ensamblador nos per-
mite entender de mejor manera la forma
en la que trabaja el procesador
La programaci´on en ensamblador nos per-
mite entender como trabajan los compila-
dores y lenguajes de alto nivel
REFERENCIAS
[1] SivaramaP.Dandamudi Guide to Assembly Language
Programmingin Linux , USA Springer-Verlag Berlin
Heidelberg 2005
[2] Reiley Jeyapaul · Aviral Shrivastava, Assembly Lan-
guage Step-by-Step: Programming with Linux , USA
ACM 2009