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