A32

読み:エイさんじゅうに
外語:A32 英語
品詞:名詞

AArch32(古い呼称でARMステート)で使われている、32ビット環境用の32ビット固定長の命令セット。

目次

従来からある32ビットの命令セットである。

Thumb命令が登場するまでは唯一の命令セットだった。Thumb命令が登場後、呼び分けが必要となり、従来命令を使うモードを「ARMステート」、新たなThumb命令を使うモードを「Thumbステート」と、各々呼ばれるようになった。

更にARMv8が登場し64ビット化されて以降は、AArch32というアーキテクチャに属する2つの命令セットのうちの一つ「A32」と呼ばれるようになった。

命令

AArch32の命令セット(A32)には、次のような特徴がある。

  • 32ビット固定長
  • 3オペランド命令4オペランド命令
  • 全ての命令に条件フィールドがあり、実行条件付きで実行できる
  • 演算命令などを中心に、シフト機能が付いている
  • 代入時のイミディエイトは8ビット長しか使えない
  • メモリーアクセスはPC相対を基本とする

実行条件付き命令

ARMの提供するマニュアルには、使用例としてユークリッドの互除法の計算が掲載されている。

Cで書いた場合、次のような処理になる。

int gcd(int a, int b)
{
    while (a != b)
    {
        if (a > b)
            a = a - b;
        else
            b = b - a;
    }
    return a;
}

これを、一般的なCPUと同様にARMで記述した場合、次のようになるだろう。

gcd     CMP     r0, r1
        BEQ     end
        BLT     less
        SUB     r0, r0, r1
        B       gcd
less
        SUB     r1, r1, r0
        B       gcd
end

さて、ARMには全ての命令に実行条件を付けることができるため、次のように、僅か4命令で書くことができる。

gcd     CMP     r0, r1
        SUBGT   r0, r0, r1
        SUBLT   r1, r1, r0
        BNE     gcd

様々な条件で、コードサイズが小さくなり、実行速度も速くなる。

ただ、一般的なCコンパイラーでは、ここまで最適化する能力を持たないため、必ずしもここまで効率化できるとは限らない。

オペコード

基本構造

3130292827262524232221201918171615141312111009080706050403020100
condop1 op 

殆どのARM命令はビット31〜28で実行条件をつけることが可能で、ビット27〜25で主要な細分化が行なわれている。

あとからの拡張の影響で、一部につきビット4を主要な細分化に用いているものがある。

condop1op命令クラス
1111
以外
00xxデータ処理とその他の命令
010xワードと符号なしバイトのロード/ストア
0110
0111メディア命令
10xx分岐、リンク付き分岐、ブロックデータ転送
11xxシステムコール、コプロセッサー命令(VFP/Advanced SIMDを含む)
1111xxxx無条件命令

cond≠0b1111

基本的な命令の配列は次の通り。

※付きは、古いARMでは使えない。

 3130292827262524232221201918171615141312111009080706050403020100
データ処理Cond00IOpCodeSRnRdOperand2
PSR転送
乗算Cond000000ASRdRnRs1001Rm
ロング乗算※Cond00001UASRdHiRdLoRs1001Rm
SWPCond00010B00RnRd00001001Rm
分岐と切り替え※Cond000100101111111111110001Rn
ハーフワードレジスター※Cond000PU0WLRnRd01SH1Rm
ハーフワード即値※Cond000PU1WLRnRdOffset11SH1Offset2
LDR、STRCond01IPUBWLRnRdOffset
未定義Cond011 1 
ブロック転送Cond100PUSWLRnRegister List
分岐Cond101Loffset
コプロデータ転送Cond110PUNWLRnCRdcp_numoffset
コプロデータ処理Cond1110CP opcCRnCRdcp_numCP0CRm
コプロレジスター転送Cond1110CP opcLCRnRdcp_numCP1CRm
ソフトウェア割り込みCond1111情報欄

cond=0b1111

元々cond=0b1111は使用されておらず予約扱いだったが、ARMv5以降に無条件実行のみの拡張命令が配置されるようになり、ARMv6で更に命令が追加された。

3130292827262524232221201918171615141312111009080706050403020100
1111op1Rn op 

次のような命令がある。

op1opRn命令
0xxxxxxxx その他の命令、メモリーのヒント、Advanced SIMD命令
100xx1x0x Store Return State(SRS) [ARMv6〜]
100xx0x1x Return From Exception(RFE) [ARMv6〜]
101xxxxxx 分岐命令(BL、BLX)
11000x11
11001xx1
1101xxx1
x
x
x
1111以外コプロセッサーのロード (イミディエイト)
1111コプロセッサーのロード (リテラル)
11000x10
11001xx0
1101xxx0
x
x
x
 コプロセッサーのストア
11000100x 2つのARMコアレジスターからコプロセッサーへのデータ移動 [ARMv6〜]
11000101x コプロセッサーから2つのARMコアレジスターへのデータ移動 [ARMv6〜]
1110xxxx0 コプロセッサーデータ操作
1110xxx01 ARMコアレジスターからコプロセッサーへのデータ移動
1110xxx11 コプロセッサーからARMコアレジスターへのデータ移動

Cond

  • 0000 = EQ ‐ 等しい (Z=1)
  • 0001 = NE ‐ 等しくない (Z=0)
  • 0010 = CS/HS ‐ ≧(符号無し) (C=1)
  • 0011 = CC/LO ‐ <(符号無し) (C=0)
  • 0100 = MI ‐ 負 (N=1)
  • 0101 = PL ‐ 正またはゼロ (N=0)
  • 0110 = VS ‐ オーバフロー (V=1)
  • 0111 = VC ‐ オーバフローではない (V=0)
  • 1000 = HI ‐ >(符号無し) (C=1 AND Z=0)
  • 1001 = LS ‐ ≦(符号無し) (C=0 OR Z=1)
  • 1010 = GE ‐ ≧(符号あり) (N=V)
  • 1011 = LT ‐ <(符号あり) (N≠V)
  • 1100 = GT ‐ >(符号あり) (Z=0 AND N=V)
  • 1101 = LE ‐ ≦(符号あり) (Z=1 AND N≠V)
  • 1110 = AL ‐ 無条件
  • 1111 = NV ‐ (使用禁止)
用語の所属
ARMアーキテクチャ
AArch32
用語の所属
T32
A64

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club