Está en la página 1de 4

PRCTICA 01

EL ENTORNO EN LINUX Y LA ESTRUCTURA DE UN PROGRAMA EN ENSAMBLADOR


PROPOSITOS
Esta primera prctica nos va a servir para tres propsitos, el primero para familiarizarnos con la interface
grfica de usuario GNOME (GNU Network Object Model Environment), y con el shell de Linux (interprete de
comandos) que en nuestro caso ser bash (Bourne Again SHell).
El segundo para empezar a utilizar el ensamblador NASM y el GCC (GNU Compiler Collection), que aunque es
una coleccin de compiladores como C, C++, Fortran, etctera, utilizaremos (por las ventajas que representa
conocerlo) como enlazador (linker) de nuestro cdigo objeto.
El tercero para conocer la estructura de un sencillo programa en ensamblador de 32 bits escrito en NASM, por
lo tanto con la sintaxis de Intel (posteriormente aprenderemos la sintaxis AT&T).
PRCTICA
Una vez dentro de Ubuntu abre la consola (la terminal, Ctrl+Alt+T) y despus del prompt, escribe nasm y da
Enter. El bash te regresar un mensaje que dice El programa <<nasm>> no est instalado. Instlalo
escribiendo:
sudo apt-get install nasm
Al escribir la orden, te pedir la contrasea del usuario, la proporcionamos y se inicia la instalacin.
Despus de unos segundos nos regresa al prompt xxx@xxx:~$ donde escribimos
nasm h
Para ver la ayuda que proporciona.
Ya estamos listos para utilizarlo!
Para escribir nuestro programa en ensamblador vamos a utilizar un sencillo editor de texto llamado gedit,
cabe sealar que hay muchos editores de texto (para todos los gustos) desde el sencillo e intuitivo gedit hasta
editores poderosos y ms complejos (utilizados por los programadores de Linux) como el vim.
Dentro de la carpeta de Documentos creamos una carpeta Fuentes y dentro de ella iremos creando carpetas
para cada una de las prcticas. Para esta primera crearemos una carpeta llamada Ejem01. Dentro de esta
carpeta guardaremos nuestro cdigo fuente y los archivos generados en el proceso de construccin del archivo
binario. Procedemos as:

Profr. Rafael Silva Garca

