2016-08-26 1 views
4

Tenir compte assembleur en ligne comme ceci:Comment puis-je dire à gcc que mon assemblage en ligne fait partie de la pile?

uint64_t flags; 
asm ("pushf\n\tpop %0" : "=rm"(flags) : : /* ??? */); 

Nonwithstanding le fait qu'il ya probablement une sorte de intrinsèque pour obtenir le contenu de RFLAGS, comment puis-je indiquer au compilateur que mon assembleur en ligne aplatit un quadword de mémoire à le sommet de la pile?

+2

AFAIK, vous ne pouvez pas. Je * pense * que le seul moyen sûr d'écrire ceci est de modifier rsp autour du pushf/pop pour ne pas marcher sur la zone rouge. (Utilisez 'add -128' /' sub -128' pour qu'ils puissent utiliser un encodage imm8). Et puis bien sûr, la contrainte de sortie doit être '" = r "', car un opérande de mémoire pourrait utiliser un mode d'adressage rsp-relatif. Éviter la zone rouge est le meilleur que l'on puisse trouver dans les discussions sur le même problème sur les questions précédentes. –

+0

Vous pouvez également sauvegarder/restaurer '[rsp-8]' dans un registre, mais cela semble pire que de modifier rsp, même si cela fait que le moteur de la pile insère un extra supplémentaire. –

+1

Il n'y a aucun moyen de dire à asm étendu que vous êtes en train d'écraser la pile. Cela dit, qu'essayez-vous exactement d'accomplir? Il pourrait y avoir d'autres astuces qui font ce dont vous avez besoin (peut-être lahf?). –

Répondre

0

En ce qui me concerne, ce n'est actuellement pas possible.