2015-03-29 1 views
0

Dans toutes les variantes de GCC, les variables locales qui ne rentrent pas dans les registres sont stockées dans la pile. Pour y accéder, on utilise des constructions comme [ESP + n] ou [EBP-n], où n peut impliquer un décalage au sein de la variable.Transmettre le décalage du pointeur de pile/image à la variable vers l'assemblage en ligne GCC

Lors du passage de telles variables à l'ensemble en ligne GCC en tant qu'opérandes, un registre de réserve est utilisé pour stocker l'adresse calculée. Existe-t-il un moyen de désigner les opérandes comme "le registre de base de cette variable" et/ou "le décalage de cette variable par rapport au registre de base"?

+0

Avez-vous des exemples de code qui l'illustre? Si vous ne faites que référencer la variable, le compilateur devrait être assez intelligent pour utiliser l'adressage relatif 'esp' ou' ebp'. [Mon exemple] (http://goo.gl/PnejhF). – Jester

Répondre

0

Si vous faites quelque chose comme

int stackvar; ... asm ("...":"r"(stackvar))

vous forcer GCC pour charger stackvar dans le registre. Si vous ajoutez m contrainte, vous n'avez pas:

int stackvar; ... asm ("...":"rm"(stackvar))

+0

Avec "m", d'après mon expérience, GCC le donne à assembly comme [reg]. Vous pouvez faire d'autres offsets, comme dans 'movl% eax, [$ [var] +8] –