Tarea Intro
Ensamblador a Utilizar
GAS (GNU Assembler).- es el ensamblador del proyecto GNU. es 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:
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, .LC2 | Etiquetas creadas automáticamente por gcc, que comunmente almecenan los .string, los .text y los .globl main |
.string | Se 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. |
.type | Guarda 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. |
MOV | Mueve 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. |
AND | Operació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. |
SUB | Reserva 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. |
CALL | Llama 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 primero | Calcula 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 sistema | Esta instrucción carga el contenido de un registro de punto flotante al registro del sistema. |
FMULP | Multiplica | Multiplica el primer parámetro por el segundo y almacena el resultado en el primero, coloca el registro en la pila. |
FSTPL | Extrae valores | Es usado para extraer algún valor fuera de la pila. |
LEAVE | Procedimiento de salida de alto nivel | Libera el espacio de pila reservado para el cuadro de pila. |
JUMP | Salto sin restricciones | Nos permite pasar de etiqueta y etiqueta sin necesidad de que se cumpla alguna condición en especifico |
je jne jz jg jge jl jle | Saltos Condicionales | Se encargan de cambiar de una etiqueta a otra, pero dependiendo de la condición a la que obligada |
RET | Regresar 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