rem

rem

Assembly RISC-V Referência

lyszt.net aborda rem e outras instruções RISC-V com mais detalhes.

Formato de codificação

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

Descrição

rem retorna o resto de uma divisão, ou seja, o valor que sobra. Ao dividir 17 por 5, o número cabe 3 vezes, sobrando 2. div retorna o 3 e rem retorna o 2. O nome é a abreviação de “remainder” (restante). A sintaxe é mostrada abaixo e significa rd = o resto da divisão de rs1 por rs2.

rem rd, rs1, rs2

Pertence à mesma extensão matemática opcional M que div.

As duas instruções operam sobre o mesmo par de números e, juntas, fornecem o quociente e o resto. rem é a forma em linguagem de montagem do operador % (módulo) em linguagens de alto nível.

Com números negativos, o resto assume o sinal do número que está sendo dividido. 7 com resto 2 é 1, e -7 com resto 2 é -1. Um teste para números ímpares que verifica se o resto da divisão por 2 é igual a 1 fornece a resposta errada para números negativos. Verificar se o resto é zero determina se o número é par ou ímpar para qualquer sinal.

O manual do RISC-V afirma que rem fornece o resto da divisão correspondente e que um resultado diferente de zero tem o sinal do dividendo. Toda divisão que não cause estouro satisfaz a relação: dividendo = divisor vezes quociente mais resto. Um resto da divisão por zero é igual ao dividendo, e o caso de estouro com sinal, o número mais negativo dividido por -1, resulta em um resto igual a zero. Para obter o quociente e o resto da mesma divisão, o manual recomenda usar div e, em seguida, rem nos mesmos operandos, o que um processador pode fundir em uma única divisão.

Os restos são usados para fazer um contador voltar ao início de um buffer, para remover dígitos de um número e para distribuir itens entre slots. Um resto por zero retorna o número original. O exemplo calcula 17 com resto 5 e deixa 2 em t2.

Exemplo

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