Внезапно мне захотелось изучить RISC-V. Документации нашлось дофига, набрал пару симуляторов и сел за rivasm. Готовый пример Hello, wold! запустился, поэтому я решил написать простую программу, например печать 32-битных шестнадцатеричных чисел. Было забавно найти некоторые опкоды, чтобы получить программу. На проверке отладчик оказался не торт: регистры отображаются неполностью, точки прерывания не работают, запуск программы приводит к зависанию эмулятора. Вышло вот что:
.equ CONSTANT, 0xcafebabe # a 32-bit immediate
.text # code segment
main: # program entry
addi sp, sp, -16 # reserve stack space
li t0,0xcafebabe
li a0, .hd # load message address
# addi a0,a0,7
prlp:
andi t1,t0,15
addi a1,t1,.hh
lb t1,0(a1)
sb t1,7(a0)
srli t0,t0,4
addi a0,a0,-1
bnez t0,prlp
la x10,.hd
call puts # call printf()
addi sp, sp, 16 # release stack space
jr ra # return
.data
.hd: .string "00000000"
.word 0
.hh: .string "0123456789ABCDEF"
.end
.text # code segment
main: # program entry
addi sp, sp, -16 # reserve stack space
li t0,0xcafebabe
li a0, .hd # load message address
# addi a0,a0,7
prlp:
andi t1,t0,15
addi a1,t1,.hh
lb t1,0(a1)
sb t1,7(a0)
srli t0,t0,4
addi a0,a0,-1
bnez t0,prlp
la x10,.hd
call puts # call printf()
addi sp, sp, 16 # release stack space
jr ra # return
.data
.hd: .string "00000000"
.word 0
.hh: .string "0123456789ABCDEF"
.end
Программу надо доработать до конца, потому что она работает неправильно. Попробую другой и исправлю программу.
Дополнение Исправил для Rars 1.6
.globl main
.text
main:
addi sp, sp, -16
li t0,0xcafebabe
la a0, hexd
li t2,8
prlp:
andi t1,t0,15
la a1,hexh
add a1,t1,a1
lb t1,0(a1)
sb t1,7(a0)
srli t0,t0,4
addi a0,a0,-1
addi t2,t2,-1
bnez t2,prlp
li a7, 4
la a0,hexd
ecall
addi sp, sp, 16 # release stack space
ebreak
.data
hexd: .string "00000000"
.word 0
hexh: .string "0123456789ABCDEF"
У симулятора есть графический экран, попробую разобраться.
Комментарии
Отправить комментарий