RISC-VでHello, World
RISC-Vとは
以下、Wikipediaより引用(Wikipediaのライセンスに基づく)。
RISC-V(リスク ファイブ)は、確立された縮小命令セットコンピュータ (RISC) の原則に基づいたオープン標準の命令セットアーキテクチャ (ISA) である。他の多くのISA設計とは異なり、RISC-V ISAは、使用料のかからないオープンソースライセンスで提供されている。多くの企業がRISC-Vハードウェアを提供したり、発表したりしており、RISC-Vをサポートするオープンソースのオペレーティングシステムが利用可能であり、いくつかの一般的なソフトウェアツールチェーンで命令セットがサポートされている。
事前準備
以下の記事を参考に。今回はLinux cross-compiler RV64GC
とqemu-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!