2010-02-20 8 views
4

Eh bien d'abord je comprends (ou un je crois que je comprends) les problèmes de pile mal alignée. Mais je sais (comme une définition) que pousser une valeur de 16 bits à une pile large de 32 bits pourrait entraîner une pile mal alignée.Alignement de pile d'assembleur (ou meilleur exemple désaligné avec PUSH)

Mais la chose que je ne comprends pas, est comment cela pourrait se produire ... puisque PUSH et POP vérifient l'indicateur D au descripteur de segment (il en est de même 1 incréments/décréments 32bits et est 0 16bits). Supposons que D flag = 1, devrait PUSH AX faire un décrément de 32 bits? donc c'est comme si je "rate" 16bits dans la pile?

Je ne suis pas sûr que je comprends ce problème

Répondre

3

Bien que les deux push et pop vérifier le D-bit dans le descripteur de segment pour déterminer la taille de l'opérande par défaut (soit 16 ou 32/64 bits), il peut être Remplacé par un remplacement de taille d'opérande 0x66.

Si le bit D est égal à 0, alors:

ff /6 

pousse 16 bits sur la pile

et

66 ff /6 

pousse 32 bits (ou 64 si elle est une 64- segment de bit).

Si le bit D est 1, alors l'opposé est vrai.

Dans tous les cas, ESP (ou RSP ou juste SP, en fonction de la taille de l'adresse) est incrémenté ou décrémenté par 2 (pour les 16 opérations de bits), 4 (pour les 32 opérations de bits) ou 8 (pour 64 opérations binaires) .