命令セット・アセンブリ

呼び出し規約(コーリングコンベンション)が決められている主な目的はどれか。

  1. A関数の名前の付け方をそろえ、プログラムを読みやすくする
  2. B別々にコンパイルした関数やライブラリ同士が、引数や戻り値を正しく受け渡せるようにする
  3. C関数を呼ぶたびにOSの許可を得るようにする
答えと解説を見る

正解:B. 別々にコンパイルした関数やライブラリ同士が、引数や戻り値を正しく受け渡せるようにする

呼び出し規約は、引数をどのレジスタに入れるか、戻り値はどこに返すか、どのレジスタを呼ばれた側が壊してよいか、スタックをどう使うかを定めます。この約束があるので、違うコンパイラで作ったライブラリや、アセンブリで書いた関数とC言語の関数を組み合わせても正しく動きます。呼び出し規約はABI(アプリケーションバイナリインターフェース)の重要な一部です。

  • A. 名前の付け方の規則ではありません。
  • B. 正しい。機械語レベルの約束ごとです。
  • C. 関数呼び出しにOSは関わりません。
この分野を解く 分野ページへ

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

  1. RISC-Vの標準の呼び出し規約で、整数の引数と戻り値の受け渡しに使うレジスタとして正しいものはどれか。
  2. RISC-Vの標準の呼び出し規約で、整数の引数が10個ある関数を呼ぶとき、9個目と10個目の引数はどこで渡されるか。
  3. RISC-Vの呼び出し規約で、s0〜s11が「呼び出し先保存(callee-saved)」のレジスタとされている意味として正しいものはどれか。
  4. RISC-Vの呼び出し規約で、t0〜t6は「呼び出し元保存(caller-saved)」のレジスタである。ある関数がt0に入れた値を、別の関数を呼んだ後も使いたいとき、正しい対応はどれか。
  5. ほかの関数を呼ばない関数(葉関数、リーフ関数)では、raをスタックに保存しなくてよい場合が多い。その理由として正しいものはどれか。