2017-09-29 10 views
-2

Comme je l'ai remarqué le préfixe binaire 0xF3 est utilisé comme:
1) répétition et diminuent ecx jusqu'à ecx égale à 0 dans le INS, OUTS, MOVS, LODS, STOS instructions et appelé rep
2) répéter les opérations et diminuer ecx jusqu'à ecx égale à 0 ou ZF ensemble dans les CMPS, SCAS instructions et appelé repz ou repeAssemblée x86 REP, REPZ, REPNZ, instructions XACQUIRE et XRELEASE

Le préfixe binaire 0xF3 est utilisé comme:
1) la répétition et de diminuer ecx jusqu'à ecx égale à 0 ou ZF pas défini dans les CMPS, SCAS instructions et appelé repnz ou repne

Récemment remarqué que XACQUIRE/XRELEASE préfixes ont également les mêmes valeurs binaires (0xF2, 0xF3)

Alors quoi XACQUIRE/XRELEASE fait (je lis quelque chose sur le verrouillage d'une adresse de mémoire, mais ils ne sont pas la ligne de travail lock (je crois))?

Aussi ce que fera 0xF3 mov byte ptr [ecx],0x0? (s'arrêtera à ZF set \ not set ou il s'arrêtera seulement à ecx égal à 0)
Et que fera 0xF2 mov byte ptr [ecx],0x0?

+2

Consulter la référence du jeu d'instructions. Vous verrez des choses telles que: _ "Le préfixe F3H est défini pour les instructions suivantes et indéfini pour le reste_" et _ "L'indicateur de préfixe XACQUIRE ne peut être utilisé qu'avec les instructions suivantes" _. Les ensembles ne se chevauchent pas et n'incluent pas 'mov'. Donc c'est indéfini. En ce qui concerne XACQUIRE/XRELEASE, voir la section _HLE Software Interface_ dans le manuel du développeur de logiciels _Intel® 64 et IA-32 Volume 1: Basic Architecture_ – Jester

Répondre

5

Intel Software Manuel citant Developer 2, Section 2.1.1

Utilisez ces préfixes uniquement avec chaîne et des instructions d'E/S (MOVS, CMPS, SCAS, LODS, STOS, INS et OUTS). L'utilisation de préfixes de répétition et/ou d'opcodes non définis avec d'autres instructions Intel 64 ou IA-32 est réservée; cette utilisation peut provoquer un comportement imprévisible. Les instructions peuvent utiliser F2H,F3H comme préfixe obligatoire pour exprimer une fonctionnalité distincte.

L'utilisation des préfixes de répétition avec des instructions non-IO non-string est un comportement non défini exactement pour la raison que vous venez de découvrir: Intel réutilise pour exprimer différentes saveurs de la même « instruction » ou de mettre en œuvre de nouvelles extensions.

Dans le cas des instructions HLE (comme xacquire), elles ne sont valables que pour un ensemble spécifique d'instructions.
Par exemple, xacquire peut être utilisé uniquement avec ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, CMPXCHG8B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD et XCHG - ces instructions n'autorisent pas les préfixes répétitifs, donc aucune ambiguïté ne se produit.

En général, les préfixes non pertinents sont ignorés, donc si l'ajout d'un préfixe à une instruction peut entraîner un comportement indéfini dans les futurs processeurs, il est ignoré en toute sécurité dans les anciens processeurs.

Voilà pourquoi le soutien de l'ELH n'a pas besoin d'être vérifié explicitement:

matériel sans support ELH ignorera les XACQUIRE et XRELEASE conseils de préfixe et ne fera aucune élision puisque ces préfixes correspondent à la REPNE/REPE Les préfixes IA-32 qui sont ignorés sur les instructions où XACQUIRE et XRELEASE sont valides.

Une instruction comme 0xF3 mov byte ptr [ecx],0x0 fera comme mov byte ptr [ecx],0x0, comme aujourd'hui, parce que le préfixe est ignoré.

Pour le réitérer explicitement: les préfixes de répétition sont utilisés pour choisir une sémantique différente pour une instruction.

Parfois, l'instruction a un nom explicite et la sémantique alternatives sont proches (par exemple movs, repe movs, repne movs ou le fait que tzcnt est 0xf3 bsf) et parfois l'instruction ne dispose pas d'un nom explicite et les alternatives sont moins évidentes (par exemple mulsd est 0xf2 mulps, mulss est 0xf3 mulps, mulpd est 0x66 mulps).

Vous trouverez plus d'informations sur l'instruction xacquire dans les manuels du développeur de logiciels Intel ou au this post.