sub

sub

Asembler RISC-V Referencja

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

sub odejmuje wartość z jednego rejestru od wartości z drugiego i zapisuje wynik do trzeciego. Działa na rejestrach, czyli niewielkich, ponumerowanych komórkach pamięci wewnątrz procesora, z których każda mieści jedną liczbę 32-bitową.

Poniżej przedstawiono formę sub, a wynikiem jest rd = rs1 - rs2. rd to rejestr docelowy, do którego trafia wynik. rs1 i rs2 to rejestry źródłowe. Kolejność ma znaczenie, a jej odwrócenie jest częstym błędem popełnianym przez początkujących.

sub rd, rs1, rs2

Następna linia oblicza różnicę t0 minus t1. Źródło po lewej stronie to wartość, od której odejmowana jest druga wartość.

sub t2, t0, t1

Nie ma instrukcji subi służącej do odejmowania stałej. Instrukcja addi akceptuje stałe ujemne, więc odejmowanie stałej liczby oznacza dodanie jej ujemnej wartości. Następna linia zmniejsza wartość t0 o jeden.

addi t0, t0, -1

RISC-V posiada specjalny rejestr o nazwie zero, który zawsze przechowuje wartość 0. Odejmowanie liczby od zero powoduje zmianę jej znaku, więc następna linia umieszcza wartość ujemną t1 w t0. Instrukcja neg jest skrótem tej operacji.

sub t0, zero, t1

Podręcznik RISC-V definiuje instrukcję sub jako odejmowanie rs2 od rs1. Przepełnienie jest ignorowane, a do rejestru rd zapisywane są tylko najniższe bity wyniku o długości XLEN, gdzie XLEN oznacza szerokość rejestru w bitach, która w tym przypadku wynosi 32. Podręcznik wymienia również rejestr x0, który w tym symulatorze nosi nazwę zero, jako zarejestrowany na stałe z wartością, w której wszystkie bity mają wartość 0.

W przykładzie 10 minus 4 daje w wyniku 6 w t2. Zamiana dwóch źródeł daje -6, co procesor zapisuje zgodnie z własnym schematem dla liczb ujemnych.

Przykład

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