Load immediate values
using MOV and MVN
In ARM state:
MOV can
load any 8-bit immediate value, giving a range of 0x0-0xFF (0-255).
It can also rotate these values by any even number.
These values are also available as immediate operands in many
data processing operations, without being loaded in a separate instruction.
MVN can load the bitwise complements
of these values. The numerical values are -(n+1), where n is
the value available in MOV.
In ARMv6T2 and later, MOV can load
any 16-bit number, giving a range of 0x0-0xFFFF (0-65535).
Table 6 shows
the range of 8-bit values that can be loaded in a single ARM MOV or MVN instruction
(for data processing operations). The value to load must be a multiple
of the value shown in the Step column.
Table 7 shows
the range of 16-bit values that can be loaded in a single MOV ARM
instruction in ARMv6T2 and later.
Table 6. ARM state immediate values (8-bit)
| Binary | Decimal | Step | Hexadecimal | MVN valuea | Notes |
|---|
000000000000000000000000abcdefgh | 0-255 | 1 | 0-0xFF | -1 to -256 | - |
0000000000000000000000abcdefgh00 | 0-1020 | 4 | 0-0x3FC | -4 to -1024 | - |
00000000000000000000abcdefgh0000 | 0-4080 | 16 | 0-0xFF0 | -16 to -4096 | - |
000000000000000000abcdefgh000000 | 0-16320 | 64 | 0-0x3FC0 | -64 to -16384 | - |
| ... | ... | ... | ... | ... | - |
abcdefgh000000000000000000000000 | 0-255 x 224 | 224 | 0-0xFF000000 | 1-256 x -224 | - |
cdefgh000000000000000000000000ab | (bit pattern) | - | - | (bit pattern) | See b in Note |
efgh000000000000000000000000abcd | (bit pattern) | - | - | (bit pattern) | See b in Note |
gh000000000000000000000000abcdef | (bit pattern) | - | - | (bit pattern) | See b in Note |
Table 7. ARM state immediate values in MOV instructions
| Binary | Decimal | Step | Hexadecimal | MVN value | Notes |
|---|
0000000000000000abcdefghijklmnop | 0-65535 | 1 | 0-0xFFFF | - | See c in Note |
Note
These notes give extra information on Table 6 and Table 7.
- a
The MVN values are only available directly
as operands in MVN instructions.
- b
These values are available
in ARM state only. All the other values in this table are also available
in 32-bit Thumb.
- c
These values are only
available in ARMv6T2 and later. They are not available directly
as operands in other instructions.
In Thumb state in ARMv6T2 and later:
the 32-bit MOV instruction can load:
any 8-bit immediate value,
giving a range of 0x0-0xFF (0-255)
any 8-bit immediate value, shifted left by any number
any 8-bit pattern duplicated in all four bytes of
a register
any 8-bit pattern duplicated in bytes 0 and 2, with
bytes 1 and 3 set to 0
any 8-bit pattern duplicated in bytes 1 and 3, with
bytes 0 and 2 set to 0.
These values are also available as immediate operands in many
data processing operations, without being loaded in a separate instruction.
the 32-bit MVN instruction can load
the bitwise complements of these values. The numerical values are -(n+1),
where n is the value
available in MOV.
the 32-bit MOV instruction can load
any 16-bit number, giving a range of 0x0-0xFFFF (0-65535).
These values are not available as immediate operands in data processing operations.
In architectures with Thumb, the 16-bit Thumb MOV instruction
can load any immediate value in the range 0-255.
Table 8 shows
the range of values that can be loaded in a single 32-bit Thumb MOV or MVN instruction
(for data processing operations). The value to load must be a multiple
of the value shown in the Step column.
Table 9 shows
the range of 16-bit values that can be loaded by the MOV 32-bit
Thumb instruction.
Table 8. 32-bit Thumb immediate values
| Binary | Decimal | Step | Hexadecimal | MVN valuea | Notes |
|---|
000000000000000000000000abcdefgh | 0-255 | 1 | 0-0xFF | -1 to -256 | - |
00000000000000000000000abcdefgh0 | 0-510 | 2 | 0-0x1FE | -2 to -512 | - |
0000000000000000000000abcdefgh00 | 0-1020 | 4 | 0-0x3FC | -4 to -1024 | - |
| ... | ... | ... | ... | ... | - |
0abcdefgh00000000000000000000000 | 0-255 x 223 | 223 | 0-0x7F800000 | 1-256 x -223 | - |
abcdefgh000000000000000000000000 | 0-255 x 224 | 224 | 0-0xFF000000 | 1-256 x -224 | - |
abcdefghabcdefghabcdefghabcdefgh | (bit pattern) | - | 0xXYXYXYXY | 0xXYXYXYXY | - |
00000000abcdefgh00000000abcdefgh | (bit pattern) | - | 0x00XY00XY | 0xFFXYFFXY | - |
abcdefgh00000000abcdefgh00000000 | (bit pattern) | - | 0xXY00XY00 | 0xXYFFXYFF | - |
00000000000000000000abcdefghijkl | 0-4095 | 1 | 0-0xFFF | - | See b in Note |
Table 9. 32-bit Thumb immediate values in MOV instructions
| Binary | Decimal | Step | Hexadecimal | MVN value | Notes |
|---|
0000000000000000abcdefghijklmnop | 0-65535 | 1 | 0-0xFFFF | - | See c in Note |
Note
These notes give extra information on Table 8 and Table 9.
- a
The MVN values
are only available directly as operands in MVN instructions.
- b
These values are available
directly as operands in ADD, SUB, and MOV instructions, but
not in MVN or any other data processing instructions.
- c
These values are only
available in MOV instructions.
In both ARM and Thumb, you do not have to decide whether to
use MOV or MVN. The assembler uses whichever
is appropriate. This is useful if the value is an assembly-time
variable.
If you write an instruction with an immediate value that is
not available, the assembler reports the error: Immediate n out
of range for this operation.
See also