rem

rem

RISC-V Assembler Referenz

lyszt.net behandelt rem und andere RISC-V-Befehle ausführlicher.

Kodierungsformat

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

Beschreibung

rem gibt den Rest einer Division zurück, also den Betrag, der übrig bleibt. Teilt man 17 durch 5, so geht das 3-mal mit 2 als Rest. div liefert die 3 und rem liefert die 2. Der Name ist die Kurzform von remainder (Rest). Die Form ist unten dargestellt und bedeutet rd = der Rest von rs1 geteilt durch rs2.

rem rd, rs1, rs2

Sie gehört zur selben optionalen M-Mathematikerweiterung wie div.

Die beiden Anweisungen arbeiten mit demselben Zahlenpaar und ergeben zusammen den Quotienten und den Rest. rem ist die Assemblerform des %-Operators (Modulo) in höheren Programmiersprachen.

Bei negativen Zahlen nimmt der Rest das Vorzeichen der Zahl an, die geteilt wird. 7 Rest 2 ist 1, und -7 Rest 2 ist -1. Ein Test auf ungerade Zahlen, der prüft, ob der Rest durch 2 gleich 1 ist, liefert bei negativen Zahlen das falsche Ergebnis. Die Prüfung, ob der Rest null ist, entscheidet bei jedem Vorzeichen über gerade oder ungerade.

Das RISC-V-Handbuch sagt, dass rem den Rest der entsprechenden Division liefert und dass ein von null verschiedenes Ergebnis das Vorzeichen des Dividenden hat. Jede Division, die nicht überläuft, erfüllt Dividend = Divisor mal Quotient plus Rest. Ein Rest durch null ergibt den Dividenden, und der Fall des vorzeichenbehafteten Überlaufs, die negativste Zahl geteilt durch -1, ergibt einen Rest von null. Um den Quotienten und den Rest derselben Division zu erhalten, empfiehlt das Handbuch, div und dann rem auf dieselben Operanden anzuwenden, was ein Prozessor zu einer einzigen Division verschmelzen kann.

Reste werden verwendet, um einen Zähler an den Anfang eines Puffers zurückzusetzen, um Ziffern von einer Zahl abzunehmen und um Elemente über Slots zu verteilen. Ein Rest durch null gibt die ursprüngliche Zahl zurück. Das Beispiel berechnet 17 Rest 5 und hinterlässt 2 in t2.

Beispiel

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