Con el Nautilus (el manejador grfico de archivos) creamos las carpetas, o desde la consola (terminal),
escribiendo las siguientes rdenes (desde Home, xxxxx@yyyy:~$)
Creamos la carpeta Fuentes dentro de Documentos con:
mkdir Documentos/Fuentes
Creamos la carpeta Ejem01 dentro de la carpeta Fuentes:
mkdir Documentos/Fuentes/Ejem01
Nos cambiamos a la carpeta Ejem01:
cd Documentos/Fuentes/Ejem01
Ejecutamos el gedit desde la consola
gedit ejem01.asm
(Tambin podemos abrir el gEdit desde el botn de bsqueda (el primero de la cinta vertical de opciones del
escritorio) y asegurarnos, al guardarlo, del nombre y ubicacin correcta del archivo.

Primer Programa De Ejemplo (ejem01.asm)


msg:
len:

SECTION .data
; data section
db "Hola Mundo!",10 ; la cadena a imprimir, 10=Line Feed
equ $-msg
; "$" significa "aqu"
; len es un valor, no una direccin
SECTION .text
global main

; code section
; ponemos una etiqueta para el enlazador
; entrada estndar para el gcc

mov
mov
mov
mov
int

edx,len
ecx,msg
ebx,1
eax,4
0x80

;
;
;
;
;

mov
mov
int

ebx,0
eax,1
0x80

; cdigo de salida, 0=normal


; commando de salida del kernel
; llamada a la int 80 hex, llama al kernel

main:

arg3, largo de la cadena a imprimir


arg2, punter a la cadena
arg1, donde escribir, en el monitor
escribir el commando sysout a la int 80 hex
llamada a la interrupcin 80 hex, llama al kernel

Un programa en lenguaje ensamblador consiste de sentencias que pueden ser instrucciones o directivas para el
ensamblador. Por ejemplo:
SECTION .data es una directiva que le dice al ensamblador donde inicia la seccin de datos.

Profr. Rafael Silva Garca

En cambio que MOV eax,4 es una instruccin que ordena al CPU poner un valor de 4 dentro del registro eax,
el cual es un registro de 32 bits.
Todo lo que sigue a un punto y coma es un comentario y es ignorado por el ensamblador.
Nuestro programa de ejemplo consiste de dos partes, la seccin de datos y la seccin de texto. Habr
programas que tengan ms de dos secciones. Cada seccin empieza con la directiva .SECTION, despus un
punto y el nombre de la seccin.
La seccin de datos, como su nombre lo indica la utilizamos para escribir los datos y la seccin de texto para
escribir las instrucciones que utilizarn esos datos.
Las variables se declaran en el segmento de datos, a cada una se le asigna un espacio en la memoria y puede
ser inicializada. Por ejemplo msg:
db "Hola Mundo!" define una variable llamada msg de tipo Data
Byte y se inicializa con la cadena Hola Mundo!, que tiene una longitud de 11 bytes.
Las instrucciones del programa se ubican en la seccin de texto y deben finalizarse con instrucciones para salir
del kernel y regresar al Shell de Linux, lo que hacen las tres ltimas lneas del programa.
El programa lo nico que hace es desplegar en el monitor la cadena Hola Mundo! y pasar el cursor a la lnea
siguiente.
Antes que el programa pueda ser ejecutado debe ser ensamblado (generamos el archivo objeto y
opcionalmente un archivo de listado) y despus enlazado (generamos el archivo binario, el ejecutable).
Una vez guardado con el nombre ejem01.asm (o el que hayas elegido), lo ensamblamos con el NASM as:
nasm -f elf -l ejem01.lst ejem01.asm[1]
Si no tuvimos errores, listamos los archivos del directorio (con ls) y veremos un archivo con el mismo nombre
que nuestro fuente pero con extensin <<.o>>, ese es el archivo objeto generado por el NASM, tambin
podemos ver un archivo con extensin <<.lst>> en caso de generar opcionalmente el archivo de listado como
en este caso. Este ltimo podemos abrirlo con un editor de texto para conocer ms detalles del objeto.
Ahora necesitamos enlazar (linkear) el archivo objeto con las libreras necesarias para obtener el archivo
binario (el ejecutable), lo que podemos hacer con la siguiente orden:
gcc -m32 -o ejem01 ejem01.o[2]
Finalmente ejecutamos en la consola (terminal) nuestro archivo binario escribiendo:
./ejem01
Y veremos la cadena Hola Mundo! desplegada en pantalla.

Profr. Rafael Silva Garca

ACTIVIDADES
1. Visita el sitio de NASM (Netwide Assembler) en http://www.nasm.us, ah encontrars en la seccin de
documentos un manual en formato PDF y html.
2. Visita el sitio de GCC en https://gcc.gnu.org/
3. Lee el artculo de Intel Cmo mejorar el rendimiento del GCC para x86 en
https://software.intel.com/es-es/blogs/2012/09/26/gcc-x86-performance-hints
4. Busca en Wikipedia las biografas de los mexicanos Miguel de Icaza y Federico Mena.
5. Otras actividades sobre esta prctica quedan pendientes.
NOTAS.
[1] y [2] Las rdenes para ensamblar y enlazar son diferentes dependiendo de la arquitectura de la mquina
que se est utilizando y de la arquitectura para la que estemos escribiendo el programa. Las posibles
combinaciones resultantes de esto pueden ser:
Programa escrito para una arquitectura de Arquitectura de la mquina utilizada
32 bits

32 bits

32 bits

64 bits

64 bits

64 bits

Menos frecuente, pero puede darse el caso por razones de enseanza, es escribir cdigo de 16 bits en
mquinas de 32 bits y en mquinas de 64 bits. Las mquinas de 16 bits ya prcticamente estn extintas

Profr. Rafael Silva Garca

También podría gustarte