При понимании преимуществ использования языка ассемблера x86 я пытаюсь написать в качестве упражнения, 16x16 бит процедура умножения, которая принимает в два знака 16 битовых значений и умножает их с помощью сдвига и * * Addin г, и сохраняет конечную 32 битный результат в DX: AX.8086 Сборка: умножьте два 16-разрядных номера, чтобы получить результат 32 бит, не используя команду mul.
Нет проблем с запуском кода (другими словами, он компилируется просто отлично и работает с моей связанной программой), однако код не дает ожидаемого результата умножения.
Это то, что я придумал до сих пор:
В теории это должно дать мне беззнаковое 32 битный результат в DX: AX.
Когда я использую этот код в моей программе, то ниже 16 бит из 32 битного результата (или другими словами, АХ часть) правильны и показать просто отлично. более высокие 16 бит результата 32 бит (часть DX) не верны.
Может ли кто-нибудь помочь мне разобраться в том, что я делаю неправильно?
Заранее спасибо
Я сомневаюсь, что это действительно быстрее, чем простой «mov ax, cx; mul bx'. Или вы пытаетесь сделать это как упражнение? – PMF
@PMF В основном упражнение, чтобы понять, как это можно сделать, хотя было бы очень интересно увидеть что-то, что быстрее, чем использование команды mul (поскольку, по-видимому, она находится только за div как самая медленная инструкция на 8086). – rsxjan
Да, в первой книге asm, которую я прочитал, около 20 лет назад они написали программу калькулятора, но с тех пор mul и div действительно были очень медленными, они использовали побитовые сдвиги, как вы здесь. Но я действительно был бы удивлен, если бы это было по-прежнему с сегодняшними микрокодами. – PMF