You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.4 KiB
50 lines
1.4 KiB
Arithmetic instructions
|
|
=======================
|
|
|
|
Document conventions
|
|
--------------------
|
|
|
|
Notation: ``Rd, Rm, Rn`` denote ARM registers R0-R7. ``immN`` denotes an immediate
|
|
value having a width of N bits e.g. ``imm8``, ``imm3``. ``carry`` denotes
|
|
the carry condition flag, ``not(carry)`` denotes its complement. In the case of instructions
|
|
with more than one register argument, it is permissible for some to be identical. For example
|
|
the following will add the contents of R0 to itself, placing the result in R0:
|
|
|
|
* add(r0, r0, r0)
|
|
|
|
Arithmetic instructions affect the condition flags except where stated.
|
|
|
|
Addition
|
|
--------
|
|
|
|
* add(Rdn, imm8) ``Rdn = Rdn + imm8``
|
|
* add(Rd, Rn, imm3) ``Rd = Rn + imm3``
|
|
* add(Rd, Rn, Rm) ``Rd = Rn +Rm``
|
|
* adc(Rd, Rn) ``Rd = Rd + Rn + carry``
|
|
|
|
Subtraction
|
|
-----------
|
|
|
|
* sub(Rdn, imm8) ``Rdn = Rdn - imm8``
|
|
* sub(Rd, Rn, imm3) ``Rd = Rn - imm3``
|
|
* sub(Rd, Rn, Rm) ``Rd = Rn - Rm``
|
|
* sbc(Rd, Rn) ``Rd = Rd - Rn - not(carry)``
|
|
|
|
Negation
|
|
--------
|
|
|
|
* neg(Rd, Rn) ``Rd = -Rn``
|
|
|
|
Multiplication and division
|
|
---------------------------
|
|
|
|
* mul(Rd, Rn) ``Rd = Rd * Rn``
|
|
|
|
This produces a 32 bit result with overflow lost. The result may be treated as
|
|
signed or unsigned according to the definition of the operands.
|
|
|
|
* sdiv(Rd, Rn, Rm) ``Rd = Rn / Rm``
|
|
* udiv(Rd, Rn, Rm) ``Rd = Rn / Rm``
|
|
|
|
These functions perform signed and unsigned division respectively. Condition flags
|
|
are not affected.
|
|
|