2010-08-10 13 views
5

Si tengo el siguiente código en Windows VC++:GCC Inline-ensamblaje: llamar DWORD PTR

DWORD somevar = 0x12345678; 
_asm call dword ptr [somevar] 

¿Cómo puedo hacer la misma cosa en línea GCC-montaje, con AT & sintaxis T?

__asm__ __volatile__ (
    "call dword ptr [%%edx]" : : 
    "d" (somevar) 
); 

He intentado algo como esto, pero genera un error "basura" ...

Y luego trató de pasar a somevar algunos registros, y luego convertirlo a dword, ptr, etc., pero no pude hacer que funcione.

ACTUALIZACIÓN: he encontrado algo que sería útil, como parece que tenemos que utilizar paréntesis en lugar de corchetes en ese caso, y me encontré con algo con lcall llamar como far. Pero todavía no puedo entender cómo puedo reproducir dword ptr.

Respuesta

7

No utiliza DWORD PTR ni nada de esto con la sintaxis del ensamblador T AT &. La longitud del operando generalmente se toma del nombre del registro (hay una opción de proporcionar un sufijo con el mnemónico), que a su vez proviene del tamaño del operando C que le das a asm(). Esta es una propiedad muy agradable del ensamblador en línea porque significa que este ejemplo se ejecuta si lo compila para x86_64 o la arquitectura i386. En el primer caso, el montaje se convierte en algo así como call *%rdx, en el segundo caso se convierte en call *%edx:

#include <stdio.h> 
void p() 
{ 
    puts("Hallo"); 
} 
typedef void (*fp)(); 
int main() 
{ 
    fp var=&p; 
    var(); 
    // put 'var' in a register, the '*' says call indirect: 
    asm volatile ("call *%0"::"r"(var)); 
} 

se puede leer el código genera GCC (tratar de compilar con el -S) con el fin de aprender el AT T & sintaxis. Además, trate de google alguna introducción, como:

ADVERTENCIA: ensamblador en línea con gcc no es un asunto trivial. Esto se debe a que, aparte de la mayoría de los demás compiladores, está diseñado para funcionar con el optimizador. Debes entender realmente qué significan y qué significan las restricciones ("r"), de lo contrario romperás tu código de formas que no puedes imaginar. Ni siquiera pienses en usarlo antes de poder responder a lo que es una "golpiza temprana".

Cuestiones relacionadas