2009-11-11 15 views
3

J'ai entendu dire que les architectures Motorola 68000 et Intel x86 géraient le débordement du décalage gauche différemment. Plus précisément, le LSK 68k par rapport aux instructions d'assemblage Intel SAL/SHL.Dépassement de décalage gauche sur 68k/x86?

Est-ce que quelqu'un connaît les détails de ceci? Est-ce qu'ils définissent des drapeaux différents ou les définissent différemment? J'ai essayé de chercher dans les manuels de référence, mais je ne vois aucune différence. Pourquoi voudrait-on gérer cette situation différemment?

Merci!

Répondre

4

Le bit X n'est pas impliqué. La confusion sur les drapeaux 68000 se produit parce qu'il y a deux instructions de décalage à gauche:

LSL, décalage logique à gauche, efface le drapeau de débordement. ASL, Décalage arithmétique à gauche, définit l'indicateur V si le MSB change de signe à tout moment pendant le quart de travail.

Le jeu d'instructions x86 n'est pas aussi puissant. Si le décompte = 1, alors OF, l'indicateur de débordement, = (MSB XOR CF), c'est-à-dire si le MSB a changé de signe à la suite du décalage de 1 bit OF = 1, sinon OF = 0.

Si le nombre de décalage est> 1 alors OF est indéfini.

Vince Heuring, Département ECEE, Univ. de Colo Boulder.

3

manuels pour les processeurs du programmeur ont les particularités:

Motorola 68K:

X — Set according to the last bit shifted out of the operand; 
    unaffected for a shift count of zero. 
N — Set if the result is negative; cleared otherwise. 
Z — Set if the result is zero; cleared otherwise. 
V — Always cleared. 
C — Set according to the last bit shifted out of the operand; 
    cleared for a shift count of zero. 

Intel x86:

  • Le drapeau CF contient la valeur du dernier bit décalé hors de la destination opérande; il est indéfini pour les instructions SHL et SHR où le nombre est supérieur ou égal à la taille (en bits) de l'opérande de destination.
  • L'indicateur OF est affecté uniquement pour les décalages de 1 bit (voir "Description" ci-dessus); sinon, il est indéfini.
  • Les indicateurs SF, ZF et PF sont définis en fonction du résultat. Si le compte est 0, les indicateurs ne sont pas affectés.
  • Pour un comptage différent de zéro, l'indicateur AF n'est pas défini.

Ainsi, le drapeau de débordement est traité différemment. Cela vous permettra de savoir en x86 si une multiplication par 2 (un décalage à gauche) entraîne un débordement. Je ne sais pas pourquoi c'est si spécifique aux quarts de travail. Je devine (et c'est juste une supposition) que le drapeau OF est défini en fonction du «dernier» changement de bits - et cela pourrait ne pas indiquer si l'opération entière a débordé, donc Intel l'a documenté comme «indéfini».

+1

C'est pour des raisons historiques depuis l'époque où les décalages d'un bit et les décalages arithmétiques étaient implémentés différemment dans le silicium. Ils ont fait cette spécification à l'époque, et depuis que nous avons été coincés avec elle pour la rétrocompatibilité. – Crashworks

2

(Oui je passe en revue mon Motorola 68000 Référence de 1979.)

probablement ce que vous pensez est peu X assez étrange du 68000. Le bit eXtend est essentiellement une copie du bit C (carry), mais n'est pas affecté par des instructions non arithmétiques. Supposons que vous ajoutez des entiers de 12 mots, par exemple. En x86, vous pourriez voir quelque chose comme:

. 
    . 
loop: 
    ADC AX,[SI] 
    ADD SI,2 
    INC BX   ; BX is loop index 
    CMP BX, 12  ; doh, changes carry (BUG) 
    JB loop 

Ce code ne fonctionne pas parce que l'instruction de comparaison corrige le drapeau de report. Mais dans 68000:

. 
    . 
loop: 
    ADDX.W (A0)+, D0 ; both C and X set the same 
    INC.W D7   ; D7 is loop index 
    CMP.W #12, D7  ; harms C, but X left intact 
    BCC loop 

Motorola a pensé qu'ils faisaient des programmeurs une faveur, mais l'entreprise bit X a fini par causer plus de confusion que cela valait la peine.