Gray binary generation 7.2.1.1L
Gray binary generation. Uses algorithm from TAOCP 7.2.1.1 Algorithm L.
Program L. r9 \(\equiv j\); r8 \(\equiv n\); r7 \(\equiv\) base; r6 \(\equiv f\).
EA000003 |
01 | B |
start |
||
00000000 |
02 | .digits |
EQUD |
&0 |
|
00000000 |
03 | EQUD |
&0 |
||
00000000 |
04 | .focus |
EQUD |
&0 |
|
00000000 |
05 | EQUD |
&0 |
||
E92D4000 |
06 | .start |
STMFD |
R13!,{R14} |
Initialize. |
E24F701C |
07 | ADR |
base,digits |
Address of digits array | |
E24F6018 |
08 | ADR |
f,focus |
Address of focus pointers | |
E3A08004 |
09 | MOV |
n,#4 |
Number of digits | |
E1A00008 |
10 | MOV |
R0,n |
||
E7C60000 |
11 | .l1 |
STRB |
R0,[f,r0] |
|
E2500001 |
12 | SUBS |
R0,R0,#1 |
||
5AFFFFFC |
13 | BPL |
l1 |
||
E1A00007 |
14 | .l2 |
MOV |
R0,base |
Visit. |
E1A01008 |
15 | MOV |
R1,n |
||
EB00000E |
16 | BL |
visit |
||
E5D69000 |
17 | .l3 |
LDRB |
j,[f] |
Choose \(j\). \(j \gets f_0\) |
E3A01000 |
18 | MOV |
R1,#0 |
||
E5C61000 |
19 | STRB |
R1,[f] |
||
E1590008 |
20 | CMP |
j,n |
||
0A000007 |
21 | BEQ |
exit |
||
E2890001 |
22 | ADD |
R0,j,#1 |
\(j+1\) | |
E7D61000 |
23 | LDRB |
R1,[f,R0] |
\(f_j+1\) | |
E7C61009 |
24 | STRB |
R1,[f,j] |
\(f_j \gets f_j+1\) | |
E7C60000 |
25 | STRB |
R0,[f,R0] |
\(f_j+1 \gets j + 1\) | |
E7D71009 |
26 | .l4 |
LDRB |
R1,[base,j] |
Complement coordinate \(j\) |
E2611001 |
27 | RSB |
R1,R1,#1 |
||
E7C71009 |
28 | STRB |
R1,[base,j] |
||
EAFFFFEF |
29 | B |
l2 |
||
E8BD4000 |
30 | .exit |
LDMFD |
R13!,{R14} |
|
E1A0F00E |
31 | MOV |
PC,R14 |
||
E1A02000 |
32 | .visit |
MOV |
R2,R0 |
Base address is in r0; length in r1. |
E7D20001 |
33 | .v1 |
LDRB |
R0,[R2,R1] |
|
E2800030 |
34 | ADD |
R0,R0,#48 |
||
EF000000 |
35 | SWI |
"OS_WriteC" |
||
E2511001 |
36 | SUBS |
R1,R1,#1 |
||
5AFFFFFA |
37 | BPL |
v1 |
||
EF000003 |
38 | SWI |
"OS_NewLine" |
||
E1A0F00E |
39 | MOV |
PC,R14 |