Sei sulla pagina 1di 15

Organizacin del Procesador 2011

Introduccin a NASM

Pablo Ponzio

Motivacin
En la actualidad es inusual encontrar programas escritos ntegramente en lenguaje assembler. Por su facilidad de uso, y portabilidad de los programas desarrollados, se utilizan lenguajes de programacin de alto nivel.

Motivacin
Por qu necesitamos aprender Assembler?

En ciertas ocasiones se puede escribir cdigo ms rpido y ms pequeo que el generado por un compilador a partir de un programa de alto nivel. Para ciertas plataformas los lenguajes de alto nivel son ineficientes, debido a las restricciones del hardware. Ej: Sistemas embebidos. Permite acceder directamente al hardware. Ej: Sistemas operativos. Ayuda a comprender como funcionan internamente las computadoras internamente. Lo usual es programar en assembler slo lo estrictamente necesario.

Compilacin
Cmo se obtiene cdigo mquina a partir de cdigo C?
File1.c File2.c File3.c

GCC
File1.o

GCC
File2.o

GCC
File3.o Libreras

Linker
Ejecutable

Compilacin
Podemos combinar mdulos escritos en varios lenguajes:
File1.c File2.c File3.asm

GCC
File1.o

GCC
File2.o

NASM
File3.o Libreras

Linker
Ejecutable

Arquitectura Intel 80x86


Instrucciones de longitud variable con hasta dos operandos. A lo sumo uno de los operandos puede ser una direccin de memoria.

Los operandos pueden ser de 1, 2 o 4 bytes.

Registros:
_ De propsito general (32 bits): EAX, EBX, ECX, EDX.

EAX:

AH (8b)

AL (8b)

AX (16b)

_ Pointer registers (32 bits): ESP, EBP, EIP. _ Registros ndice (para manipulacin de strings, 32 bits): ESI, EDI. _ Registros de segmentos (16 bits): CS, DS, SS, ES, DS, FS.

Arquitectura Intel 80x86


Modos de direccionamiento: Inmediato, Directo, Indirecto, Indexado, etc La memoria est direccionada por bytes. Unidades de memoria: word: 2 bytes.

double word: 4 bytes. quad word: 8 bytes. paragraph: 16 bytes.

La ejecucin de un programa en esta arquitectura requiere de tres segmentos (partes de la memoria) : Segmento de cdigo

Segmento de datos Segmento de pila (Stack segment)

El sistema operativo mantiene tablas con informacin de los procesos en ejecucin, y es el encargado de cargar (descargar) segmentos en (de) memoria segn se requiera.

Esquema de un programa NASM


segment.data ; almacena datos inicializados segment.bss ; espacio para datos no inicializados segment.text ; cdigo del programa

Directivas NASM
Permiten instruir al assembler a que realice alguna operacin. No son parte del cdigo mquina. NASM preprocesa el cdigo fuente y traduce las directivas a cdigo mquina.

Directivas NASM
Ejemplos: Para incluir archivos: %include"file.asm" Para definir constantes: %defineSIZE100 moveax,SIZE
Unidad byte word double word quad word ten bytes Letra B W D Q T Size 1 2 4 8 10

Para reservar memoria: dX : Reserva X bits (siendo X una letra de la tabla). Permite inicializar los datos. Ejemplos: L1db0 ; byte con label L1 inicializado en 0 L2db"w","o","r","d",0 ; define el string C "word" (5 bytes) L3dbword,0 ; idem anterior L4times100db0;reserva espacio para 100 numeros inicializados en 0 resX : Reserva X bits (siendo X una letra de la tabla). No inicializa el espacio reservado. Ejemplo: L5resb100 ; 100 bytes no inicializados

Ejemplos NASM
Ejemplo 1: Sumar dos nmeros con signo.
segment.data dato1dd1 dato2dd32766 segment.bss resultadoresd1 segment.text asm_main: moveax,[dato1] addeax,[dato2] mov[resultado],eax

Ejemplos NASM
Ejemplo 2: Sumar los elementos de un arreglo
segment.data arraydw1,2,3,4,5,6,7,8,9,10 segment.bss sumresw1 segment.text asm_main: movedx,array movebx,0 ; indice movcx,0 ; acumulador while_loop: moveax,ebx cmpeax,10 jgeend_while addcx,[edx] addedx,2 ; arreglo de words incebx jmpwhile_loop end_while: mov[sum],cx

Invocacin de programas NASM desde C


Para invocar programas NASM vamos utilizar el siguiente programa C:
intmain() { intret_status; ret_status=asm_main(); returnret_status; }

Invocacin de programas NASM desde C


Ventajas: El programa C se encarga de inicializar los segmentos para que el cdigo assembler se pueda ejecutar correctamente. Las libreras C estn disponibles para usar en el programa assembler. Aprender a combinar mdulos assembler con mdulos escritos en lenguajes de programacin de alto nivel

Compilacin en Linux
Comandos
Generamos el archivo objeto con Nasm. nasmfelfprog.asm Generamos el archivo ejecutable, compilando con gcc y linkeando el archivo objeto generado. gccoexecdriver.cprog.o Ejecutamos ./exec

Potrebbero piacerti anche