1 # output(): Hello, world.\n 2 # mach(): all 3 4 # Emit hello world while switching back and forth between arm/thumb. 5 # ??? Unfinished 6 7 .macro invalid 8 # This is "undefined" but it's not properly decoded yet. 9 .word 0x07ffffff 10 # This is stc which isn't recognized yet. 11 stc 0,cr0,[r0] 12 .endm 13 14 .global _start 15 _start: 16 # Run some simple insns to confirm the engine is at least working. 17 nop 18 19 # Skip over output text. 20 21 bl skip_output 22 23 hello_text: 24 .asciz "Hello, world.\n" 25 26 .p2align 2 27 skip_output: 28 29 # Prime loop. 30 31 mov r4, r14 32 33 output_next: 34 35 # Switch arm->thumb to output next chacter. 36 # At this point r4 must point to the next character to output. 37 38 adr r0, into_thumb + 1 39 bx r0 40 41 into_thumb: 42 .thumb 43 44 # Output a character. 45 46 mov r0,#3 @ writec angel call 47 mov r1,r4 48 swi 0xab @ ??? Confirm number. 49 50 # Switch thumb->arm. 51 52 adr r5, back_to_arm 53 bx r5 54 55 .p2align 2 56 back_to_arm: 57 .arm 58 59 # Load next character, see if done. 60 61 add r4,r4,#1 62 sub r3,r3,r3 63 ldrb r5,[r4,r3] 64 teq r5,#0 65 beq done 66 67 # Output a character (in arm mode). 68 69 mov r0,#3 70 mov r1,r4 71 swi #0x123456 72 73 # Load next character, see if done. 74 75 add r4,r4,#1 76 sub r3,r3,r3 77 ldrb r5,[r4,r3] 78 teq r5,#0 79 bne output_next 80 81 done: 82 mov r0,#0x18 83 ldr r1,exit_code 84 swi #0x123456 85 86 # If that fails, try to die with an invalid insn. 87 88 invalid 89 90 exit_code: 91 .word 0x20026 92