RISC-Vの環境下で以下のようなプログラム群をリンクしてから実行したのですが、以下のようなエラーが出て上手く行きません。
エラーの原因が分からないので、改善方法が分かる方がいれば教えて頂けると助かります。
(以下のプログラム内の関数mystrcatの目的はCで書かれたプログラム内で定義された文字列を連結することです。)
mystrcatを呼び出すCのコード(s1の末尾にs2を連結して出力したい。)

#include <stdio.h>
#include <stdlib.h>
extern char* mystrcat(char* s1, char* s2);

int main(){
  char a[100] = "Hello, ";
  char b[100] = "World!";
  printf("%s\n", mystrcat(a,b));
  return 0;
}

mystrcatを定義したアセンブリコード

    .globl mystrcat
    .align 2

mystrcat:
    #連結される側の文字列のアドレス
    mv s0, a0
    #連結する側の文字列のアドレス
    mv s1, a1
    #関数が扱うデータを保存するためのスタックの確保
    addi sp, sp, -128
    # 各種データのスタックへの退避。
    sd ra, 120(sp)
    sd s0, 112(sp)
    sd s1, 108(sp)

    #mv a0, s0

    jal mystrlen

    #連結される側の文字列の長さ
    mv s2, a0
    sd s2, 100(sp)
    # 関数のための各種データの復元。
    ld ra, 120(sp)
    ld s0, 112(sp)
    ld s1, 108(sp)
    ld s2, 100(sp)

    #s1の文字列のコピーを開始する位置
    add a1, s0, s2
    #コピー元s1のアドレス
    mv a2, s1
loop:
    lb a3, 0(a2)
    beqz a3, end
    sb a3, 0(a1)
    addi a2, a2, 1
    addi a1, a1, 1
    j loop
end:
    sb a3, 0(a1)
    mv a0, s0

    #関数のために確保したスタック領域の解放
    addi sp, sp, 128
    ret

上のアセンブリコードに必要な補助関数。文字列の長さを返す関数。これにバグはない模様。

    .globl mystrlen
    .align 2

mystrlen:
    #li s0, 0
    #li s1, 0
    #li s2, 0
    li a1,0
calc:   
    lb a2, 0(a0)
    blez a2, end
    addi a0, a0, 1
    addi a1, a1, 1
    j calc
end:
    mv a0, a1
    ret

上のプログラムをリンクして実行すると以下のようなエラーが出ます。

bbl loader
z  0000000000000000 ra 00000000000101dc sp 000000007f7e99f0 gp 0000000000013f78
tp 0000000000000000 t0 0000000000010302 t1 000000000000000f t2 0000000000000000
s0 0000000000000000 s1 000000007f7e9a70 a0 0000000000000007 a1 0000000000000007
a2 000000007f7e9a70 a3 0000000000000057 a4 000000007f7e9a70 a5 000000007f7e9ad8
a6 000000000000001f a7 0000000000000000 s2 0000000000000007 s3 0000000000000000
s4 0000000000000000 s5 0000000000000000 s6 0000000000000000 s7 0000000000000000
s8 0000000000000000 s9 0000000000000000 sA 0000000000000000 sB 0000000000000000
t3 0000000000000000 t4 0000000000000000 t5 0000000000000000 t6 0000000000000000
pc 0000000000010220 va 0000000000000007 insn       ffffffff sr 8000000200046020
User store segfault @ 0x0000000000000007

繰り返しになりますが、何を改善すればコードが正しく動くのか分かりません。
ですので、良い改善案があれば回答を頂けると大変助かります。