kotenok gav1) Получение старшего слова произведения полезно в основном для двух случаев: а) программное увеличение разрядности умножения; б) умножение дробных чисел (в формате с фиксированной запятой). Под пункт б подпадает и программное умножение типов данных с плавающей точкой. Во многих алгоритмах умножения байт на байт слишком мало и надо считать 16х16 или 32х32, а без получения старшего байта произведения это настолько сложно, что бывает проще всё умножение сделать "руками" (без использования команды умножения). Так что если делать не игрушку, а хоть сколько-нибудь серьёзную вещь, то получение произведения удвоенного размера необходимо (и просто реализуется). Вопрос как именно его получать — на ваше усмотрение, можно сразу сохранять в дополнительный регистр, можно произведением заменять оба аргумента, можно две команды получения младшего или старшего слова (особенно если аргументы не перезаписываются), можно и ещё что-то придумать. Я бы реализовал первый вариант, сразу в дополнительный регистр.
2) Копировать частное? А что тогда выдаёт операция деления?! Мне всегда казалось она частное и выдаёт ...
Вопрос копировать ли остаток нетривиальный, зависит от конкретной реализации и деления, и умножения, ведь остаток при желании несложно получается обратным умножением и вычитанием, если ни деление ни умножение не портят своих аргументов. Впрочем, при наличии регистра (для умножений) сохранить туда остаток вопросов не вызывает.
Другое дело, что вместо получения остатка намного полезнее деление
удвоенного слова на слово (лучше конечно с получением и остатка) — для программного увеличения разрядности делимого (полезно например для перевода из двоичной в десятичную систему длинного числа). Когда реально полезно деление байт на байт (даже с получением остатка) мне трудно представить, это такой "полуфабрикат", что ни к селу ни к городу, точности в 2 цифры (байт) слишком мало
почти всегда, а программное увеличение разрядности деления ещё сложнее такового для умножения.
Плюс ко всему выше, если я правильно помню, АЛУ выдаёт и признаки результата, как минимум флаг нуля, их полезно сразу выставить например для умножения если получили ненулевое старшее слово (т.е. результат не вмещается в разрядную сетку), экономится (правда редкая) проверка регистра на ноль. Для деления часто нужна проверка остатка на ноль, т.е. факта делимости нацело. Но с делением могут быть и другие проблемы: деление на ноль, получение нулевого частного, получение частного больше разрядной сетки, их как бы тоже неплохо проверять и как-то информировать (но не обязательно, можно и обычными командами их проверить, до или после деления).
Кроме того, умножения и деления могут быть как беззнаковыми, так и знаковыми, а иногда и смешанными. Хотя по минимуму достаточно беззнаковых, остальные реализуются через них.
(Как понять какие команды нужны)
Вообще, если относиться серьёзно, то надо или почитать как это всё уже где-то реализовали (например в x86 или ARM, уже ведь советовал выше), или взять реальную задачу и попробовать её реализовать имеющимися и запланированными командами. Например перевод числа из десятичной системы в двоичную и обратно, вычисление какой-нибудь константы (пи, золотого сечения, е, логарифма 10 по основанию 2, да любой нетривиальной) через ряд или цепные дроби или любым другим несложным методом, CRC16/32 посчитать без таблиц (это на логические операции и сдвиги), нормирования массива на максимум, вычисление кубического корня методом Ньютона из хотя бы 16-ти битного целого числа, решение квадратного или кубического уравнения (хотя бы в целых числах, лучше тоже минимум 16-ти битных), расчёт простых чисел до миллиона методом делений, двух-трёхзвенный цифровой фильтр с КИХ и показом результата усреднения человеку, решение произвольного уравнения методом Ньютона или секущих, да полно реальных несложных задач ведь. И будет понятно каких возможностей не хватает "для полного счастья". Уже для преобразования чисел более 255 вылезет необходимость длинных множителей с произведением и делимого с частным (попробуйте написать без них, только с умножением 8х8=8 и делением 8/8=8+0 (т.е. без остатка), ну-ну!), а без этого ведь ни ввести исходные данные "по человечески", ни показать результат.