bamboo’s blog

Bambooの気まぐれブログ

RISC-VでHello, World

RISC-Vとは

 以下、Wikipediaより引用(Wikipediaのライセンスに基づく)。

RISC-V(リスク ファイブ)は、確立された縮小命令セットコンピュータ (RISC) の原則に基づいたオープン標準の命令セットアーキテクチャ (ISA) である。他の多くのISA設計とは異なり、RISC-V ISAは、使用料のかからないオープンソースライセンスで提供されている。多くの企業がRISC-Vハードウェアを提供したり、発表したりしており、RISC-Vをサポートするオープンソースオペレーティングシステムが利用可能であり、いくつかの一般的なソフトウェアツールチェーンで命令セットがサポートされている。

事前準備

 以下の記事を参考に。今回はLinux cross-compiler RV64GCqemu-riscv64を使用する。

使用する命令

通常命令

命令 意味
addi 加算
ld メモリから値をロード
li 即値をロード
sd メモリに値をストア

疑似命令

命令 同義 意味
call jalr ra, ra, offset 関数呼び出し
la lui rd, %hi(offset);
addi rd, rd, %lo(offset)
アドレス(ラベル)をロード
ret jalr zero, ra, 0 サブルーチン終了

使用するレジスタ

レジスタ 役割
a0 第一引数及び戻り値
ra リターンアドレス
sp スタックポインタ

※スタックポインタを動かす場合は、16の倍数に整列するようにする。

Hello, World

.text
.globl main

main:
    addi    sp, sp, -16
    la      a0, msg
    sd      ra, 8(sp)
    call    printf
    ld      ra, 8(sp)
    li      a0, 0       # return 0
    addi    sp, sp, 16
    ret

.data
msg:    .asciz  "Hello, World!\n"

実行。

$ riscv64-unknown-linux-gnu-gcc hello.s
$ qemu-riscv64 -L /opt/riscv/sysroot/ a.out
Hello, World!

参考