2010-08-10 5 views
5

Wenn ich den folgenden Code in Windows VC haben ++:GCC Inline-Montage: call dword ptr

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

Wie kann ich die gleiche Sache in GCC Inline-Montage machen, mit AT & T-Syntax?

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

Ich habe so etwas wie dies versucht, aber es erzeugt einen „Junk“ Fehler ...

Und dann habe ich versucht, somevar einigen Registern zu passieren, und es dann zu dword, konvertieren ptr, usw., aber ich konnte es nicht zur Arbeit bringen.

UPDATE: fand ich etwas, das nützlich wäre, wie es scheint, dass wir in diesem Fall Klammern statt Klammern verwenden, und ich fand etwas mit lcall als far zu nennen. Aber ich kann immer noch nicht verstehen, wie ich dword ptr reproduzieren kann.

Antwort

7

Sie verwenden DWORD PTR oder etwas ähnliches nicht mit der AT Assembler-Syntax AT &. Die Operandenlänge wird normalerweise aus dem Registernamen genommen (es gibt eine Option, ein Suffix mit dem Mnemonic anzugeben), die wiederum von der Größe des C-Operanden stammt, den Sie asm() geben. Dies ist eine sehr nette Eigenschaft des Inline-Assemblers, da dies bedeutet, dass dieses Beispiel ausgeführt wird, wenn Sie es für die x86_64 oder die i386-Architektur kompilieren. Im ersten Fall wird die Anordnung so etwas wie call *%rdx, im zweiten Fall wird es 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)); 
} 

Sie den Code GCC lesen kann (Kompilieren versuchen, mit dem -S) erzeugt, um die AT & T zu lernen Syntax. Auch versuchen, einige Intro Google, wie:

WARNUNG: Inline Montage mit gcc ist keine triviale Angelegenheit. Dies liegt daran, dass es, anders als bei den meisten anderen Compilern, so konzipiert ist, dass es mit dem Optimierer mit arbeitet. Sie müssen wirklich verstehen, was die Einschränkungen ("r") bedeuten und tun, sonst brechen Sie Ihren Code auf eine Weise, die Sie sich nicht vorstellen können. Denken Sie nicht darüber nach, es zu benutzen, bevor Sie antworten können, was ein "früher Clobber" ist.