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
Répondre
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.
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
@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. –
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é.
- 1. assemblage implémentation x86 de la pile
- 2. x86 codage d'opcode: octet de sib
- 3. Représentation d'un seul octet
- 4. x86 Montage NASM - Problèmes avec la pile
- 5. Modifier un seul octet dans un fichier
- 6. x86 où pointeur de pile pointe?
- 7. Dessiner un cadre de pile pour l'assemblage x86
- 8. PHP - Convertir un seul octet en entier (format graphique PCX)
- 9. Fonction de comparaison de deux éléments à un seul octet
- 10. Appeler la méthode privée en conservant la pile d'appels
- 11. Téléchargement de plusieurs images avec PHP en sauvegardant un seul chemin d'accès à la base de données MySQL
- 12. Quelle est la différence du clavier seul octet de caractères et clavier double octet Code caractère
- 13. Lire un seul octet à partir d'un fichier volumineux
- 14. Conversion octet en octet []
- 15. Instruction MSVC x86 en ligne de l'assembleur
- 16. Masquage d'un élément tout en sauvegardant la mise en page
- 17. Conversion d'un octet en un octet de 7 bits
- 18. Appel de plusieurs fonctions en x86
- 19. Quelle fonction de bibliothèque standard dans C copie un octet zéro à la pile?
- 20. Une pile de pointeurs de fonction: comment appeler la fonction?
- 21. Comment convertir (translittérer) une chaîne de utf8 en ASCII (un seul octet) dans C#?
- 22. Convertit un octet en JavaCard
- 23. Newlines en sauvegardant une variable dans un fichier - bash
- 24. convertir un octet en binaire
- 25. Convertir un objet en octet []
- 26. la façon d'obtenir la valeur entière d'un seul octet pyserial en python
- 27. x86 Assemblage, instruction push stack
- 28. Accès au cadre de la pile sur l'architecture x86-64 sous Linux
- 29. Restify Middleware - appeler correctement le middleware suivant dans la pile
- 30. Assemblage en ligne de l'instruction fbstp x86
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. –