1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
.syntax unified
.cpu cortex-m0plus
.thumb
.type regregimm, %function
.global regregimm
// R1 instruction under construction
// R3 immediate width
// R4 input buffer
regregimm:PUSH {LR}
PUSH {R3}
BL register // parse a register
POP {R3}
BNE exit // exit if failure
CMP R2, 7 // check that it's R0-R7
BHI bad_reg
ORRS R1, R2 // fill in Rd
BL whitespace // mandatory whitespace
BNE exit // exit if failure
PUSH {R3}
BL register // parse a register
POP {R3}
BNE exit
CMP R2, 7 // check that it's R0-R7
BHI bad_reg
LSLS R2, 3 // shift by 3
ORRS R1, R2 // fill in Rn
BL whitespace // mandatory whitespace
BNE exit // exit if failure
PUSH {R3}
BL immediate
POP {R3}
BNE exit
MOVS R0, 1
LSLS R0, R3
CMP R2, R0
BLO fine
MOVS R0, 0x0A // returun code 0A (immediate value too large)
POP {PC}
fine: LSLS R2, 6 // shift by 6
ORRS R1, R2 // fill in imm
MOVS R0, 0 // return code 0 (success)
exit: POP {PC}
bad_reg: MOVS R0, 8 // return code 8 (invalid register for this register position)
POP {PC}
|