RISC-Vで受け取った二つの整数をswapするコードを書いているのですが、予期せぬ振る舞いをしてしまいます。
まず、コードを示します。
main.c
c
1#include <stdio.h> 2 3void swap(int *x, int *y); 4 5int main(void) { 6 int x, y; 7 x = 3; 8 y = 4; 9 swap(&x, &y); 10 printf("%d\n", x); 11 printf("%d\n", y); 12}
func.s
risc
1.globl swap_gt 2 3 4swap: 5 mv a2, a0 6 mv a3, a1 7 ld a0, 0(a3) 8 ld a1, 0(a2) 9 sd a0, 0(a2) 10 sd a1, 0(a3) 11 ret
xとyをswapしたので4, 3の順に表示されて欲しいのですが、0, 3と表示されてしまいます。
いろいろと試行錯誤した結果、
.globl swap_gt swap_gt: mv a2, a0 mv a3, a1 ld a0, 0(a3) ld a1, 0(a2) sd a1, 0(a3) sd a0, 0(a2) ret
上のように、sd a0, 0(a2)とsd a1, 0(a3)を入れ替えるとうまくいきます。ただ、これだとうまくいくのに、なぜ、最初のコードだとうまくいかないのかがわかりません。
アセンブリ言語自体最近始めたばかりで、初歩的なことがわかっていないのだと思われますが、risc-vの資料が少なく、苦戦しています。
どうか教えてください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/28 16:49