🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

Q&A

解決済

1回答

1039閲覧

RISC-Vで二つの整数値をswapするコードを書きたい。

red_red

総合スコア13

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

0グッド

1クリップ

投稿2020/11/21 15:54

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の資料が少なく、苦戦しています。
どうか教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まだ見てますかね。
intがたぶん32bit幅なのに、ld/sdで64bit幅のメモリを書き換えているのが問題でしょう。
具体的なメモリ上の配置は分かりませんが、例えば

04 00 00 00 03 00 00 00 00 00 00 00 <- x -> <- y -> 04 00 00 00 04 00 00 00 03 00 00 00 ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ 03 00 00 00 00 00 00 00 03 00 00 00 ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^

のように書き換わったのではないかと。
なおこの推測が正しい場合、入れ替えた方のコードでも範囲外を書き換えていることに変わりはないので、

C

1 int w, x, y, z; 2 w = 2; 3 x = 3; 4 y = 4; 5 z = 5; 6 swap(&x, &y); 7 printf("%d\n", w); 8 printf("%d\n", x); 9 printf("%d\n", y); 10 printf("%d\n", z);

などするとwかzが書き換わると予想されます。

投稿2021/03/13 15:04

ikadzuchi

総合スコア3047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

red_red

2021/04/28 16:49

ご解答ありがとうございます。まさにikadzuchiさんのご指摘通りでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問