blob: 25a1cbabe4e3958f30fed1f9dad5b35eab315113 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
== code 0x0
# load mhartid CSR into t0, trap all but first Hart
# 73/system 5/rd/t0 2/funct3/csrrs 0/rs/x0 f14/csr/mhartid
# 63/branch 1/subop/!= 5/rs/t0 0/rs/x0 0/off13
main:
# a0 = &message
# . load high bits
37/lui a/rd/a0 Message/imm20hi
# . add low bits
13/opi a/rd/a0 0/subop/add a/rs/a0 Message/imm12lo
# call print
6f/jal 1/rd/ra print/off21
exit:
6f/jal 0/rd/x0 main/off21
# system reset (via SBI extension SRST)
# a7 = ext id, a6 = fid, a0 = 0, a1 = 0
37/lui 11/rd/a7 53525/imm20
13/opi 11/rd/a7 0/subop/add 11/rs/a7 354/imm12
33/opr 0/mode/norm 10/rd/a6 0/subop/add 0/rs/x0 0/rs/x0
33/opr 0/mode/norm a/rd/a0 0/subop/add 0/rs/x0 0/rs/x0
33/opr 0/mode/norm b/rd/a1 0/subop/add 0/rs/x0 0/rs/x0
# ECALL
73/system 0/subop/priv 0/funct12/ecall
print:
# load 0x20000 (UART0) into t0
37/lui 5/rd/t0 20/imm20
print:loop:
# load unsigned byte at a0
03/load 6/rd/t1 4/width/bu a/rs/a0 0/imm12
# break loop if zero
63/branch 0/subop/== 6/rs/t1 0/rs/x0 print:break/off13
print:spin:
# spin if FIFO is full (UART+4 & 1 == 0)
03/load 7/rd/t2 2/width/w 5/rs/t0 4/imm12
13/opi 7/rd/t2 7/subop/and 7/rs/t2 1/imm12
63/branch 0/subop/== 7/rs/t2 0/rs/x0 print:spin/off13
# print char
23/store 2/width/w 5/rs/t0 8/off12 6/rs/t1
# increment a0
13/opi a/rd/a0 0/subop/add a/rs/a0 1/imm12
# jump back up
6f/jal 0/rd/x0 print:loop/off21
print:break:
# return
67/jalr 0/rd/x0 0/subop 1/rs/ra 0/off12
== data 0x100
Message:
# "Hello World!\n\0"
48/8 65/8 6c/8 6c/8 6f/8 20/8 77/8 6f/8 72/8 6c/8 64/8 21/8 0a/8 00/8
|