2つの整数を受けとり、大きいほうを返す関数maxof2をアセンブリで実装せよ。
int maxof2(int x, int y);
とりあえずmainはこんな感じになる(と思われる)
#include <stdio.h> //main.cに保存 int maxof2(int x, int y); int main(){ int x,y; scanf("%d%d", &x, &y); printf("%d\n",maxof2(x,y)); return 0; }
最初のmaxof2という関数を実装するという趣旨の問題っぽい。
以下のどちらでも良い。
#func.sに保存 .align 2 .globl maxof2 maxof2: ble a1, a2, label1 j label2 label1: mv a0, a2 ret label2: mv a0, a1 ret
.align 2 .globl maxof2 maxof2: ble a1, a2, label1 j label2 label1: mv a0, a2 label2: mv a0, a1 ret
何がどう違うのかわからんけどまあ動いたのでヨシ!!!!!!!!
spike(risc-vのシミュレータ)のインスコは
brew install riscv/riscv/riscv-tools
でできる。
RISC-Vアーキテクチャの環境で利用できるコードを生成するためには、cの場合はただのgccじゃなくてriscv64-unknown-elf-gccでコンパイルする(これをクロスコンパイルと言う)。これでRISC-Vアーキテクチャで実行可能なプログラムが生成される。
main.cをアセンブリにかけてそれをファイルにしたい(アセンブリ言語の記述が見たい)ときは、
riscv64-unknown-elf-gcc main.c -S main.c
riscv64-unknown-elf-gcc -S main.c
のどっちでもできる。
で、実行するときは、
$ riscv64-unknown-elf-gcc main.c func.s -o main
$ spike pk main
ってやるとbbl loaderって出てくるので、下に(例えば今回は引数を受け取るので適当に2 3とでも入力すれば)出力が返ってくる(3が表示される)