jueves, 29 de marzo de 2012

Ensamblador

Tarea Intro

Ensamblador a Utilizar


GAS (GNU Assembler).-  es el ensamblador del proyecto GNUes usado para compilar Linux y otros sistemas operativos como el sistema operativo GNU.


Explicación del código que genera y utiliza el GNU Assembler.


Los registros que comunmente son utilizados en GNU Assembler, son los siguiente:


Como se muestra en la imagen, van los nombres generales que tienen los registros así como sus derivaciones dependiendo de la memoria que requiera.


Una vez definido lo anterior continuare con explicar las instrucciones que maneja el ensamblador y el significado de cada uno.


Indicadores
Descripción
.LC0, .LC1, .LC2Etiquetas creadas automáticamente por gcc, que comunmente almecenan los .string, los .text y los .globl main
.stringSe encarga de almacenar los caracteres dados en el código, por ejemplo lo que se escribe en el prinf de c. Todo los caracteres deben de estar encerrados entre comillas dobles (" ").


.text
Se encarga de definir la sección actual como ".text"
.globl main                               Declara las funciones requeridas como globales y por ende las etiquetas que vallan dentro de el. Cada símbolo es definido externamente o definido en el archivo de entrada y accesible en otros archivos.
.typeGuarda e indica los nombres de las funciones que existen en el código.


Algunas de las instrucciones de Assembler son (considere primeramente las que utilizare en mi código e incluí unas cuantas mas)


Instrucción
Descripción
Descripción mas Detallada
PUSH"Empuja" hacia la pila.Decrementa el puntero de la pila y después almacena el operando fuente en la cima de la pila.
MOVMueve información de una cadena a otra.Copia el segundo operando declarada (fuente) hacia el primer operando declarado (destino). Nota: Ambos operandos deben de ser del mismo tamaño.
ANDOperación lógica and.Se encarga de realizar la operación lógica AND con los dos operandos seleccionados, coloca el resultado en la ubicación del primer operando que se proporciona.
SUBReserva de Memoria.Reserva una cantidad de Memoria para un registro, al principio va la cantidad de memoria a reservar y después el registro de destino.


Sin embargo dos operandos de memoria NO pueden ser usados en una instrucción.
CALLLlama un procedimiento.Manda a llamar instrucciones o acciones que no están incluidas por default en el GNU Assembler.
LEA
(Load Effective Address)
Coloca la dirección especificada en el segundo operando en el registro del primeroCalcula la dirección efectiva del segundo operando (fuente) y la almacena en el primer operando (destino). El operando fuente es una dirección de memoria especificada con uno de los procesadores de modos de direccionamiento.
FLDS
(Floating-point LoaD to System register)
Transfiere al registro del sistemaEsta instrucción carga el contenido de un registro de punto flotante al registro del sistema.
FMULPMultiplicaMultiplica el primer parámetro por el segundo y almacena el resultado en el primero, coloca el registro en la pila.
FSTPLExtrae valoresEs usado para extraer  algún valor fuera de la pila.
LEAVEProcedimiento de salida de alto nivelLibera el espacio de pila reservado para el cuadro de pila.
JUMPSalto sin restriccionesNos permite pasar de etiqueta y etiqueta sin necesidad de que se cumpla alguna condición en especifico
je jne jz jg jge jl jleSaltos CondicionalesSe encargan de cambiar de una etiqueta a otra, pero dependiendo de la condición a la que obligada
RETRegresar del procedimiento.Transfiere el control del programa a una dirección de regreso localizada en la cima de la pila. La dirección es comúnmente puesta en la pila por medio de una instrucción CALL, y la instrucción "return" es hecha a la instucción que le sigue a la instrucción CALL.


El nombre del identificador depende de la cantidad de memoria con la que este trabajando.




Una vez definido este comenzare a mostrar mi programa realizado.


En primera tenemos el código hecho en Lenguaje C, el programa se encarga de calcular el factorial de un número.




Después sera la hora de compilarlo para ver el resultado que nos servirá como comparación.




Una vez visto el funcionamiento seguirá el generar el ensamblador del código.




Las lineas que eliminare para optimizar el código están comentadas para que observen claramente las lineas.




Por ultimo compilaremos el ensamblador. Y lo corremos




Nota: A la hora de compilar puedes incluir la etiqueta -o para que el nombre que el nombre que tome el ejecutable.


Bibliografías:


http://www.cs.virginia.edu/~cs216/Fall2005/notes/x86-doc.pdf
http://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax
http://es.wikipedia.org/wiki/GNU_Assembler

No hay comentarios:

Publicar un comentario