[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