2.5.1. Direct loading with MOV and MVN

In ARM and Thumb-2, you can use the 32-bit MOV and MVN instructions to load a wide range of constant values directly into a register.

The 16-bit Thumb MOV instruction can load any constant in the range 0-255. You cannot use the 16-bit MVN instruction to load a constant.

ARM state immediate constants shows the range of values that can be loaded in a single instruction in ARM. Thumb-2 immediate constants shows the range of values that can be loaded in a single instruction in Thumb-2.

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 a constant that is not available, the assembler reports the error: Immediate n out of range for this operation.

ARM state immediate constants

In ARM state:

  • MOV can load any 8-bit constant 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 above, MOV can load any 16-bit number, giving a range of 0x0-0xFFFF (0-65535).

Table 2.5 shows the range of 8-bit values that this provides (for data processing operations).

Table 2.6 shows the range of 16-bit values that this provides (for MOV instructions only).

Table 2.5. ARM state immediate constants (8-bit)

BinaryDecimalStepHexadecimalMVN valueaNotes
000000000000000000000000abcdefgh0-25510-0xFF–1 to –256-
0000000000000000000000abcdefgh000-102040-0x3FC–4 to –1024-
00000000000000000000abcdefgh00000-4080160-0xFF0–16 to –4096-
000000000000000000abcdefgh0000000-16320640-0x3FC0–64 to –16384-
 ............-
abcdefgh0000000000000000000000000-255 x 2242240-0xFF0000001-256 x –224-
cdefgh000000000000000000000000ab(bit pattern)--(bit pattern)See b in Notes
efgh000000000000000000000000abcd(bit pattern)--(bit pattern)See b in Notes
gh000000000000000000000000abcdef(bit pattern)--(bit pattern)See b in Notes

Table 2.6. ARM state immediate constants (16-bit)

BinaryDecimalStepHexadecimalMVN valueNotes
0000000000000000abcdefghijklmnop0-6553510-0xFFFF-See c in Notes
Notes

These notes give extra information on Table 2.5 and Table 2.6.

a

The MVN values are not available directly as operands in other, non data processing, instructions.

b

These values are available in ARM state only. All the other values in this table are also available in Thumb-2, except where noted.

c

These values are only available in ARMv6T2 and above. They are not available directly as operands in other instructions.

Thumb-2 immediate constants

In Thumb state, in ARMv6T2 and above:

  • the 32-bit MOV instruction can load:

    • any 8-bit constant value, giving a range of 0x0-0xFF (0-255)

    • any 8-bit constant value, shifted left by any number

    • any 8-bit bit pattern duplicated in all four bytes of a register

    • any 8-bit bit pattern duplicated in bytes 0 and 2, with bytes 1 and 3 set to 0

    • any 8-bit 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.

Table 2.7 shows the range of values that this provides (for data processing operations).

Table 2.8 shows the range of 16-bit values that this provides (for MOV instructions only).

Table 2.7. Thumb state immediate constants

BinaryDecimalStepHexadecimalMVN valueaNotes
000000000000000000000000abcdefgh0-25510-0xFF–1 to –256-
00000000000000000000000abcdefgh00-51020-0x1FE–2 to –512-
0000000000000000000000abcdefgh000-102040-0x3FC–4 to –1024-
 ............-
0abcdefgh000000000000000000000000-255 x 2232230-0x7F8000001-256 x –223-
abcdefgh0000000000000000000000000-255 x 2242240-0xFF0000001-256 x –224-
abcdefghabcdefghabcdefghabcdefgh(bit pattern)-0xXYXYXYXY--
00000000abcdefgh00000000abcdefgh(bit pattern)-0x00XY00XY0xFFXYFFXY-
abcdefgh00000000abcdefgh00000000(bit pattern)-0xXY00XY000xXYFFXYFF-
00000000000000000000abcdefghijkl0-4095 10-0xFFF-See b in Notes

Table 2.8. Thumb state immediate constants (16-bit)

BinaryDecimalStepHexadecimalMVN valueNotes
0000000000000000abcdefghijklmnop0-6553510-0xFFFF-See c in Notes
Notes

These notes give extra information on Table 2.7 and Table 2.8.

a

The MVN values are not available directly as operands in other instructions.

b

These values are available directly as operands in data processing instructions, such as ADD and SUB, but not MVN.

c

These values are only available with MOV instructions.

Copyright © 2002-2005 ARM Limited. All rights reserved.ARM DUI 0204F
Non-Confidential