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