2011-11-01 3 views
1

Je travaille avec masm et j'ai rencontré un scénario que je ne comprends pas facilement comment résoudre, par exemple:Assemblée division x86 avec DX: AX

X = (A)/(C*D) 

Si je multiple C * D d'abord, ma valeur est DX: AX et à ma connaissance, je ne peux pas utiliser cela comme un diviseur. Si je fais la division séparément comme A/C et A/D, je cours le risque de perdre la précision (des rappels, etc.). Quelle est la meilleure façon de mettre en œuvre cela?

+0

Diviser en deux cas 'DX == 0' et' DX! = 0'. Le dernier cas est facile car le quotient est 0. (Faire les ajustements appropriés si vous avez besoin de support pour les entiers signés) – user786653

+0

Je ne considérais pas que DX: AX serait naturellement plus grand que A si DX! = 0 et ainsi la division entière résulterait en 0; cela semble tellement évident en rétrospective. Merci! – mimirswell

Répondre

3

Comme vous le notez correctement, vous ne pouvez pas utiliser un nombre 32 bits comme diviseur dans une division 16 bits, mais comme nous ne sommes intéressés que par la division entière, cela ne pose aucun problème.

Il y a deux cas à considérer (pour la division non signée):

  • DX == 0: Le résultat de C*D correspond à 16 bits afin que nous puissions procéder normalement à l'aide ax comme le diviseur 16 bits.
  • DX > 0 (DX != 0): C*D est supérieur à 65335 (0xFFFF) et la division non signé 16 bits de A et ce nombre sera toujours 0 et le reste est tout simplement A.

Ou vous pourriez faire comme C et supposer que le résultat de C*D correspond à 16 bits. :)

Questions connexes