命令セット・アセンブリ

メモリ上の1バイトに0x80が入っている。RISC-Vのlb命令とlbu命令でこのバイトを32ビットのレジスタに読み込んだときの値の組み合わせとして正しいものはどれか。

  1. Albでは0x00000080(128)、lbuでは0xFFFFFF80(-128)
  2. Blbでは0xFFFFFF80(-128)、lbuでは0x00000080(128)
  3. Cどちらも0x00000080(128)になる
答えと解説を見る

正解:B. lbでは0xFFFFFF80(-128)、lbuでは0x00000080(128)

lb(load byte)は読み込んだ1バイトを符号付きとみなし、最上位ビットを上位24ビットにコピーします(符号拡張)。0x80は最上位ビットが1なので0xFFFFFF80、つまり-128になります。lbu(load byte unsigned)は上位を0で埋める(ゼロ拡張)ので128です。C言語でsigned charとunsigned charを読むときに、コンパイラはこの2つの命令を使い分けます。

  • A. uはunsigned(符号なし)の意味で、逆です。
  • B. 正しい。lbは符号拡張、lbuはゼロ拡張します。
  • C. lbは最上位ビットの1を上に広げます。
この分野を解く 分野ページへ

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

  1. 条件分岐のしくみについて、RISC-Vとx86の違いとして正しいものはどれか。
  2. RISC-Vの命令「slt t0, a0, a1」の動作として正しいものはどれか。
  3. 上のRISC-Vのコードを実行し終えたとき、t0の値はいくらか。
  4. RISC-Vの条件分岐命令(B形式)は、分岐先までの距離を13ビットの符号付きのバイト数で表し、その最下位ビットは常に0として命令に入れない。分岐命令が直接届く範囲としておよそ正しいものはどれか。
  5. RISC-Vの命令「jal ra, func」の動作として正しいものはどれか。