Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
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.
La ejecucin de un programa en esta arquitectura requiere de tres segmentos (partes de la memoria) : Segmento de cdigo
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.
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
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