命令セット・アセンブリ
命令形式、アドレッシングモード、RISC-Vの基本命令、関数呼び出し規約とスタックフレームなど、命令セットとアセンブリの基本を3択問題で学べます。
—あなたの正答率
0 / 50解いた問題
命令セット・アセンブリの要点
命令セットアーキテクチャ(ISA)は、ソフトウェアとハードウェアの間の約束ごとです。どんな命令があり、命令がどのようなビットの並びで表され、レジスタやメモリをどう指定するかが決められています。同じISAを守っていれば、内部の作りが違うCPUでも同じプログラムが動きます。
アセンブリ言語は、機械語の命令を人が読める形で書いたものです。RISC-Vの基本命令、レジスタの使い分け、関数を呼ぶときの引数や戻り値の受け渡し(呼び出し規約)、スタックフレームの作り方を知ると、コンパイラが出力するコードや、プログラムがCPUの上でどう動くかが見えてきます。
命令セット・アセンブリの問題一覧(50問)
- 同じ命令セットアーキテクチャ(ISA)を採用した2つのCPUについて正しいものはどれか。
- RISC-Vのようなロード・ストア・アーキテクチャの特徴として正しいものはどれか。
- RISC-Vのレジスタx0(zero)の性質として正しいものはどれか。
- RISC-VのRV32I(32ビットの基本整数命令セット)が持つ汎用の整数レジスタとして正しいものはどれか。
- アセンブリ言語と機械語の関係として正しいものはどれか。
- RISC-Vの疑似命令「nop」(何もしない)は、アセンブラによって実際にはどの命令に置き換えられるか。
- RISC-Vの「add」命令と「addi」命令の違いとして正しいものはどれか。
- 上のRISC-Vのコードを実行した後、レジスタa2の値はいくらか。
- RISC-Vの命令「lw t0, 8(sp)」の動作として正しいものはどれか。
- RISC-Vの条件分岐命令「beq a0, a1, label」で、分岐先labelの番地はどのように表されているか。
- 分岐やジャンプにPC相対アドレッシングを使うことの利点として正しいものはどれか。
- RISC-Vの基本命令とx86の命令の長さについて正しいものはどれか。
- 命令の長さを固定長にすることの利点として、最も適切なものはどれか。
- RISC-Vの命令では、レジスタを指定する欄(rd、rs1、rs2)がそれぞれ5ビットである。その理由として正しいものはどれか。
- RISC-Vのaddi命令の即値は12ビットの符号付き整数である。この即値で表せる範囲はどれか。
- RISC-Vで、12ビットの即値に収まらない32ビットの定数(例: 0x12345678)をレジスタに入れる一般的な方法はどれか。
- RISC-Vで定数0x12345FFFをluiとaddiの2命令で作るとき、正しい組み合わせはどれか。
- RISC-Vのauipc命令(add upper immediate to PC)の動作として正しいものはどれか。
- RISC-V(RV32I)で「addi t0, zero, -1」を実行した後、t0に入っている32ビットの値はどれか。
- メモリ上の1バイトに0x80が入っている。RISC-Vのlb命令とlbu命令でこのバイトを32ビットのレジスタに読み込んだときの値の組み合わせとして正しいものはどれか。
- 条件分岐のしくみについて、RISC-Vとx86の違いとして正しいものはどれか。
- RISC-Vの命令「slt t0, a0, a1」の動作として正しいものはどれか。
- 上のRISC-Vのコードを実行し終えたとき、t0の値はいくらか。
- RISC-Vの条件分岐命令(B形式)は、分岐先までの距離を13ビットの符号付きのバイト数で表し、その最下位ビットは常に0として命令に入れない。分岐命令が直接届く範囲としておよそ正しいものはどれか。
- RISC-Vの命令「jal ra, func」の動作として正しいものはどれか。
- RISC-Vの疑似命令「ret」は、実際にはどの命令として実行されるか。
- 呼び出し規約(コーリングコンベンション)が決められている主な目的はどれか。
- RISC-Vの標準の呼び出し規約で、整数の引数と戻り値の受け渡しに使うレジスタとして正しいものはどれか。
- RISC-Vの標準の呼び出し規約で、整数の引数が10個ある関数を呼ぶとき、9個目と10個目の引数はどこで渡されるか。
- RISC-Vの呼び出し規約で、s0〜s11が「呼び出し先保存(callee-saved)」のレジスタとされている意味として正しいものはどれか。
- RISC-Vの呼び出し規約で、t0〜t6は「呼び出し元保存(caller-saved)」のレジスタである。ある関数がt0に入れた値を、別の関数を呼んだ後も使いたいとき、正しい対応はどれか。
- ほかの関数を呼ばない関数(葉関数、リーフ関数)では、raをスタックに保存しなくてよい場合が多い。その理由として正しいものはどれか。
- RISC-Vの関数の先頭で「addi sp, sp, -16」を実行する目的として正しいものはどれか。
- RISC-Vの標準の呼び出し規約では、関数に入るときのスタックポインタspを16バイトの倍数にそろえることになっている。その理由として最も適切なものはどれか。
- 上のコードは、ある関数の先頭(プロローグ)である。この部分が行っていることとして正しいものはどれか。
- 関数の中でフレームポインタ(RISC-Vではs0/fp)を使う利点として正しいものはどれか。
- RISC-Vで、自分自身を呼び出す再帰関数を書くときに、raをスタックに保存し忘れるとどうなるか。
- リトルエンディアンのRISC-Vで、0x12345678の入ったレジスタを「sw」で番地0x100に書き込んだ。その後「lbu」で番地0x101の1バイトを読むと、値はいくらか。
- RISC-Vで4バイトを読むlw命令の番地が4の倍数でない(境界がそろっていない)とき、起こりうることとして正しいものはどれか。
- RISC-Vの命令「slli t0, a0, 3」の結果t0は、a0の値の何倍になるか(あふれは考えない)。
- a0にint型(4バイト)の配列aの先頭番地、a1に添字iが入っている。上のコードがa2に読み込むものとして正しいものはどれか。
- x86の命令「add eax, [rbx]」のように、演算命令がメモリ上の値を直接使える方式について正しいものはどれか。
- 現在の高性能なx86のCPUが、複雑な命令を内部でどのように実行しているかの説明として正しいものはどれか。
- RISC-VのM拡張が基本の整数命令セットに追加する命令はどれか。
- RISC-VのC拡張(圧縮命令)の主な目的はどれか。
- M拡張のないRV32IのCPU向けに、C言語の「a * b」(int同士の掛け算)をコンパイルすると、一般にどうなるか。
- 昔のMIPSなどにあった分岐遅延スロット(分岐命令の直後の1命令は、分岐するかどうかに関係なく実行される決まり)について正しいものはどれか。
- 64ビットのRV64Iでlw命令を実行すると、読み込んだ32ビットの値は64ビットのレジスタにどのように入るか。
- ABI(アプリケーションバイナリインターフェース)の説明として正しいものはどれか。
- C言語の関数ポインタを使った呼び出し「(*fp)(x)」は、RISC-Vでは一般にどの命令で行われるか。