Question

J'ai commencé l'assemblage récemment masm d'apprentissage, iv été DEMONTAGE beaucoup de mes programmes juste pour jeter un oeil. J'ai remarqué que lorsque vous utilisez un __int16 (mot) la valeur de celui-ci est le 1er copié dans eax puis dans la variable elle-même, mais avec int (dword / 32), il est copié directement dans la variable: Heres le code dissimula pour les

int y = 5;
0040101E  mov         dword ptr [y],5 

    y += 7;
00401025  mov         eax,dword ptr [y] 
00401028  add         eax,7 
0040102B  mov         dword ptr [y],eax 

    __int16 x = 3;
0040102E  mov         eax,3 
00401033  mov         word ptr [x],ax 

    x += 6;
00401037  movsx       eax,word ptr [x] 
0040103B  add         eax,6 
0040103E  mov         word ptr [x],ax 

Je remarque que le __int16 est de taille 16 ... ce qui est la moitié de la taille de eax, est-ce la raison pour laquelle il est mis en eax d'abord, puis seule hache dans x?

En outre, ce qui est le plus rapide?

Y at-il de bons sites MASM vous recommanderiez?

Merci pour votre saisie

Était-ce utile?

La solution

Les mêmes résultats serait en effet donné si l'instruction était mov ax,3, mais le compilateur probablement choisir mov eax,3 parce que le code de la machine est plus court et dans ce cas particulier, l'effet est le même. mov ax,3 aurait un octet préfixe supplémentaire qui indique au processeur, il est une opération de 16 bits. (Le codage pour les deux instructions est par ailleurs identique).

Si vous utilisez Visual C ++, vous pouvez passer à l'affichage du code machine octets dans la fenêtre de démontage, et de voir la taille de chaque instruction est.

A un moment donné, des instructions de 16 bits (ou, plus précisément, des instructions en utilisant la taille de mot « autre » du mode de l'unité centrale) étaient moins efficaces; cela peut ou peut ne pas être le cas plus, je ne suis pas sûr. (Je dirais que l'effet de ce serait assez difficile à repérer en général, et vous auriez à s'arranger un peu extrait de code qui le rend évident.)

Autres conseils

tailles de mots qui correspondent à l'architecture de votre cpu sont toujours plus rapide. Tout le reste est forcé à convertir avant et en arrière pour chaque opération.

TLDR. Sauf si vous avez une raison très spécifique, l'utilisation int

Je fais ça, comme je ne sais pas précisément.

Mais il semble que sur les processeurs modernes, en collaboration avec EAX est plus efficace que de travailler avec le plus petit, le registre de hache.

En se déplaçant dans EAX premier (dans la première affectation), la CPU signera étendre la constante dans le registre de 32 bits.

Les chances sont aussi bonnes qu'il compilateur fait tous ses calculs en 32 bits (travail avec les registres), et de façon transparente en vous donnant les restes (à savoir la hache).

C'est ce qu'il ressemble à moi.

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