Сборка x86 деления с DX: AX - PullRequest
1 голос
/ 01 ноября 2011

Я работаю с masm, и я столкнулся со сценарием, который я не совсем понимаю, как решить, например:

X = (A)/(C*D)

Если я сначала умножу C * D, мое значение будет DX: AX, и, насколько мне известно, я не могу использовать это в качестве делителя. Если я делю деление отдельно на A / C и A / D, я рискую потерять точность (из-за напоминаний и т. Д.). Какой лучший способ реализовать это?

1 Ответ

3 голосов
/ 01 ноября 2011

Как вы правильно заметили, вы не можете использовать 32-разрядное число в качестве делителя в 16-разрядном делении, но поскольку нас интересует только целочисленное деление, это не проблема.

Необходимо рассмотреть два случая (для беззнакового деления):

  • DX == 0: результат C*D помещается в 16 бит, поэтому мы можем продолжить работу как обычно, используя ax в качестве 16-битногоделитель.
  • DX > 0 (DX != 0): C*D больше 65335 (0xFFFF) и 16-разрядное беззнаковое деление A, и это число всегда будет 0 и остатокэто просто A.

Или вы можете сделать как C и просто предположить, что результат C*D вписывается в 16 бит.:)

...