2011-07-26 3 views
2

J'apprends actuellement l'assemblage x86 avec "Guide du langage assembleur sous Linux" et à la page 241 il est écrit que seulement 16 mots de bits ou mots de 32 bits sont sauvegardés sur la pile, mais Est-ce vrai? Je veux dire dans C un tableau char est constitué de simples octets et ceux-ci sont sauvegardés sur la pile car C est constitué de fonctions qui utilisent la pile d'appels, non? Alors qu'est-ce que je me trompe?Appeler la pile de x86 en sauvegardant un seul octet

+1

Possible copie de [Pourquoi est-il impossible de placer un octet sur une pile sur un Pentium IA-32?] (Http://stackoverflow.com/questions/2586591/why-is-it-not-possible-to -push-a-octet-sur-une-pile-sur-pentium-ia-32) Démonter ce que compile votre compilation, et alors discutons-en. –

Répondre

5

Même les octets sont remplis de zéros et convertis en mots de 16 ou 32 bits avant d'être poussés. Considérer l'empilement comme une pile de plaques de taille particulière (16 ou 32).

Y a-t-il un moyen de pousser la moitié de la plaque? Non? Même si vous voulez pousser la moitié de la taille, vous devez le remplir pour faire la plaque pleine grandeur et ensuite le pousser.

+0

Je voulais commenter cela sur l'autre poste mais quelqu'un ou l'auteur l'a supprimé, peu importe mon autre question: Donc, fondamentalement, C le ferait comme ça pour initialiser le premier élément d'un tableau char: movb $ 65, (% esp) pour indice 0? et avant cela, il ferait quelque chose comme sous sizeofarray,% esp? – rob

+0

@rob: Je l'ai annulé maintenant que ce n'est plus faux :-) Essentiellement oui, mais regardez le désassemblage pour voir exactement ce que votre implémentation fait. Que le début du tableau soit exactement sur 'esp' ou non dépend des autres variables automatiques que vous avez. –

2

C'est vrai pour les instructions push, mais ce n'est pas la seule façon d'utiliser la pile. x86 possède également le registre esp pour stocker un pointeur sur la position de la pile en cours.

Les arguments de fonction vont sur la pile, si vous vérifiez le désassemblage, vous verrez comment le compilateur les obtient là. Dans la convention d'appel habituelle pour x86, les arguments char occupent 4 octets chacun. Les tableaux ne peuvent pas être passés par valeur, donc le problème ne se pose pas comment un tableau char serait sauvé s'ils le pouvaient.

Les variables automatiques occupent également la pile, mais les éléments du tableau ne sont pas enregistrés individuellement sur la pile en utilisant "push". Généralement, la fonction fera de la place pour toutes ses variables automatiques au début - recherchez une instruction "sub" impliquant "esp". Ensuite, le début du tableau est à un décalage connu de esp, tout comme n'importe quelle variable automatique est, et le compilateur utilisera ce décalage pour générer des accès au tableau. Il n'y a pas besoin de remplissage entre les éléments, bien qu'il puisse y en avoir après la fin du tableau afin de garder le pointeur de la pile correctement aligné.

Questions connexes