Programming with 64-Bit ARM Assembly Language: Single Board Computer Development for Raspberry Pi and Mobile Devices

4. Controlling Program Flow


2021.08.12: updated by

Unconditional Branch

  B  label
label は現在のPCからの相対オフセットで解釈される。 命令中に26 bitあり、どちらの方向にでも32 mega-wordの範囲で指定できる。 [自分へのメモ] 20bitで1 Mega。5bitで32。残り1bitで正負を表すことができる。 wordは4byteなので 32*4=128 mega-byte のオフセットを両方向に指定できる。 imm26 は 符号付き整数である。全ての命令は4byte=32bitである。

条件フラグ

これらのフラグは NZCV レジスタに保持される。 このレジスタはoperating system の特権命令からのみアクセスできる。 ユーザモードでは、命令はこのレジスタを参照することなく、個々のフラグにアクセスする。 これらのフラグは、命令のオペコードの最後に'S'を追加したときのみセットできる。 そうでない場合は、フラグは変更されない。 唯一の例外は、下で述べる比較命令である。

Branch on Condition 条件ジャンプ

  B.{condition}  label
  [例]
  B.EQ  _start    ; B.Z でないのは、比較命令の後で呼ぶため

CMP 命令

  CMP  Xn,  Operand2
[例]
  CMP  W4,  #45
  B.EQ  _start
  {condition}	Flags		Meaning
  -----------------------------------------------
  EQ		Z set		Equal
  NE		Z clear		Not equal
  CS or HS	C set		Higher or Same (unsigned >=)
  CC or LO	C clear		Lower (unsigned < )
  MI		N set		Negative
  PL		N clear		Posivive or Zero
  VS		V set		Overflow
  VC		V clear		No overflow
  HI		C set and Z clear	Higher (unsigned >)
  LS		C clear and Z set	Lower of same (unsigned <=)
  GE		N and V the same	Signed >=
  LT		N and V differ	Signed <
  GT		Z clear, N and V the same	Signed >
  LE		Z set, N and V differ	Signed <=
  AL		Any		Always (same as no suffix)

Loops

for i=0 to 10
    ... some statements ...
------------------------

    MOV  W2,  #1         // W2 = 1
loop:
    ADD  W2,  W2,  #1    // W2 = W2 + 1
    CMP  W2,  #10
    B.LE loop           // if W2 <=10 goto loop
for i=10 to 1 STEP -1
    ... some statements ...
------------------------

    MOV  W2,  #10         // W2 = 10
loop:
    SUBS  W2,  W2,  #1    // W2 = W2 - 1
    B.NE  loop            // if W2 > 0 goto loop
SUBS ではオペコードの最後に 'S' が付加されているので、CMP命令が必要ない。

While Loops

WHILE  X  <  5
   ... other statements ...
END WHILE

----------------------------
loop:
    CMP W4, #5
    B.GE loopdone
    // ... other statements ...
    B  loop
loopdone:

If/Then/Else

IF  W5  <  10 THEN
    ... if-statements ...
ELSE
    ... else-statements ...
END IF
----------------------------
    CMP  W5,  #10
    B.GE  elseclause
    ... if-statements ...
    B endif
elseclause:
    ... else-statements ...
endif:

Logical Operators 論理命令

  AND{S}  Xd, Xs,  Operand2    // AND
  EOR{S}  Xd, Xs,  Operand2    // Exclusive OR
  ORR{S}  Xd, Xs,  Operand2    // OR
  BIC{S}  Xd, Xs,  Operand2    // Bit Clear Xd := (Xs & (! Operand2))

More Comparison Instructions

   CMN  Xn,  Operand2
   TST  Xn,  Operand2

CMP 命令は Xn と Openrand2 の減算の結果でフラグを設定する。 CMN (CoMpare Negative) 命令は、Xn と Operand2 の加算の結果でフラグを設定する。 TST命令は Xn と Operand2 のビット毎のANDの結果でフラグを設定する。



http://karel.tsuda.ac.jp/