vérifier si le drapeau de report est activé
L'aide d'assembleur en ligne [gcc, intel, c], comment faire pour vérifier si la retenue est fixé après une opération?
source d'informationauteur hans
Vous devez vous connecter pour publier un commentaire.
Conditionnelle des sauts
jc
(saut si carry) oujnc
(saut si pas de portage).Ou vous pouvez stocker le drapeau de portage,
sbb %eax,%eax
va stocker -1 eax si le porte drapeau est réglé, 0 si elle est claire. Il n'y a pas besoin de pré-claire eax à 0; en soustrayant eax de lui-même, le fait pour vous. Cette technique peut être très puissant puisque vous pouvez utiliser le résultat comme un masque de bits pour modifier les résultats de calculs à la place de l'aide conditionnelle sauts.Vous devez être conscient qu'il n'est valable que pour tester le drapeau de portage si elle a été fixée par l'arithmétique effectuée à l'INTÉRIEUR de l'asm inline block. Vous ne pouvez pas tester de réaliser un calcul qui a été réalisée dans le code C, parce qu'il y a toutes sortes de façons, le compilateur peut optimiser/réorganiser les choses qui pourraient tabasser le porte drapeau.
Cependant l'assembleur x86 hes dédié rapide ALU drapeau instructions de test nommé SETcc où cc est souhaitée ALU drapeau. Vous pouvez donc écrire:
Avec SETcc d'instructions, vous pouvez tester des drapeaux comme porter, zéro, de signer, de débordement ou de la parité, certains SETcc instructions permettent de tester les deux drapeaux à la fois.
EDIT:
Ajoutée simple test fait en Delphi à disparaître un doute sur le terme rapide
La boucle (1M itérations) qui l'aide de l'instruction setc est plus de 5 fois plus rapide que la boucle avec adc instriuction.
EDIT: Ajout de la deuxième test résultat du test stockées dans le registre AL comulative dans le registre CL d'être plus réaliste.
Rutine partie avec SETcc instruction est encore plus rapide pour environ 20%.
La première fonction effectue unsigned plus, puis les tests de débordement à l'aide de la retenue (CF). La volatilité de la de la doit demeurer. Sinon, l'optimiseur de réorganiser les instructions, qui assez bien assure un résultat incorrect. J'ai vu l'optimiseur de changer le
jnc
à unjae
(qui est également basée sur la FC).La fonction suivante est pour la signature de l'ints. Même l'utilisation de la volatilité s'applique. Notez que entier signé de mathématiques sauts sur DE drapeau via
jno
. J'ai vu l'optimiseur de le changer pour unjnb
(qui est également basée sur DES).Dans la grande image, vous pouvez utiliser les fonctions comme suit. Dans le même tableau, beaucoup de gens ne sera probablement rejeter le travail supplémentaire et de l'esthétique de la non-beauté jusqu'pwn en un débordement/wrap/underflow
La ligne de GCC de l'assemblée est disponible dans GCC 3.1 et au-dessus. Voir Les Instructions de l'assembleur, le C de l'Expression des Opérandesou de la recherche pour "GCC Étendue de l'Assemblée'.
Enfin, même dans Visual Studio serait comme suit (pas beaucoup de différence dans la génération de code), mais la syntaxe est beaucoup plus facile depuis MASM permet de sauter à une étiquette C:
Sur le mauvais côté, au-dessus de MASM code n'est applicable que pour les architectures x86 assemblée. Pour x64 assemblée, il n'y a pas d'inlining de sorte que vous aurez à code dans de l'assemblée (dans un fichier séparé) et utiliser MASM64 à compiler.