Your SlideShare is downloading. ×
NASM
NASM
NASM
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

NASM

328

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
328
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. SISTEMAS OPERATIVOS, ABRIL 2013 1programacion en lenguaje ensamblador usandoNASMAlexander PinchaoFacultad de Ingenier´ıa en SistemasEscuela Polit´ecnica Nacionalalexander.pinchao@gmail.comResumen—Creaci´on 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 impresi´on ya que estees un m´etodo m´as f´acil de realizar la presentaci´on de los valores generadosIndex Terms— nasm, ensamblador, interrupcion.!1. INTRODUCCI ´ONCAda variante de procesador posee su pro-pio lenguaje m´aquina, el cual invarian-temente reconoce las instrucciones en formade n´umeros y los almacena en la memoria,cada operaci´on posee su propio c´odigo llamadoupcode. Las instrucciones pueden variar de ta-ma˜no, el upcode se encuentra invariantementeal inicio de cada instrucci´on, adem´as del up-code las instrucciones mayoritariamente suelenllevar adem´as datos (direcciones, constantes ovariables), que van a ser usados por la instruc-ci´on. Hay que tener en cuenta que programaren lenguaje de maquina es muy complicadopara 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 , parasaltar esta limitaci´on se desarroll´o 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 instrucci´onrepresentara una operaci´on que realizara la ma-quina en este caso sumar ebx a eax. A simplevista se puede ver que esto es m´as f´acil deentender y ser´ıa mucho m´as f´acil de encontrarpara una depuraci´on que 03 C3 la cual es laforma de la instrucci´on en lenguaje puramentem´aquina.2. METODOLOG´IAEl lenguaje ensamblador en su estructuram´as b´asica se puede representar en forma dec´odigos nem´onicos, los m´as 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 m´aquina, es decir como un com-pilador en lenguaje de alto nivel, pero muchomas sencillo ya que en ensamblador una ins-trucci´on es una instrucci´on en lenguaje maqui-na con seguridad, mientras que en lenguajede alto nivel una instrucci´on puede necesitarmuchas instrucciones en lenguajes maquina,adem´as de que los lenguajes de alto nivel soniguales sin importar que tipo de maquina seuse, mientras que los lenguajes de ensamblador
  • 2. SISTEMAS OPERATIVOS, ABRIL 2013 2var´ı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: c´odigo,operando. Losoperando puede ser de distintos tipos:1. Registros.- Se refieren directamente a losregistros de la UCP2. Memoria.- Son los datos almacenados enmemoria, teniendo en cuenta que la di-recci´on de los datos puede estar descritaen una instrucci´on o calculada usandolos valores de registros, ya que estas sonsimples desplazamientos relativos al co-mienzo de un segmento3. Inmediato.- Son valores fijos que est´andentro del mismo segmento de c´odigo,es decir se valores que est´an en ”section.text”no en ”section .data”4. Impl´ıcito.- Es decir aquellos que no apa-recen de forma visible pero interact´uancon 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 instrucci´on 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 deasignaci´on visto desde el punto de vista de loslenguajes de alto nivel, la estructura base pararealizar esta operaci´on 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 restricci´on quelos dos operandos no deben de ser operandosde memoria, adem´as de que los operando de-ben tener tama˜nos 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 lenguajem´aquina, y estas se usan para comunicarle alensamblador que realice alguna acci´on, estas setraducen luego a c´odigo maquina, sus usos mascomunes son:1. Definir constantes2. Definir la memoria para almacenar datosen ella.3. Agrupar la memoria en segmentos.4. Incluir codigo fuente condicionalmente5. Incluir otros archivosLas 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 cualtrabajarAlgunas veces el flujo ordinario de un pro-grama debe ser interrumpido para procesareventos que requieren una respuesta r´apida. Elhardware de un computador provee un me-canismo llamado interrupci´on para manipularestos eventos. Por ejemplo cuando se mueve elrat´on la interrupci´on de hardware del rat´on esel programa actual para manejar el movimientodel rat´on (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 interrupci´on. A cada tipo deinterrupci´on se le asigna un n´umero entero.En el comienzo de la memoria f´ısica una tablade vectores de interrupci´on que contiene la di-recci´on del segmento de los manipuladores dela interrupci´on. El n´umero de la interrupci´ones esencialmente un ´ındice en esta tabla. Lasinterrupciones externas son levantadas desdeel exterior de la CPU (el rat´on es un ejemplode este tipo de interrupci´on). 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 instrucci´onde error o por una instrucci´on de interrupci´on.Las instrucciones de error tambi´en se llamantrampas. Las interrupciones generadas desdela instrucci´on de interrupci´on son llamadasinterrupciones de software. DOS usa estas inte-rrupciones para implementar su API (Interfazde programas de Aplicaci´on). Sistemas opera-tivos m´as modernos (como Windows y Linux)usan una interfaz basada en C. Muchos mani-
  • 3. SISTEMAS OPERATIVOS, ABRIL 2013 3puladores de interrupci´on devuelven el controlal programa interrumpido cuando ella culmina.Ella restaura todos los registros con los mis-mos valores que ten´ıan antes que ocurriera lainterrupci´on. 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 lineamientosde la programaci´on en lenguaje ensambladornos permiti´o realizar el programa solicitado delcual paso a colocar el c´odigo fuentesection .datam: db ”La x= ”;mensaje a mostrarlm: equ $-m ;tama˜no del mensajex: db ”100”;se define el valor de la variablexl: equ $-x ;se define el tama˜no de la variablede: db ”9”;se define el valor de la variable 2del: equ $-de;se define el tama˜nose: 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 valoresadd 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 80h2.2. ConclusionesEl c´odigo fuente puede ser en algunoscasos de menor tama˜no 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 programaci´on en ensamblador nos per-mite entender de mejor manera la formaen la que trabaja el procesadorLa programaci´on en ensamblador nos per-mite entender como trabajan los compila-dores y lenguajes de alto nivelREFERENCIAS[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

×