aboutsummaryrefslogtreecommitdiffstats
path: root/examples/hello_world.subv
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