Случай с делением совсем не так симметричен. У меня также есть для вас некоторые плохие новости:
Все современные 16-разрядные процессоры поддерживают целочисленное деление. Спецификации изготовителей описывают эту операцию как 32 x 16 бит деление, означающее, что вы можете разделить 32-разрядное делимое на 16-разрядный делитель. Вот плохая новость:
Они вам лгут!!!
Если вы не верите в это, попробуйте разделить любое большое 32-разрядное число (это означает, что оно имеет ненулевые биты в старших 16 разрядах) на целое число 1. Вы гарантированно получите исключение переполнения.
Проблема состоит в том, что эта команда в действительности требует, чтобы получаемое частное вписывалось в 16-разрядный результат. Этого не случится, если делитель достаточно большой. Когда любое число делится на единицу, частное будет конечно тем же самым, что и делимое.
С начала времен (ну во всяком случае компьютерных) архитекторы ЦПУ предусматривали этот маленький подводный камень в схеме деления. Это обеспечивает некоторую симметрию, так как это своего рода инверсия способа каким работает умножение. Но так как единица - это совершенно допустимое (и довольно частое) число для использования в качестве делителя, делению, реализованному аппаратно, требуется некоторая помощь от программистов.
Подразумевает следующее:
·
Тип частного всегда должен быть того же самого типа, что и делимое. Он независим от делителя.
· Несмотря на то, что ЦПУ поддерживает деление длинного слова, аппаратно предоставленной инструкции можно доверить только делимые байт и слово. Для делимых типа длинное слово нам необходима другая библиотечная подпрограмма, которая может возвращать длинный результат.
Это похоже на работу для другой таблицы, для суммирования требуемых действий:
| T1
T2 | B | W | L | ||||
| B | Преобразовать D0 в W
Преобразовать D7 в L DIVS Result = B | Преобразовать D0 в W
Преобразовать D7 в L DIVS Result = W | Преобразовать D0 в L
JSR DIV32 Result = L | ||||
| W | Преобразовать D7 в L
DIVS Result = B | Преобразовать D7 в L
DIVS Result = W | Преобразовать D0 в L
JSR DIV32 Result = L | ||||
| L | Преобразовать D7 в L
JSR DIV32 Result = B | Преобразовать D7 в L
JSR DIV32 Result = W | JSR DIV32
Result = L |