vak: (Default)
[personal profile] vak
В архитектуре ARMv6-M отсутствует машинная команда целочисленного деления. Без деления по жизни несколько неудобно, поэтому в микроконтроллере RP2040 добавили отдельный аппаратный целочисленный делитель в виде нескольких регистров. Записываем делимое в регистр DIVIDEND, делитель в DIVISOR, и через 8 тактов извлекаем частное из регистра QUOTIENT и остаток из REMAINDER. Дёшево и сердито.

Прерываний/исключений для делителя не предусмотрено. Возникает классический вопрос: чего ждать при делении на ноль или переполнении. В документации тишина, поэтому пишем простой тест. Отдельно проверяем знаковое, отдельно беззнаковое деление. Прогоняем на реальном микроконтроллере:
Signed:
100 / 9 -> 11, rem 1
-100 / 9 -> -11, rem -1
100 / -9 -> -11, rem 1
-100 / -9 -> 11, rem -1
100 / 0 -> -1, rem 100
-100 / 0 -> 1, rem -100
0 / 0 -> -1, rem 0

-2147483648 / -1 -> -2147483648, rem 0
2147483647 / 3 -> 715827882, rem 1
Unsigned:
100 / 9 -> 11, rem 1
100 / 0 -> 4294967295, rem 100
0 / 0 -> 4294967295, rem 0

4294967295 / 3 -> 1431655765, rem 0

Деление на ноль выделено оранжевым цветом, переполнение синим. Попробуйте этот тест на своём компьютере - результаты варьируются для разных типов процессора и операционных систем.

Date: 2023-10-03 08:52 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Согласья точно нет. Например, делитель от DesignWare при делении на 0 возвращает всеед и в частном, и в остатке.

Кстати,

Гуглоперевод: For example, the DesignWare divisor when divided by 0 returns both the quotient and the remainder.

Бингоперевод: For example, the divisor from DesignWare, when divided by 0, returns the all-eater in both the quotient and the remainder.

Мораль: лучше пользоваться бингопереводом.
Edited Date: 2023-10-03 08:56 (UTC)

Date: 2023-10-03 13:35 (UTC)
ufm: (Default)
From: [personal profile] ufm
чатгпт:
For example, the divisor from DesignWare, when divided by 0, returns zero in both the quotient and the remainder.

Date: 2023-10-03 16:29 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Типично, да.