hello.ms revision 1.1 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