Eliminating zeroes between ones from binary number:
Output
deadbeef
11011110101011011011111011101111
111111111111111111111111
Code
.data Mask: .ascii "%x\n\n" .align 4 varToPrint: .long 0xdeadbeef .balign 8 stringToPrint: .ascii " \n\n" len = 32 .balign 32 unspacedStringToPrint: .ascii " \n\n" len = 32 .balign 32 .text .globl main main: stmfd sp!, {r0, r1, r2, r3, r4, r5, r6, r7, lr} @ save the registers we use to the stack ldr r3, AddrVarToPrint ldr r6, [r3] ldr r3, AddrVarToPrint str r6, [r3] bl make_binary_number bl remove_spaces bl print_out_result b exit print_out_result: push {r0, r1, r2, r3, r4, lr} ldr r3, AddrMask movs r0, r3 ldr r3, AddrVarToPrint ldr r1, [r3] bl printf ldr r3, AddrStringToPrint movs r0, r3 bl printf ldr r3, AddrUnspacedStringToPrint movs r0, r3 bl printf pop {r0, r1, r2, r3, r4, pc} make_binary_number: push {r0, r1, r2, r3, r4, r5, r6, r7, lr} ldr r3, AddrVarToPrint ldr r1, [r3] movs r4, $0 bin_loop: movs r2, $0x1 lsls r2, r4 movs r6, $31 subs r6, r6, r4 tst r1, r2 beq no_one ldr r3, AddrStringToPrint movs r5, $0x31 strb r5, [r3,r6] b end_bin_loop no_one: ldr r3, AddrStringToPrint movs r5, $0x30 strb r5, [r3,r6] b end_bin_loop end_bin_loop: adds r4, r4,$1 cmp r4, $32 bne bin_loop pop {r0, r1, r2, r3, r4, r5, r6, r7, pc} remove_spaces: push {r0, r1, r2, r3, r4, r5, r6, r7, lr} ldr r3, AddrVarToPrint ldr r1, [r3] ldr r3, AddrUnspacedStringToPrint movs r5, $0x31 movs r4, $0 movs r7, $0 unspace_loop: movs r2, $0x1 lsls r2, r4 tst r1, r2 beq end_unspace_loop strb r5, [r3,r7] adds r7,r7,$1 end_unspace_loop: adds r4, r4,$1 cmp r4, $32 bne unspace_loop pop {r0, r1, r2, r3, r4, r5, r6, r7, pc} exit: ldmfd sp!, {r0, r1, r2, r3, r4, r5, r6, r7, pc} @ restore registers before exit movs r7, $1 @ set r7 to 1 - the syscall for exit swi 0 @ then invoke the syscall from linux AddrMask: .word Mask AddrVarToPrint: .long varToPrint AddrStringToPrint: .word stringToPrint AddrUnspacedStringToPrint: .word unspacedStringToPrint