not logged in | [Login]

Label's and the branch (and branch_if ... branch on result of a comparison) functions are the equivalent of 'goto' in other simple languages ... they are used to implement programme logic.

label(LABEL) - target of a branch or conditional branch (branch_if - bxx function), LABEL is of your own devising.

b(LABEL) - branch to (goto a) named label

Example;

@micropython.asm_thumb
def test():
  mov(r0, 42)       #put 42 in register 0
  b(END)            #branch to label END
  mov(r0, 666)      #put 666 in register 0
  label(END)
>>> test()
42
r0 never got set to 666, because we skipped past that operation to go to **label(END)***

'branch on logic' (aka if aka 'make a decision') is a 2 step operation;

  1. first; comparison (register to register, register to value)
  2. then; check the results of the comparison and branch_if something is the case

comparison instructions

cmp(reg, val) compare reg with val (reg-val), put the result into CPSR flags

cmp(regA, regB) compare regA with regB (regA-regB), put the result into CPSR flags

cmn(regA, regB) compare regA with regB (regA+regB), put the result into CPSR flags doesn't this turn the branch comparisons upside down? if so it's "gnarly"

tst(regA,regB) and regA with regB (regA&regB), discard the result but set the CPSR flags (i.e. multiple bit test)

CPSR flags are some magic place for holding the result of a comparison, that is 'inspected' by the bxx operations in the next step, the branch_if instruction.

branch_if

bgt(LABEL) branch if greater than

Example;

@micropython.asm_thumb
def greater_than_life(r0):
  cmp(r0, 42)
  bgt(GT)   #r0>42 goto END
  mov(r0, 0)    #r0 = 0 (False in uPy)
  b(END)    #goto END
  label(GT)
  mov(r0, 1)    #r0 = 1 (True in uPy)
  label(END)
>>>greater_than_life(15)
0
>>>greater_than_life(42)
0
>>>greater_than_life(43)
1

beq(LABEL) branch if equal

bne(LABEL) branch if not equal

bge(LABEL) branch if greater than or equal to (>=) operands treated as signed

bgt(LABEL) branch if greater than (>) operands treated as signed

blt(LABEL) branch if less than (<) operands treated as signed

ble(LABEL) branch if less than or equal to (<=) operands treated as signed

bcs(LABEL) branch if carry flag is set

bcc(LABEL) branch if carry flag is clear

bmi(LABEL) branch if negative

bpl(LABEL) branch if positive

bvs(LABEL) branch if overflow flag set

bvc(LABEL) branch if overflow flag is clear

bhi(LABEL) branch if higher (> using unsigned comparison)

bls(LABEL) branch if lower or equal (<= using unsigned comparison)

The overflow flag is set if the result, viewed as a two's compliment number, has the "wrong" sign in relation to the operands. For example adding 1 to 0x7fffffff will set the overflow bit because the result (0x8000000), viewed as a two's compliment integer, is negative. Note that in this instance the carry flag is not set: the result has overflowed into the most significant bit only.

An addition sets the carry flag when the result overflows out of the MSB, for example adding 0x80000000 and 0x80000000.

back