Sunteți pe pagina 1din 6

8.

CAPITULO VIII: ASSEMBLER Y GNU/LINUX


8.1. INTRODUCCIN
Assembler en Gnu/Linux, son elementos que se introdujo lgicamente a partir del ingreso de este sistema
operativo10.
Assembler en este Sistema Operativo depender mucho del tipo de Computador que estemos utilizando y
la arquitectura empleada. No es lo mismo utilizar un Assembler para arquitectura 80x86 en procesadores
Intel que utilizar Assembler en arquitecturas Sparc por ejemplo.
Cada procesador manufacturado, publica detalladamente las instrucciones implementadas en sus chips, los
cuales lgicamente son diferentes a otros tantos procesadores.
Para este capitulo solo se tomara, procesadores Intel y compatibles a este procesador.
8.2. HERRAMIENTAS
Para crear programas en assembler, es necesario el uso de herramientas que conviertan el cdigo fuente
creado a las instrucciones del procesador.
Desafortunadamente cada herramienta utiliza o puede utilizar diferentes formatos para los elementos de un
programa en Assembler (Mnemnicos, secciones de segmento y directivas), aunque hay que hacer notar
que los elementos bsicos (ejemplo: registros) son los mismos.
La gran diferencia entre estas herramientas esta ms en la utilizacin de las directivas utilizadas y son
nicas para cada herramienta que ensambla el cdigo fuente.
Para construir un programa en ensamblador son necesarios los siguientes elementos:

Un Editor
Un Ensamblador
Un Enlazador
Un Depurador

8.2.1. EDITORES
Aunque en primera instancia se puede hablar del editor vi, para poder elaborar, editar programas
sencillos en ensamblador, este no es viable para programas grandes, pues el uso de este editor no es
tan sencillo, tampoco tan interactivo como ya los programadores estn acostumbrados.
Por otro lado, existen muchos herramientas de desarrollo, lgicamente editor integrado, que estn
disponibles, (comerciales o libres), al final es el programador que decide que herramienta utilizar al
respecto.

10

Aunque ya existia en ambientes UNIX

SIS-330 :: Programacin en Assembler

69

Una herramienta (mas que herramienta es una Distribucin GNU/Linux), bajo licencia GNU, es el
denominado MEPIS2, que es un Completo Entorno de Desarrollo y el cual incluye desde un editor,
ensamblador y enlazador.
8.2.2. ENSAMBLADORES
NASM: Netwide Assembler (NASM3), fue originalmente desarrollado como un paquete comercial
para entornos UNIX, pero recientemente los desarrolladores han liberado este producto como un
software Open-Source, para ambos entornos: UNIX y Windows.
Este ensamblador es completamente compatible con el conjunto de instrucciones Intel y pueden
producir ejecutables en UNIX, 16-bit MSDOS y 32-bit Windows
HLA: High Level Assembler (HLA4), es la creacin del Profesor Randall Hyde. Este ensamblador
crea aplicaciones DOS, Windows y Linux para el conjunto de instrucciones Intel.
El propsito primario con el que se creo HLA era el de enseanza a los programadores principiantes.
Este producto incorpora muchas directivas para ayudar a los programadores en la transicin o cambio
de lenguajes de alto nivel a el lenguaje assembler.
GAS: El proyecto GNU de la Free Software Foundations ha desarrollado este producto con muchos
paquetes de software libres, puede ejecutarse en entornos UNIX.
GNU Assembler, denominado GAS5, es el mas popular ensamblador para UNIX, este producto es
multiplataforma, pues este ensamblador es la excepcin a la norma de que los ensambladores estan
muy unidos en cuanto a la arquitectura del ordenador y puede ser operador en muchos diferentes
procesadores.
Obviamente el producto debe conocer la plataforma utilizada y crea el cdigo de instrucciones para esa
plataforma. Usualmente GAS, es capaz de detectar automticamente la plataforma subyacente y crear
las instrucciones adecuadas a esta plataforma sin intervencin de un operador.
Plataformas de Hardware soportadas:

VAX
AMD 29K
Hitachi H8/300
Intel 80960
M680x0
SPARC
Intel 80x86
Z8000
MIPS

http://www.mepis.org
http://nasm.sourceforge.net
4 http://webster.cs.ucr.edu
5 Esta incluido en muchas distribuciones Linux, en el paquete binutils
SIS-330 :: Programacin en Assembler
3

70

Muchas sistemas tipo *NIX, incluyen este ensamblador instalado como programa en el Sistema
Operativo.
Este producto no esta incluido como productos separado, sino mas bien dentro de una seria de
herramientas de desarrollo, en este caso en el paquete binutils.
En caso de que su distribucin LINUX, no incluya el paquete, se puede bajar el mismo desde
http://sources.redhat.com/binutils o ftp://ftp.gnu.org/gnu/binutils/.
La utilizacin de este programa, es mediante la lnea de comandos del terminal en cualquier
distribucin *NIX.
$

as [-a[cdhlns][=file]] [-D] [--defsym sym=val]


[-f] [--gstabs] [--gstabs+] [--gdwarf2] [--help]
[-I dir] [-J] [-K] [-L]
[--listing-lhs-width=NUM] [--listing-lhs-width2=NUM]
[--listing-rhs-width=NUM] [--listing-cont-lines=NUM]
[--keep-locals] [-o objfile] [-R] [--statistics] [-v]
[-version] [--version] [-W] [--warn] [--fatal-warnings]
[-w] [-x] [-Z] [--target-help] [target-options]
[--|files ...]

