rem

rem

Asembler RISC-V Referencja

lyszt.net obejmuje rem i inne instrukcje RISC-V w większych szczegółach.

Format kodowania

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

Opis

Funkcja rem zwraca resztę z dzielenia, czyli pozostałą część. Dzielenie liczby 17 przez 5 daje 3 części i resztę równą 2. Instrukcja div zwraca wartość 3, a rem – 2. Nazwa ta jest skrótem od słowa „remainder” (reszta). Poniżej przedstawiono jej postać, która oznacza, że rd = reszta z dzielenia rs1 przez rs2.

rem rd, rs1, rs2

Należy do tego samego opcjonalnego rozszerzenia matematycznego języka M, co div.

Obie instrukcje działają na tej samej parze liczb i razem zwracają iloraz oraz resztę. rem jest asemblerową formą operatora % (modulo) występującego w językach wyższego poziomu.

W przypadku liczb ujemnych reszta przyjmuje znak dzielonej liczby. Reszta z dzielenia 7 przez 2 wynosi 1, a reszta z dzielenia -7 przez 2 wynosi -1. Test na liczby nieparzyste, sprawdzający, czy reszta z dzielenia przez 2 wynosi 1, daje błędny wynik w przypadku liczb ujemnych. Sprawdzenie, czy reszta wynosi zero, pozwala określić, czy liczba jest parzysta czy nieparzysta, niezależnie od jej znaku.

Podręcznik RISC-V podaje, że rem zwraca resztę z odpowiedniego dzielenia oraz że wynik niezerowy ma znak dzielonego. Każde dzielenie, które nie powoduje przepełnienia, spełnia równanie: dzielony = dzielnik pomnożony przez iloraz plus reszta. Reszta z dzielenia przez zero jest równa dzielnej, a w przypadku przepełnienia ze znakiem, gdy najujemniejsza liczba jest dzielona przez -1, reszta wynosi zero. Aby uzyskać iloraz i resztę z tego samego dzielenia, podręcznik zaleca użycie funkcji div, a następnie rem na tych samych operandach, co procesor może połączyć w jedno dzielenie.

Reszty są wykorzystywane do zawracania licznika do początku bufora, do usuwania cyfr z liczby oraz do rozdzielania elementów między komórki. Reszta z dzielenia przez zero zwraca pierwotną liczbę. W przykładzie obliczono 17 z resztą 5 i pozostawiono 2 w t2.

Przykład

li t0, 17
li t1, 5
rem t2, t0, t1   # t2 = 2