FizzBuzz Written in RISC-V Assembly

Mar 3, 2018

I could not find an implementation of FizzBuzz written in RISC-V Assembly, so I made a quick attempt at one… Why? I have no idea.

Built with something like the following

$ uname -r
4.15.1-gentoo
$ riscv64-unknown-elf-as ./fizzbuzz.s -o fizzbuzz.o
$ riscv64-unknown-elf-ld ./fizzbuzz.o -o fizzbuzz
$ spike pk ./fizzbuzz

fizzbuzz.s

.section .rodata
fizz_str:
  .string "Fizz!\x0a"
buzz_str:
  .string "Buzz!\x0a"
fizzbuzz_str:
  .string "FizzBuzz!\x0a"

.section .text
.globl _start

get_ascii:
  li   t0, 10
  blt  a0, t0, lt10
  addi a0, a0, 0x57
  jr   ra
lt10:
  addi a0, a0, 0x30
  jr   ra

printnum:
  addi sp, sp, -32
  sd   ra, 0x18(sp)
  sd   s0, 0x10(sp)
  sd   a0, 0x8(sp)
  addi s0, sp, 32
  andi a0, a0, 0xf0
  sra  a0, a0, 4
  call get_ascii
  sb   a0, 0x0(sp)
  ld   a0, 0x8(sp)
  andi a0, a0, 0x0f
  call get_ascii
  sb   a0, 0x1(sp)
  li   a0, 0x0a
  sb   a0, 0x2(sp)
  mv   a0, sp
  li   a1, 3
  call printstr
  ld   ra, 0x18(sp)
  ld   s0, 0x10(sp)
  addi sp, sp, 32
  ret

printstr:
  mv   a3, zero
  mv   a4, zero
  mv   a5, zero
  mv   a2, a1
  mv   a1, a0
  li   a0, 0
  li   a7, 64
  ecall
  jr   ra

_start:
  li   s2, 0
  li   s3, 101
  j    loop_end
loop:
  li   s4, 15
  rem  s5, s2, s4
  beq  zero, s5, fizzbuzz
  li   s4, 5
  rem  s5, s2, s4
  beq  zero, s5, buzz
  li   s4, 3
  rem  s5, s2, s4
  beq  zero, s5, fizz
print_num:
  mv   a0, s2
  call printnum
  j    loop_end
fizzbuzz:
  la   a0, fizzbuzz_str
  li   a1, 10
  j    print_str
fizz:
  la   a0, fizz_str
  li   a1, 6
  j    print_str
buzz:
  la   a0, buzz_str
  li   a1, 6
print_str:
  call printstr
loop_end:
  addi s2, s2, 1
  blt  s2, s3, loop
  li   a0, 0
exit
  li   a0, 0
  li   a7, 93
  ecall