B labellabel は現在のPCからの相対オフセットで解釈される。 命令中に26 bitあり、どちらの方向にでも32 mega-wordの範囲で指定できる。 [自分へのメモ] 20bitで1 Mega。5bitで32。残り1bitで正負を表すことができる。 wordは4byteなので 32*4=128 mega-byte のオフセットを両方向に指定できる。 imm26 は 符号付き整数である。全ての命令は4byte=32bitである。
B.{condition} label
[例] B.EQ _start ; B.Z でないのは、比較命令の後で呼ぶため
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)
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 loopSUBS ではオペコードの最後に 'S' が付加されているので、CMP命令が必要ない。
WHILE X < 5 ... other statements ... END WHILE ---------------------------- loop: CMP W4, #5 B.GE loopdone // ... other statements ... B loop loopdone:
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:
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))
CMN Xn, Operand2 TST Xn, Operand2
CMP 命令は Xn と Openrand2 の減算の結果でフラグを設定する。 CMN (CoMpare Negative) 命令は、Xn と Operand2 の加算の結果でフラグを設定する。 TST命令は Xn と Operand2 のビット毎のANDの結果でフラグを設定する。