[C con Clase] Ensamblador (sintaxis intel) en C usando gcc.

Adolfo Cárdenas adocardenas en gmail.com
Mar Abr 1 04:18:23 CEST 2008


El 27/03/08, Adolfo Cárdenas <adocardenas en gmail.com> escribió:
> 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;
> }
>

No puedo todavía cambiar el valor de una variable
Por ejemplo en

int var;

void Agrega1()
{
 var = 5;
 asm(".intel_syntax noprefix\n"
      "add _var,1 \n"
      ".att_syntax");
 }
no ocurre ningún cambio en el valor de la variable var .




Más información sobre la lista de distribución Cconclase