tooh’s diary

半角全角、常体敬体が入り乱れるカオス

risc-vでアセンブリ

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が表示される)