Разделение сборки x86 с помощью DX: AX

#assembly #x86 #masm

# #сборка #x86 #masm

Вопрос:

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

 X = (A)/(C*D)
 

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

Комментарии:

1. Разделите его на два случая DX == 0 и DX != 0 . Последний случай прост, поскольку частное равно 0. (Внесите соответствующие коррективы, если вам нужна поддержка целых чисел со знаком)

2. Я не учел, что DX: AX, естественно, будет больше, чем A, если DX != 0 и, следовательно, целочисленное деление приведет к 0; это кажется настолько очевидным в ретроспективе. Спасибо!

Ответ №1:

Как вы правильно заметили, вы не можете использовать 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 битам. 🙂