rem

rem

RISC-V Ассемблер Ссылка

lyszt.net охватывает rem и другие инструкции RISC-V более подробно.

Формат кодирования

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

Описание

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