NASM

3
SISTEMAS OPERATIVOS, ABRIL 2013 1 programacion en lenguaje ensamblador usando NASM Alexander Pinchao Facultad de Ingenier´ ıa en Sistemas Escuela Polit´ ecnica Nacional [email protected] ResumenCreaci ´ 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 Termsnasm, ensamblador, interrupcion. 1. I NTRODUCCI ´ ON C Ada 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 aquina. 2. METODOLOG´ IA El lenguaje ensamblador en su estructura as b´ asica se puede representar en forma de 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

Transcript of NASM

Page 1: NASM

SISTEMAS OPERATIVOS, ABRIL 2013 1

programacion en lenguaje ensamblador usandoNASM

Alexander PinchaoFacultad de Ingenierıa en Sistemas

Escuela Politecnica [email protected]

Resumen—Creacion de un programa en lenguaje ensamblador usando el ensamblador de Linux (nasm), que definauna variable, asigne el valor de 100 a dicha variable, posteriormente sume 9 a la variable e imprima. Laimportancia de este trabajo radica en la posibilidad de manipular un valor en memoria para experimentar laforma de trabajo de la upc con la memoria, y usar las interrupciones para realizar la impresion ya que estees un metodo mas facil de realizar la presentacion de los valores generados

Index Terms— nasm, ensamblador, interrupcion.

F

1. INTRODUCCION

CAda variante de procesador posee su pro-pio lenguaje maquina, el cual invarian-

temente reconoce las instrucciones en formade numeros y los almacena en la memoria,cada operacion posee su propio codigo llamadoupcode. Las instrucciones pueden variar de ta-mano, el upcode se encuentra invariantementeal inicio de cada instruccion, ademas del up-code las instrucciones mayoritariamente suelenllevar ademas datos (direcciones, constantes ovariables), que van a ser usados por la instruc-cion. Hay que tener en cuenta que programaren lenguaje de maquina es muy complicadopara realizarse directamente ya que las instruc-ciones se encuentran codificadas numericamen-te y esto resulta sumamente tedioso y compli-cado de interpretar para los humanos , parasaltar esta limitacion se desarrollo el lenguajeensamblador el cual permite facilitar el traba-jo al desarrollador de software, un programaescrito en lenguaje ensamblador esta escrito yalmacenado en forma textual al igual que loslenguajes de alto nivel, el cual se maneja coninstrucciones de forma muy sencilla como porejemplo: sum eax,ebx Es decir una instruccion

representara una operacion que realizara la ma-quina en este caso sumar ebx a eax. A simplevista se puede ver que esto es mas facil deentender y serıa mucho mas facil de encontrarpara una depuracion que 03 C3 la cual es laforma de la instruccion en lenguaje puramentemaquina.

2. METODOLOGIA

El lenguaje ensamblador en su estructuramas basica se puede representar en forma decodigos nemonicos, los mas usados son: sum,sub, mul, div, int ya que como se sabe lacomputadora solo sabe sumar, restar, multipli-car y dividir, estas instrucciones son leıdas porel programa ensamblador y las transforma alenguaje de maquina, es decir como un com-pilador en lenguaje de alto nivel, pero muchomas sencillo ya que en ensamblador una ins-truccion es una instruccion en lenguaje maqui-na con seguridad, mientras que en lenguajede alto nivel una instruccion puede necesitarmuchas instrucciones en lenguajes maquina,ademas de que los lenguajes de alto nivel soniguales sin importar que tipo de maquina seuse, mientras que los lenguajes de ensamblador

Page 2: NASM

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) deBorland. En lenguaje ensamblador la estructurade las instrucciones es: codigo,operando. Losoperando puede ser de distintos tipos:

1. Registros.- Se refieren directamente a losregistros de la UCP

2. Memoria.- Son los datos almacenados enmemoria, teniendo en cuenta que la di-reccion de los datos puede estar descritaen una instruccion o calculada usandolos valores de registros, ya que estas sonsimples desplazamientos relativos al co-mienzo de un segmento

3. Inmediato.- Son valores fijos que estandentro del mismo segmento de codigo,es decir se valores que estan en ”section.text”no en ”section .data”

4. Implıcito.- Es decir aquellos que no apa-recen de forma visible pero interactuancon los registros o la memoria como esel caso de los decrementos, el cual restauna al valor de un registro o a un valoren memoria.

Dejando de lado por un momento de los opera-dores, podemos decir que la instruccion esen-cial en el lenguaje ensamblador es: mov, ya queesta traslada los valores de un operando a otroes decir realiza las funciones de un operador deasignacion visto desde el punto de vista de loslenguajes de alto nivel, la estructura base pararealizar esta operacion es por ejemplo: moveax,ebx en este fragmento de programa se aasignado a eax el valor que esta dentro de ebx.Pero este operando presenta la restriccion quelos dos operandos no deben de ser operandosde memoria, ademas de que los operando de-ben tener tamanos iguales. Lo cual nos planteala duda que esta bien y que esta mal, estose resuelve con el uso de las directivas delprograma ensamblador, las directivas son pro-pias del lenguaje ensamblador no del lenguajemaquina, y estas se usan para comunicarle alensamblador que realice alguna accion, estas setraducen luego a codigo maquina, sus usos mascomunes son:

1. Definir constantes

2. Definir la memoria para almacenar datosen ella.

3. Agrupar la memoria en segmentos.4. Incluir codigo fuente condicionalmente5. Incluir otros archivos

