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