2017-09-13 8 views
3

Que se passe-t-il lorsque vous utilisez un préfixe de remplacement de mémoire mais que tous les opérandes sont des registres? Donc, disons que vous codez mov eax, ebx ou add eax, ebx et que la valeur par défaut est 32 bits, mais que vous utilisez un remplacement de 67 heures.Que se passe-t-il lorsque vous utilisez un préfixe de remplacement de mémoire mais que tous les opérandes sont des registres?

Comment le processeur gère-t-il cette situation?

+2

'66' est le préfixe opérande taille, il fait dans' hache mov, bx'. Vouliez-vous dire le préfixe de taille d'adresse '67'? –

+0

Oui, j'ai modifié la question originale. Non, attendez, je voulais dire la question originale. C'était le point entier, mélangeant un préfixe de mémoire sans opérandes de mémoire. – matrix2

+0

'66' n'est pas un préfixe" mémoire ". '89 d8' est' mov eax, ebx'. '66 89 d8' est' mov ax, bx' (en mode 32 ou 64 bits, sinon le préfixe 66 fait que la taille de l'opérande est de 32 bits au lieu de 16 par défaut). Est-ce ce que vous vouliez demander, ou aviez-vous vraiment besoin de savoir sur le préfixe de taille d'adresse '67' qui fait' mov eax, [ebx] 'dans' mov eax, [bx] '. (Ou en mode 64 bits, 'mov eax, [rbx]' dans 'mov eax, [ebx]'.) –

Répondre

5

Le Manuel du développeur de logiciels Intel *, volume 2, section 2.1, détaille le comportement de chaque préfixe d'instruction. Il indique que l'utilisation du préfixe de taille d'adresse (67h) avec une instruction qui n'a pas d'opérande de mémoire est réservée et peut provoquer un comportement imprévisible.

Le préfixe de taille d'opérande (66h) peut être utilisé pour basculer entre des tailles d'opérandes de 16 et 32 ​​bits et également comme préfixe obligatoire avec certaines instructions SSE2/SSE3/SSSE3/SSE4. D'autres utilisations sont réservées et peuvent entraîner un comportement imprévisible.

Les préfixes de remplacement de segment sont réservés à toute instruction de branchement.

* https://software.intel.com/en-us/articles/intel-sdm

+1

Sur le matériel réel, les préfixes qui ne s'appliquent pas sont ignorés. C'est pourquoi ils sont "réservés" au lieu de "cause #UD". Sauf pour 'lock', qui fait' # UD' quand il ne s'applique pas. –

+0

@peter mais le document Intel qui "réservé" signifie que vous pouvez l'utiliser et il sera ignoré? Je suppose que cela signifie "ne l'utilisez pas, tout peut arriver". Maintenant, il semble que dans la pratique l'utilisation des préfixes réservés est souvent ignorée, ce qui est pratique pour Intel car ils peuvent ensuite définir un nouveau comportement en utilisant des préfixes inutiles et aussi documenter à ce point qu'il est bien (ignoré) sur les puces précédentes. L'autre comportement réservé peut très bien UD cependant. – BeeOnRope

+0

@BeeOnRope: Non, je ne pense pas, car ils ne documentent généralement que des garanties à l'épreuve du temps, pas des détails spécifiques de ce que les processeurs actuels font s'ils ne veulent pas garantir cela pour le futur. Comme vous le dites, ils ne documenteront le comportement d'ignorer qu'après le fait, comme pour 'tzcnt' /' bsf'. Cependant, il y a quelques cas comme 'rep ret' qui ne peuvent pas être réutilisés sans casser de grandes quantités de binaires compilés par gcc, donc [je ne m'attends pas à ce que les processeurs grand public le réutilisent pendant des décennies.] (Https: // stackoverflow.com/questions/20526361/what-does-rep-ret-mean/32347393#32347393). –