命令セット・アセンブリ

M拡張のないRV32IのCPU向けに、C言語の「a * b」(int同士の掛け算)をコンパイルすると、一般にどうなるか。

  1. Aシフトと加算を繰り返して掛け算を行うライブラリ関数の呼び出しになる
  2. B掛け算は使えないので、コンパイルエラーになる
  3. CM拡張のmul命令がそのまま出力され、実行時に自動で追加される
答えと解説を見る

正解:A. シフトと加算を繰り返して掛け算を行うライブラリ関数の呼び出しになる

乗算器のないCPU向けには、コンパイラが掛け算を__mulsi3のような補助ライブラリの関数の呼び出しに置き換えます。この関数は、片方の数のビットを1つずつ調べ、1ならもう片方をシフトした値を足す、という筆算と同じ方法で積を求めます。正しく計算できますが、ハードウェアの乗算器より何十倍も遅くなります。ISAの拡張を省くと、回路は小さくなる代わりに処理は遅くなります。

  • A. 正しい。ハードウェアの代わりにソフトウェアで計算します。
  • B. C言語の掛け算は、どのCPU向けでも使えます。
  • C. 存在しない命令を実行すると、不正命令の例外になります。
この分野を解く 分野ページへ

命令セット・アセンブリのほかの問題

  1. 昔のMIPSなどにあった分岐遅延スロット(分岐命令の直後の1命令は、分岐するかどうかに関係なく実行される決まり)について正しいものはどれか。
  2. 64ビットのRV64Iでlw命令を実行すると、読み込んだ32ビットの値は64ビットのレジスタにどのように入るか。
  3. ABI(アプリケーションバイナリインターフェース)の説明として正しいものはどれか。
  4. C言語の関数ポインタを使った呼び出し「(*fp)(x)」は、RISC-Vでは一般にどの命令で行われるか。
  5. 同じ命令セットアーキテクチャ(ISA)を採用した2つのCPUについて正しいものはどれか。