jueves, 1 de marzo de 2012

Ensamblador tarea 1

GAS Sintaxis
GAS o GNU su sintaxis es una forma diferente de la sintaxis de los archivos en lenguaje ensamblador, también conocida como la sintaxis de AT & T. Es comúnmente usado por otras versiones de GAS para otras arquitecturas (es decir, no-x86).

Las diferencias
La sintaxis de GAS puede parecer extraño a alguien que esté familiarizado con la sintaxis de Intel.

Constantes son prefijadas con un "quot;, por lo mov eax, de 50 años se convierte en $ movl 50,% eax. Las constantes son decimal por defecto; constantes hexadecimales son, además, con el prefijo 0x, por ejemplo, "$ 0x50".

Códigos de operación no tienen los tamaños implícitas ni especifica el tamaño como una palabra separada. Por ejemplo, un movimiento de 32 bits con la sintaxis de Intel requiere el "dword" especificador cuando es ambiguo, mientras que la sintaxis de GAS utiliza sufijos. Véase más adelante.
Referencias de memoria a través de registro son en forma de "desplazamiento (base de registro, offset registro, escalar)". Así, la referencia a la memoria [eax + 4 + EDX * 2] se escribe como 4 (% eax,% edx, 2). Tenga en cuenta que los paréntesis se utilizan, NO entre corchetes.
Los nombres de símbolo requieren un "quot; para cargar la dirección, y sin prefijo para acceder a los contenidos. Así, el Intel / NASM sintaxis de la memoria de referencia mov dword eax, [símbolo] es el símbolo movl misma,% eax. Para cargar la dirección de "símbolo", a continuación, Intel / NASM usa la sintaxis de mov eax, símbolo, mientras que GAS utiliza movl símbolo $,% eax.

Los sufijos enteros
b - 8 bits byte. Ejemplo: movb $ 0x40,% al, mover 0x40 constantes en el registro al.
w - palabra de 16 bits. Ejemplo: hacha movw%,% bx, mover registro de hacha en BX.
l - 32 bits de largo. Ejemplo: movl% ecx,% eax, mover registro ECX en eax
q - 64 quadword poco. Ejemplo: (programas de 64 bits solamente) rax movq%, RDX%, se mueven en el registro de rax rdx

Los sufijos flotante (x87)
s - Corto (precisión simple, 32 bits). Ejemplo: FLDS (% eax), la carga de 32 bits "flotador" de la memoria.
l - Long (64 bits). Ejemplo: Sdl (% eax), la carga de 64 bits "doble" de la memoria.
t - Diez byte (80 bits). Ejemplo: fldt (% eax), cargue 80 bits "long double" de la memoria.


Registro
Función
Terminación 16-bits
8-bits
eax
Acumulador
ax
ah
abx
Base index
bx
bh
ecx
Contador
cx
ch
edx
Datos
dx
dh
edi
Destino del index
do
al
esi
Source index
si
bl
ebp
Frame pointer
bp
cl
esp
Stack to pointer
esp
dl


Ahora el codigo:
El codigo que se realizo es muy sencillo, lo que se hace es que te pide un arreglo de numeros y al final te pregunta que numero te gustaria saber cuantas veces se repite.

Codigo en C


Codgio corriendo en c:


Ahora para formar el codigo en ensamblador se uso la siguiente linea:
gcc -S nombre del archivo.c
y se genero el siguiente codigo:


Optimizando el codigo
Para optimizarlo se eliminaron las lineas que agrega gcc y que no sirven, como el nombre del programa e informacion general del compilador, tambien se eliminaron unas lineas que estaban relacionadas con la arquitectura de 64 bits, y se eliminaron las lineas relacionadas con el control de funcion.

El codigo optimizado es el siguiente:
  • 3 comentarios: