5. Instrukcje arytmetyczne¶
5.1. Konwencje dokumentu¶
Notacja: Rd, Rm, Rn oznaczają rejestry ARM R0-R7. immN oznacza wartość natychmiastową o szerokości N bitów, np. imm8, imm3. carry oznacza flagę warunku przeniesienia, not(carry) oznacza jej dopełnienie. W przypadku instrukcji z więcej niż jednym argumentem rejestrowym dopuszczalne jest, aby niektóre z nich były identyczne. Na przykład poniższa instrukcja doda zawartość R0 do siebie samej, umieszczając wynik w R0:
add(r0, r0, r0)
Instrukcje arytmetyczne wpływają na flagi warunku, o ile nie zaznaczono inaczej.
5.2. Dodawanie¶
add(Rdn, imm8)
Rdn = Rdn + imm8add(Rd, Rn, imm3)
Rd = Rn + imm3add(Rd, Rn, Rm)
Rd = Rn + Rmadc(Rd, Rn)
Rd = Rd + Rn + carry
5.3. Odejmowanie¶
sub(Rdn, imm8)
Rdn = Rdn - imm8sub(Rd, Rn, imm3)
Rd = Rn - imm3sub(Rd, Rn, Rm)
Rd = Rn - Rmsbc(Rd, Rn)
Rd = Rd - Rn - not(carry)
5.4. Negacja¶
neg(Rd, Rn)
Rd = -Rn
5.5. Mnożenie i dzielenie¶
mul(Rd, Rn)
Rd = Rd * Rn
Daje to wynik 32-bitowy z utratą nadmiaru. Wynik może być traktowany jako liczba ze znakiem lub bez znaku, zgodnie z definicją operandów.
sdiv(Rd, Rn, Rm)
Rd = Rn / Rmudiv(Rd, Rn, Rm)
Rd = Rn / Rm
Funkcje te wykonują odpowiednio dzielenie ze znakiem i bez znaku. Flagi warunku nie są naruszane.