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 rdxb - 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
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
El codigo optimizado es el siguiente:
Aqui el codigo corriendo despues de la optimizacion:
Bibliografias:
10 :)
ResponderEliminarVan 10 y 10, se me hace completa la tarea.
ResponderEliminar