Question

Je prends un cours maintenant assemblée, et le gars qui vérifie nos devoirs à la maison est un monstre d'optimisation de la vieille école très pédant. Par exemple, il déduit 10% s'il voit:

mov ax, 0

au lieu de:

xor ax,ax

même si elle est utilisée une seule fois.

Je ne suis pas un débutant dans la programmation mais je suis assemblage pas un expert d'optimisation, donc je besoin de votre aide dans quelque chose (peut-être une question stupide, mais je vais demander quand même): si je dois définir une valeur de registre à 1 ou (-1) est-il préférable d'utiliser:

mov ax, 1

ou faire quelque chose comme:

xor ax,ax
inc ax

J'ai vraiment besoin d'une bonne note, donc je suis en train de l'obtenir aussi optimisé que possible. (Je dois optimiser à la fois le temps et la taille du code)

Était-ce utile?

La solution

Un rapide Google pour 8086 instructions timings size relevai http://8086.tk/ qui semble avoir tous les horaires et tailles pour 8086 (et plus) jeux d'instructions.

Sans doute, vous pouvez trouver Intel doco officiel sur le web avec des informations similaires.

Pour votre question spécifique:

xor ax,ax
inc ax

a 3 + 3 = 6 cycles d'horloge et 2 + 1 = 3 octets tandis que

mov ax,1

prend 4 cycles d'horloge et 3 octets.

Alors celui-ci est mieux dans ce cas.


Mais vous avez besoin de parler à votre établissement d'enseignement au sujet de ce type. 10% pour une chose simple comme cette croyance des mendiants.

Vous devriez demander à ce qu'il faut faire dans le cas où vous avez deux possibilités, une plus rapide et une plus courte.

Ensuite, une fois qu'ils ont admis qu'il existe différentes façons de le code en fonction de ce que vous essayez d'atteindre, leur dire que ce que vous essayez d'atteindre est la lisibilité et la maintenabilité et ne pouvait pas donner un sérieux bond en vol d'un cycle de gaspillés ou octet ici ou là * a .

L'optimisation est quelque chose que vous faites en général si et quand vous avez un problème de performance, après un morceau de code est dans un état quasi-complet - il est l'effort presque toujours perdu lorsque le code est encore soumis à un risque non négligeable de changement .

Pour ce que ça vaut, sub ax,ax semble être à égalité avec xor ax,ax en termes de cycles d'horloge et d'octets, vous pourriez peut-être jeter que dans le mélange la prochaine fois pour lui faire un peu plus de travail.

* a) Non, ne pas vraiment, mais il est amusant de temps en temps vent: -)

Autres conseils

Vous êtes mieux avec

mov AX, 1

sur la 8086. Si vous êtes contenu du registre de suivi, vous pouvez éventuellement faire mieux si vous savez que, par exemple, BX a déjà 1 en elle:

mov AX, BX

ou si vous savez que AH est 0:

mov AL, 1

etc.

En fonction de votre situation, vous pourriez être en mesure de sortir avec ...

 sbb ax, ax

Le résultat sera soit 0 si le drapeau de transport est pas défini ou -1 si le drapeau de transport est réglé.

Cependant, si l'exemple ci-dessus ne sont pas applicables à votre situation, je recommande le

xor  ax, ax
inc  ax
Procédé

. Il devrait satisfaire votre professeur pour la taille. Toutefois, si votre processeur utilise une pipe doublure, j'attends à un certain couplage comme délai entre les deux instructions (je pourrais très bien me tromper). Si un tel couplage existe, la vitesse pourrait être améliorée légèrement en réorganisant vos instructions légèrement pour avoir une autre instruction entre eux (celui qui n'utilise pas la hache).

Hope this helps.

J'utiliser mov [e]ax, 1 en aucun cas. Son encodage n'est plus longue que la séquence xor de hackier, et je suis sûr qu'il est plus rapide à peu près partout. 8086 est juste assez bizarre d'être l'exception, et que cette chose est si lent, un micro-optimisation comme cela ferait plus de différence. Mais nulle part ailleurs: exécution 2 instructions « easy » sera toujours plus lent que d'exécuter 1, en particulier si l'on considère les risques de données et de longues canalisations. Vous essayez de lire un registre dans la très prochaine instruction après avoir modifié, donc à moins que votre CPU permet de contourner le résultat de l'étape N du gazoduc (où le xor est en cours d'exécution) à mettre en scène N-1 (où le inc est en essayant de charge le registre, jamais l'esprit en ajoutant 1 à sa valeur), vous allez avoir des stands.

D'autres choses à prendre en considération: la bande passante d'extraction d'instructions (sans objet pour le code 16 bits, les deux sont 3 octets); mov drapeaux (évitant le changement plus susceptibles d'être utiles que de les forcer tous à zéro); en fonction des valeurs que d'autres registres pourraient tenir, vous pourriez peut-être faire lea ax,[bx+1] (aussi 3 octets, même dans le code 32 bits, aucun effet sur les drapeaux); comme d'autres l'ont dit, sbb ax,ax pourrait travailler aussi dans des circonstances -. il est également plus courte à 2 octets

Face à ces sortes de micro-optimisations vous devriez vraiment mesure les alternatives au lieu de se fier aveuglément, même sur les manuels de traitement.

P.S. Nouveau devoirs: est xor bx,bx plus vite que xor bx,cx (sur un processeur)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top