#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 битам. 🙂