sub

sub

Assembly RISC-V Referência

lyszt.net aborda sub 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

sub subtrai o valor de um registro de outro e grava o resultado em um terceiro. Ele opera com registros, os pequenos compartimentos de armazenamento numerados dentro do processador, cada um contendo um número de 32 bits.

A sintaxe de sub é mostrada abaixo, e o resultado é rd = rs1 - rs2. rd é o registro de destino, para onde o resultado é enviado. rs1 e rs2 são os registros de origem. A ordem é importante, e invertê-la é um erro comum entre iniciantes.

sub rd, rs1, rs2

A próxima linha calcula t0 menos t1. A fonte à esquerda é o valor do qual se subtrai.

sub t2, t0, t1

Não existe uma instrução subi para subtrair uma constante. A instrução addi aceita constantes negativas; portanto, subtrair um número fixo significa somar seu negativo. A próxima linha diminui o valor de t0 em um.

addi t0, t0, -1

O RISC-V possui um registro especial chamado zero que sempre contém o valor 0. Subtrair um número de zero inverte seu sinal; portanto, a próxima linha coloca o negativo de t1 em t0. A instrução neg é uma forma abreviada para isso.

sub t0, zero, t1

O manual do RISC-V define sub como a subtração de rs2 de rs1. O estouro é ignorado e apenas os bits inferiores de XLEN do resultado são gravados em rd, sendo que XLEN é a largura do registro em bits, que neste caso é 32. O manual também lista o registro x0, que este simulador denomina zero, como predefinido com um valor em que todos os bits são 0.

No exemplo, 10 menos 4 resulta em 6 em t2. Trocar as duas fontes resulta em -6, que o processador armazena em seu próprio esquema para números negativos.

Exemplo

li t0, 10
li t1, 4
sub t2, t0, t1   # t2 = 6