命令セット・アセンブリ
メモリ上の1バイトに0x80が入っている。RISC-Vのlb命令とlbu命令でこのバイトを32ビットのレジスタに読み込んだときの値の組み合わせとして正しいものはどれか。
- Albでは0x00000080(128)、lbuでは0xFFFFFF80(-128)
- Blbでは0xFFFFFF80(-128)、lbuでは0x00000080(128)
- 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を上に広げます。