| # output(): Hello, world.\n |
| # mach(): all |
| |
| # Emit hello world while switching back and forth between arm/thumb. |
| # ??? Unfinished |
| |
| .macro invalid |
| # This is "undefined" but it's not properly decoded yet. |
| .word 0x07ffffff |
| # This is stc which isn't recognized yet. |
| stc 0,cr0,[r0] |
| .endm |
| |
| .global _start |
| _start: |
| # Run some simple insns to confirm the engine is at least working. |
| nop |
| |
| # Skip over output text. |
| |
| bl skip_output |
| |
| hello_text: |
| .asciz "Hello, world.\n" |
| |
| .p2align 2 |
| skip_output: |
| |
| # Prime loop. |
| |
| mov r4, r14 |
| |
| output_next: |
| |
| # Switch arm->thumb to output next chacter. |
| # At this point r4 must point to the next character to output. |
| |
| adr r0, into_thumb + 1 |
| bx r0 |
| |
| into_thumb: |
| .thumb |
| |
| # Output a character. |
| |
| mov r0,#3 @ writec angel call |
| mov r1,r4 |
| swi 0xab @ ??? Confirm number. |
| |
| # Switch thumb->arm. |
| |
| adr r5, back_to_arm |
| bx r5 |
| |
| .p2align 2 |
| back_to_arm: |
| .arm |
| |
| # Load next character, see if done. |
| |
| add r4,r4,#1 |
| sub r3,r3,r3 |
| ldrb r5,[r4,r3] |
| teq r5,#0 |
| beq done |
| |
| # Output a character (in arm mode). |
| |
| mov r0,#3 |
| mov r1,r4 |
| swi #0x123456 |
| |
| # Load next character, see if done. |
| |
| add r4,r4,#1 |
| sub r3,r3,r3 |
| ldrb r5,[r4,r3] |
| teq r5,#0 |
| bne output_next |
| |
| done: |
| mov r0,#0x18 |
| ldr r1,exit_code |
| swi #0x123456 |
| |
| # If that fails, try to die with an invalid insn. |
| |
| invalid |
| |
| exit_code: |
| .word 0x20026 |