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 23hello_text: 24 .asciz "Hello, world.\n" 25 26 .p2align 2 27skip_output: 28 29# Prime loop. 30 31 mov r4, r14 32 33output_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 41into_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 56back_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 81done: 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 90exit_code: 91 .word 0x20026 92