git.s-ol.nu subv / master examples / hello_world.subv
master

Tree @master (Download .tar.gz)

hello_world.subv @masterraw · history · blame

== 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