命令セット・アセンブリ
M拡張のないRV32IのCPU向けに、C言語の「a * b」(int同士の掛け算)をコンパイルすると、一般にどうなるか。
- Aシフトと加算を繰り返して掛け算を行うライブラリ関数の呼び出しになる
- B掛け算は使えないので、コンパイルエラーになる
- CM拡張のmul命令がそのまま出力され、実行時に自動で追加される
答えと解説を見る
正解:A. シフトと加算を繰り返して掛け算を行うライブラリ関数の呼び出しになる
乗算器のないCPU向けには、コンパイラが掛け算を__mulsi3のような補助ライブラリの関数の呼び出しに置き換えます。この関数は、片方の数のビットを1つずつ調べ、1ならもう片方をシフトした値を足す、という筆算と同じ方法で積を求めます。正しく計算できますが、ハードウェアの乗算器より何十倍も遅くなります。ISAの拡張を省くと、回路は小さくなる代わりに処理は遅くなります。
- A. 正しい。ハードウェアの代わりにソフトウェアで計算します。
- B. C言語の掛け算は、どのCPU向けでも使えます。
- C. 存在しない命令を実行すると、不正命令の例外になります。