[C con Clase] Ensamblador (sintaxis intel) en C usando gcc.
Adolfo Cárdenas
adocardenas en gmail.com
Jue Mar 27 18:47:30 CET 2008
El 26/03/08, Adolfo Cárdenas <adocardenas en gmail.com> escribió:
> El 25/03/08, Programante <programante en gmail.com> escribió:
> > Adolfo Cárdenas escribió:
> > > 2008/2/11, Programante <programante en gmail.com>:
> > >
> > >> int ensamblador() {
> > >> asm(".intel_syntax noprefix\n"
> > >> "mov eax, 5\n"
> > >> "add eax, 7\n"
> > >> ".att_syuntax");
> > >> }
> > >>
> > >> #include <iostream>
> > >>
> > >> int main() {
> > >> std::cout << "Este es un programa en C++ que devuelve 12 a través de
> > >> ensamblador: " << ensamblador() << std::endl;
> > >> return 0;
> > >> }
> > >>
> > >>
> > > Hola, gracias, pero tuve el problema de exceso de mensajes al colocar el codigo
> > >
> > > asm(".intel_syntax noprefix\n"
> > > "mov eax, 5\n"
> > > "add eax, 7\n"
> > > ".att_syuntax");
> > >
> > > Assembler messages:
> > > `.att_syuntax'
> > > `incl %edx'
> > > `pushl %ebp'
> > > ....
> > > Unrecognized token ''
> > > [General Error] Too many messages; abort.
> > "Too many messages" te lo da cuando te ha mostrado anteriormente tantos
> > errores que decide no seguir adelante.
> > El problema está en que cometí un fallo al escribir la última directiva.
> > No es .att_syuntax sino .att_syntax por lo
> > que detecta como erróneo todo el código en AT&T generado por gcc.
> >
> > Me alegra ver que alguien hace buen uso de los archivos de la lista :-)
> >
> > Otra opción que no comenté en ese mensaje es compilar con la opción
> > -masm=intel con lo que todo el código asm
> > pasa a estar en sintaxis de intel y no necesitas incluir los
> > .intel_syntax / .att_syntax
> >
> Gracias.
> Ahora no envia mensajes de error pero la función me devuelve cero
>
> int ensamblador() {
> asm(".intel_syntax noprefix\n"
> "mov eax, 5\n"
> "add eax, 7\n"
> ".att_syntax");
> }
> talvez eax no es compatible con el int de devc++ para windows
>
> ¿cómo puede un código en ensamblador recoger variables del programa?
>
> por ej:int ensamblador() {
> int variable = 12
> asm(".intel_syntax noprefix\n"
> "mov eax, variable\n"
> ".att_syntax");
> }
>
La solución que encontré:
Se deben declarar como públicas las variables a usar
y al usarlas se les antepone un subguión('_').
ejemplo:
byte g;
byte op1;
byte op2;
void rol(byte* bx, byte* by) // Rota a la izquierda los bits de bx, by veces.
{
op1 = *bx;
op2 = *by;
asm(".intel_syntax noprefix\n"
"mov ah, _op1\n"
"mov cl, _op2\n"
"rol ah\n"
"mov _g, ah\n"
".att_syntax");
*bx = g; // Retorna el valor resultante en bx.
}
Para cadenas de texto:
#include <stdio.h>
#include <string.h>
char inlined[] = "this is a message from intel syntaxed inlined
assembly code\n";
int len;
int main (void)
{
printf("this is a sample intel syntaxed and inlined c program\n");
len = strlen(inlined);
printf("%d\n",len);
asm(".intel_syntax noprefix\n");
asm("mov edx,len\n");
asm("mov ecx,offset inlined\n");
asm("mov ebx,1\n");
asm("mov eax,4\n");
asm("int 0x80\n");
printf("probably it is a success look in gdb\n");
return 1;
}
Más información sobre la lista de distribución Cconclase