Las directivas existentes son:Directiva equ.- esta directiva se usa paradefinir un sımbolo. Los sımbolos son cons-tantes que poseen un nombre que puedeser usado dentro de la estructura del pro-grama ensambladorDirectiva %define.- es similar al define enC, ya que genera un macro con el cualtrabajar

Algunas veces el flujo ordinario de un pro-grama debe ser interrumpido para procesareventos que requieren una respuesta rapida. Elhardware de un computador provee un me-canismo llamado interrupcion para manipularestos eventos. Por ejemplo cuando se mueve elraton la interrupcion de hardware del raton esel programa actual para manejar el movimientodel raton (para mover el cursor del mouse,etc) Las interrupciones hacen que el control sepase a un manipulador de interrupciones. Losmanipuladores de interrupciones son rutinasque procesan la interrupcion. A cada tipo deinterrupcion se le asigna un numero entero.En el comienzo de la memoria fısica una tablade vectores de interrupcion que contiene la di-reccion del segmento de los manipuladores dela interrupcion. El numero de la interrupciones esencialmente un ındice en esta tabla. Lasinterrupciones externas son levantadas desdeel exterior de la CPU (el raton es un ejemplode este tipo de interrupcion). Muchos disposi-tivos de E/S levantan interrupciones (teclado,temporizador, disco duro CD ROM y tarjetasde sonido) Las interrupciones internas son le-vantadas desde la CPU, por una instruccionde error o por una instruccion de interrupcion.Las instrucciones de error tambien se llamantrampas. Las interrupciones generadas desdela instruccion de interrupcion son llamadasinterrupciones de software. DOS usa estas inte-rrupciones para implementar su API (Interfazde programas de Aplicacion). Sistemas opera-tivos mas modernos (como Windows y Linux)usan una interfaz basada en C. Muchos mani-

Page 3: NASM

SISTEMAS OPERATIVOS, ABRIL 2013 3

puladores de interrupcion devuelven el controlal programa interrumpido cuando ella culmina.Ella restaura todos los registros con los mis-mos valores que tenıan antes que ocurriera lainterrupcion. Ası el programa interrumpido seejecuta como si nada hubiese pasado (exceptoque se perdieron algunos ciclos de CPU) Lastrampas generalmente no retornan. A menudoellas acaban el programa.

2.1. Resultados obtenidosLuego de haber revisado los lineamientos

de la programacion en lenguaje ensambladornos permitio realizar el programa solicitado delcual paso a colocar el codigo fuente

section .datam: db ”La x= ”;mensaje a mostrarlm: equ $-m ;tamano del mensajex: db ”100”;se define el valor de la variablexl: equ $-x ;se define el tamano de la variablede: db ”9”;se define el valor de la variable 2del: equ $-de;se define el tamanose: db 10,0,0; generamos un salto de lineasel: equ $-se; generamos el espaciosection .bssresult resw 2 ; creamos la variable resultadosection .textglobal start: ;Punto de entrada para Linkerstart:

mov eax,4;Especifica la llamada al sys writemov ebx,1;Standar de Outputmov ecx,m;se pasa la direcion del mensajemov edx,lm;Se pasa la longitud del mensajeint 80h;invoca la interrupcion 80hmov eax,4;Especifica la llamada al sys writemov ebx,1;Standar de Outputmov ecx,x;se pasa la direcion del mensajemov edx,xl;Se pasa la longitud del mensajeint 80h;invoca la interrupcion 80hmov eax,4;Especifica la llamada al sys writemov ebx,1;Standar de Outputmov ecx,se;se pasa la direcion del mensajemov edx,sel;Se pasa la longitud del mensajeint 80h;invoca la interrupcion 80hmov eax,[m];pasamos m a un registromov ebx,[x];pasamos x a un registrosub eax,’0’;transforma m de String a Enterosub ebx,’0’;transforma x de String a Enteroadd eax,ebx;Sumamos los dos valores

add eax,’0’;transforma de entero a stringmov [result],eax;almacenamos en resultmov eax,4;Especifica la llamada al sys writemov ebx,1;Standar de Outputmov ecx,result;Se imprime resultadomov edx,1;Standar de Outputint 80h;invoca la interrupcion 80hmov eax,4;Especifica la llamada al sys writemov ebx,1;Standar de Outputmov ecx,se;se pasa la direcion del mensajemov edx,sel;Se pasa la longitud del mensajeint 80h;invoca la interrupcion 80hmov eax,1;Standar de Outputmov ebx,0; se especifica el codigo de salidaint 80h;invoca la interrupcion 80h

2.2. ConclusionesEl codigo fuente puede ser en algunoscasos de menor tamano y complejidad queel lenguaje de alto nivelEl lenguaje ensamblador nos permite in-teractuar de manera directa a las carac-terısticas del sistema lo que puede sercomplicado de lograr con los lenguaje sde alto nivelLa programacion en ensamblador nos per-mite entender de mejor manera la formaen la que trabaja el procesadorLa programacion en ensamblador nos per-mite entender como trabajan los compila-dores y lenguajes de alto nivel

REFERENCIAS

[1] SivaramaP.Dandamudi Guide to Assembly LanguageProgrammingin Linux , USA Springer-Verlag BerlinHeidelberg 2005

[2] Reiley Jeyapaul · Aviral Shrivastava, Assembly Lan-guage Step-by-Step: Programming with Linux , USAACM 2009