Ejemplo:
$ as -o prueba.o prueba.s
8.2.3. ENLAZADORES
El enlazador es utilizado para enlazar el cdigo objeto a un programa ejecutable, o librera.
Un enlazador que se puede utilizar es el enlazador que viene con GAS. El enlazador se denomina ld,
y viene tambin con el paquete binutils.
Se usa en la lnea de comandos del terminal.
ld [-o output] objfile...
[-Aarchitecture] [-b input-format] [-Bstatic]
[-Bdynamic] [-Bsymbolic] [-c commandfile] [--cref]
[-d|-dc|-dp]
[-defsym symbol=expression] [--demangle]
[--no-demangle] [-e entry] [-embedded-relocs] [-E]
[-export-dynamic] [-f name] [--auxiliary name]
[-F name] [--filter name] [-format input-format]
[-g] [-G size] [-h name] [-soname name] [--help]
[-i] [-lar] [-Lsearchdir] [-M] [-Map mapfile]
[-m emulation] [-n|-N] [-noinhibit-exec]
[-no-keep-memory] [-no-warn-mismatch] [-Olevel]
SIS-330 :: Programacin en Assembler

71

[-oformat output-format] [-R filename] [-relax]


[-r|-Ur] [-rpath directory] [-rpath-link directory]
[-S] [-s] [-shared] [-sort-common]
[-split-by-reloc count] [-split-by-file]
[-T commandfile]
[--section-start sectionname=sectionorg]
[-Ttext textorg] [-Tdata dataorg] [-Tbss bssorg]
[-t] [-u sym] [-V] [-v] [--verbose] [--version]
[-warn-common] [-warn-constructors]
[-warn-multiple-gp] [-warn-once]
[-warn-section-align] [--whole-archive]
[--no-whole-archive] [--wrap symbol] [-X] [-x]
$ ld o prueba prueba.o
$ ./prueba

8.3. ESTRUCTURA DE UN PROGRAMA PARA GNU/LINUX


Un programa en ensamblador consiste de secciones definidas, cada seccin lgicamente tiene un propsito
diferente, las tres secciones comnmente utilizadas son:

La Seccin data
La Seccin bss
La Seccin text

Las secciones data y bss son opcionales.


La seccin data, es la seccin donde se declara los datos con un valor inicial, estos datos son utilizados
como variables en el programaLa seccin bss, declara elementos de datos que son inicializados con el valor cero (0) o un valor nulo, y
estos elementos son utilizados como reas de buffer en los programas.
La seccin text es requerida en todos los programas assembler, y es donde estn los cdigos de
instruccin para la ejecucin del programa.
GAS, declara las secciones de la siguiente manera:
.section.data
.section.bss
.section.text

# seccion data
# seccion bss
# seccion text

La declaracin de la seccin bss, debera estar siempre antes de la seccin text, pero la seccin data puede
ser movido luego de la seccin text.
SIS-330 :: Programacin en Assembler

72

Una plantilla de un programa en GAS:


.section.data
< Inicializacin de los datos>
.section .bss
< Datos no inicializados >
.section .text
.globl _start
_start:
< Instrucciones>
La directiva .globl, declara una etiqueta de programa que pueda ser accesible desde programas externos,
tal como C.
8.4. UN PROGRAMA SIMPLE
Un ejemplo clsico en los lenguajes ensambladores, es el de poder determinar el tipo de procesador
utilizado en el computador:
La instruccin CPUID es utilizada para el ejemplo, esta instruccin utiliza un registro simple como
entrada. El registro EAX es utilizado para determinar que informacin es producida por la instruccin.
Dependiendo de la informacin producida acerca del procesador, los valores son colocados en los
registros EBX, ECX y EDX.
La siguiente tabla muestra las diferentes salidas producidas a partir de la instruccin CPUID:
EAX Valor
0
1
2
3
4
5
80000000h
80000001h
80000002h - 80000004h

Salida de CPUID
Cadena del Proveedor y la mxima opcin CPUID soportada
Tipo de Procesador, familia, modelo
Configuracin del cache del procesador
Nmero Serial del Procesador
Configuracin de cache (numero de hilos, ncleos y propiedades
fsicas)
Informacin de monitoreo
Cadena extendida del proveedor
Tipo de Procesador extendido, familia, modelo
Nombre extendido del procesador.

La instruccin CPUID, retorna el valor de la cadena del Vendedor en los registros EBX, EDX y ECX de
la siguiente forma:

EBX contiene los 4 bytes bajos de la cadena.


EDX contiene los 4 bytes del medio de la cadena.
ECX contiene los ltimos 4 bytes de la cadena.

SIS-330 :: Programacin en Assembler

73

# cpuid.s programa ejemplo para extraer el tipo de ID del Vendedor


.section .data
output:
.ascii El procesador del proveedor es xxxxxxxxxxxx\n
.section .text
.globl _start
_start:
movl $0, %eax
cpuid
movl $output, %edi
movl %ebx, 28(%edi)
movl %edx, 32(%edi)
movl %ecx, 36(%edi)
movl $4, %eax
movl $1, %ebx
movl $output, %ecx
movl $42, %edx
int $0x80
movl $1, %eax
movl $0, %ebx
int $0x80

Para ensamblar, enlazar y ejecutar el programa:


$ as -o cpuid.o cpuid.s
$ ld -o cpuid cpuid.o
$
$ ./cpuid
El procesador del proveedor es GenuineIntel
$

SIS-330 :: Programacin en Assembler

74

S-ar putea să vă placă și