rem
lyszt.net охватывает rem и другие инструкции RISC-V более подробно.
Формат кодирования
Описание
rem возвращает остаток от деления, то есть то, что осталось после деления. При делении 17 на 5 получается 3 целых и 2 в остатке. div возвращает 3, а rem возвращает 2. Название — сокращение от remainder (остаток). Форма записи показана ниже и означает rd = остаток от деления rs1 на rs2.
rem rd, rs1, rs2
Она относится к тому же необязательному математическому расширению M, что и div.
Обе инструкции работают с одной и той же парой чисел и вместе дают частное и то, что осталось. rem — это ассемблерная форма оператора % (взятия по модулю) в языках высокого уровня.
С отрицательными числами остаток принимает знак делимого числа. 7 остаток 2 равно 1, а -7 остаток 2 равно -1. Проверка на нечётность, которая проверяет, равен ли остаток от деления на 2 единице, даёт неверный ответ для отрицательных чисел. Проверка того, равен ли остаток нулю, определяет чётность или нечётность для любого знака.
Руководство RISC-V говорит, что rem даёт остаток от соответствующего деления и что ненулевой результат имеет знак делимого. Любое деление, которое не приводит к переполнению, удовлетворяет равенству делимое = делитель умножить на частное плюс остаток. Остаток от деления на ноль равен делимому, а случай знакового переполнения — самое отрицательное число, делённое на -1, — даёт остаток, равный нулю. Чтобы получить частное и остаток от одного и того же деления, руководство рекомендует выполнить div, а затем rem над одними и теми же операндами, что процессор может объединить в одно деление.
Остатки используются, чтобы вернуть счётчик к началу буфера, чтобы снять цифры с числа и чтобы распределить элементы по слотам. Остаток от деления на ноль возвращает исходное число. В примере вычисляется 17 остаток 5, и в t2 остаётся 2.
Пример
li t0, 17 li t1, 5 rem t2, t0, t1 # t2 = 2
