2010-08-10 5 views
5

Si je le code suivant dans Windows VC++:GCC Inline-assemblage: appel dword ptr

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

Comment puis-je faire la même chose en ligne-ensemble de GCC, avec AT & T syntaxe?

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

J'ai essayé quelque chose comme ça, mais il génère une erreur « indésirable » ...

Et puis j'ai essayé de passer somevar à certains registres, puis le convertir en dword, ptr, etc, mais je ne pouvais pas le faire fonctionner.

MISE À JOUR: J'ai trouvé quelque chose qui serait utile, comme il semble que nous devons utiliser des parenthèses au lieu des crochets dans ce cas, et j'ai trouvé quelque chose avec lcall appeler comme far. Mais je n'arrive toujours pas à comprendre comment je peux reproduire dword ptr.

Répondre

7

Vous n'utilisez pas DWORD PTR ou quoi que ce soit de ce type avec la syntaxe AT & T. La longueur de l'opérande est habituellement tirée du nom du registre (il y a une option pour fournir un suffixe avec le mnémonique), qui vient à son tour de la taille de l'opérande C que vous donnez à asm(). C'est une très belle propriété de l'assembleur inline car cela signifie que cet exemple s'exécute si vous le compilez pour l'architecture i386 de x86_64 ou. Dans le premier cas, l'ensemble devient quelque chose comme call *%rdx, dans le second cas, il devient 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)); 
} 

Vous pouvez lire le GCC de code génère (essayez de le compiler avec le S) afin d'apprendre l'AT & T syntaxe. Essayez également à Google une intro, comme:

AVERTISSEMENT: assembleur en ligne avec gcc est pas une mince affaire. C'est parce que, à l'exception de la plupart des autres compilateurs, il est conçu pour fonctionner avec l'optimiseur. Vous devez vraiment comprendre ce que les contraintes ("r") signifient et faire, sinon vous allez casser votre code d'une manière que vous ne pouvez pas imaginer. Ne pensez même pas à l'utiliser avant de pouvoir répondre à la question de savoir ce qu'est un «coup de poing précoce».

Questions connexes