== code 0x80400000
# 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:
# 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 0x10000000 (UART0) into t0
37/lui 5/rd/t0 10000/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 (thr_emtpy = UART+5 & 0x20)
03/load 7/rd/t2 4/width/bu 5/rs/t0 5/imm12
13/opi 7/rd/t2 7/subop/and 7/rs/t2 20/imm12
63/branch 0/subop/== 7/rs/t2 0/rs/x0 print:spin/off13
# print char
23/store 2/width/w 5/rs/t0 0/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 0x80500000
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