4.4 MOV および MVN を使用したイミディエート値のロード

MOV 命令と MVN 命令は、イミディエート値の範囲をレジスタに書き出すことができます。

ARM 状態の場合は以下のとおりです。
  • MOV では、0x00xFF(0 ~ 255)の範囲内にある任意の 8 ビットイミディエート値をロードできます。
    これらの値は任意の偶数ビット分ローテートすることもできます。
    多くのデータ処理命令では、これらの値を別の命令でロードせずに、イミディエートオペランドとして使用することもできます。
  • MVN では、これらの値のビット単位の補数をロードできます。その数値は -(n+1) です。 n MOV で使用できる値です。
  • ARMv6T2 以降のアーキテクチャの場合、MOV では、0x00xFFFF(0 ~ 65535)の範囲内にある任意の 16 ビットの数値をロードできます。
次の表は、1 つの ARM 命令(データ処理命令)MOV または MVN でロードできる 8 ビットの値の範囲を示しています。ロードする値は、ステップ列に示している値の倍数である必要があります。

表 4-1 ARM 状態のイミディエート値(8 ビット)

バイナリ 10 進数 ステップ 16 進数 MVN の値a 注釈
000000000000000000000000abcdefgh 0-255 1 0 ~ 0xFF –1 ~ –256 -
0000000000000000000000abcdefgh00 0-1020 4 0 ~ 0x3FC –4 ~ –1024 -
00000000000000000000abcdefgh0000 0-4080 16 0 ~ 0xFF0 –16 ~ –4096 -
000000000000000000abcdefgh000000 0-16320 64 0 ~ 0x3FC0 –64 ~ –16384 -
... ... ... ... ... -
abcdefgh000000000000000000000000 0 ~ 255 x 224 224 0 ~ 0xFF000000 1 ~ 256 x –224 -
cdefgh000000000000000000000000ab (ビットパターン) - - (ビットパターン) 備考の b を参照
efgh000000000000000000000000abcd (ビットパターン) - - (ビットパターン) 備考の b を参照
gh000000000000000000000000abcdef (ビットパターン) - - (ビットパターン) 備考の b を参照
次の表は、ARMv6T2 以降の 1 つの MOV ARM 命令でロードできる 16 ビットの値の範囲を示しています。

表 4-2 MOV 命令に使用できる ARM 状態のイミディエート値

バイナリ 10 進数 ステップ 16 進数 MVN の値 注釈
0000000000000000abcdefghijklmnop 0-65535 1 0 ~ 0xFFFF - 備考の c を参照

以下は、両方の表に関する追加説明です。
a
MVN の値は、MVN 命令でオペランドとして直接使用することしかできません。
b
これらの値は、ARM 状態でのみ使用できます。この表に記載した他の値はいずれも、32 ビット Thumb 命令でも使用できます。
c
これらの値は、ARMv6T2 以降のアーキテクチャでのみ使用できます。これらの値は、他の命令ではオペランドとして直接使用することはできません。
ARMv6T2 以降のアーキテクチャの Thumb 状態での、MOV 命令と MVN 命令を使用したロードについて以下に示します。
  • 32 ビットの MOV 命令では、以下をロードできます。
    • 0x00xFF(0 ~ 255)の範囲内にある任意の 8 ビットイミディエート値。
    • 任意のビット数だけ左シフトした任意の 8 ビットイミディエート値。
    • レジスタのすべての 4 バイトに対して複製した任意の 8 ビットパターン。
    • バイト 1 と 3 がゼロに設定されているときに、バイト 0 と 2 に対して複製した任意の 8 ビットパターン。
    • バイト 0 と 2 がゼロに設定されているときに、バイト 1 と 3 に対して複製した任意の 8 ビットパターン。
    多くのデータ処理命令では、これらの値を別の命令でロードせずに、イミディエートオペランドとして使用することもできます。
  • 32 ビットの MVN 命令では、これらの値のビット単位の補数をロードできます。その数値は -(n+1) です。 ここで、 n MOV で使用できる値です。
  • 32 ビットの MOV 命令では、0x00xFFFF(0 ~ 65535)の範囲内にある任意の 16 ビットの数値をロードできます。これらの値は、データ処理命令ではイミディエートオペランドとして使用することはできません。
Thumb をサポートしているアーキテクチャの場合、16 ビット Thumb MOV 命令では、0 ~ 255 の範囲内にある任意のイミディエート値をロードできます。
次の表は、1 つの 32 ビット Thumb MOV 命令または MVN 命令(データ処理命令)でロードできる値の範囲を示しています。ロードする値は、ステップ列に示している値の倍数である必要があります。

表 4-3 32 ビット Thumb のイミディエート値

バイナリ 10 進数 ステップ 16 進数 MVN の値a 注釈
000000000000000000000000abcdefgh 0-255 1 0x00xFF –1 ~ –256 -
00000000000000000000000abcdefgh0 0-510 2 0x00x1FE –2 ~ –512 -
0000000000000000000000abcdefgh00 0-1020 4 0x00x3FC –4 ~ –1024 -
... ... ... ... ... -
0abcdefgh00000000000000000000000 0 ~ 255 x 223 223 0x00x7F800000 1 ~ 256 x –223 -
abcdefgh000000000000000000000000 0 ~ 255 x 224 224 0x00xFF000000 1 ~ 256 x –224 -
abcdefghabcdefghabcdefghabcdefgh (ビットパターン) - 0xXYXYXYXY 0xXYXYXYXY -
00000000abcdefgh00000000abcdefgh (ビットパターン) - 0x00XY00XY 0xFFXYFFXY -
abcdefgh00000000abcdefgh00000000 (ビットパターン) - 0xXY00XY00 0xXYFFXYFF -
00000000000000000000abcdefghijkl 0-4095 1 0x00xFFF - 備考の b を参照
次の表は、 MOV 32 ビット Thumb 命令でロードできる 16 ビットの値の範囲を示しています。

表 4-4 MOV 命令に使用できる 32 ビット Thumb のイミディエート値

バイナリ 10 進数 ステップ 16 進数 MVN の値 注釈
0000000000000000abcdefghijklmnop 0-65535 1 0x00xFFFF - 備考の c を参照

以下は、表に関する追加説明です。
a
MVN の値は、MVN 命令でオペランドとして直接使用することしかできません。
b
これらの値は、ADDSUB、および MOV 命令では直接オペランドとして使用できますが、MVN や他のデータ処理命令では直接オペランドとして使用できません。
c
これらの値は、MOV 命令でのみ使用できます。
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.
使用できないイミディエート値を使用して命令を記述した場合、アセンブラは以下のエラーを通知します。イミディエート n がこの操作の範囲外です。
関連する概念
4.3 イミディエート値のロード
非機密扱いPDF file icon PDF 版ARM DUI0473KJ
Copyright © 2010-2014 ARM.All rights reserved.