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

Деление на ноль выделено оранжевым цветом, переполнение синим. Попробуйте этот тест на своём компьютере - результаты варьируются для разных типов процессора и операционных систем.
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org