見出し画像

16bitAL?ALは8ビットだろ?

最近、「16bitAL」という概念があるらしい。
放送中という主張もある [要出典] ようだが…そもそもALって8ビットじゃね?

8086の主なレジスタ

Intelの有名なCPUである 8086 には、計算に用いる主なレジスタとして、それぞれ16ビットの AX、CX、DX、BX、SP、BP、SI、DI がある。
AX、CX、DX、BX はそれぞれ上位8ビットや下位8ビットだけでも使用することができ、xX レジスタの上位8ビットは xH、下位8ビットは xL として参照ができる。

8086 の主なレジスタ

ここからわかるように、AL は AX レジスタの下位8ビットである。
すなわち、AL は 8086 においては8ビットのレジスタである。

x86-64 における AL

x86-64 の命令セットは、8086 の命令セットから拡張されている。
レジスタも拡張されており、AX レジスタを下位に持つ32ビットの EAX レジスタや64ビットの RAX レジスタなどが使用可能である。

とはいえ、ここでも AL レジスタは変わらず8ビットであり、AX レジスタ、EAX レジスタ、RAX レジスタの下位8ビットである。

試してみよう

実際に AL レジスタを用い、16ビットではなく8ビットであることを確認する。

以下のプログラム al.s は、関数 use_al を定義している。
この関数は、第1引数 (RDI レジスタ) に格納されたアドレスのメモリから AL レジスタにデータを読み込み、そのデータを第2引数 (RSI レジスタ) に格納されたアドレスのメモリに書き込むものである。

.intel_syntax noprefix
.global use_al
use_al:
    MOV AL, [RDI]
    MOV [RSI], AL
    RET

さらに、この関数を呼び出す以下のプログラム al-driver.c も用意する。

#include <stdio.h>

void use_al(unsigned int* src, unsigned int* dst);

int main(void) {
	unsigned int data_src = 0xDEADBEEFu;
	unsigned int data_dest = 0;
	use_al(&data_src, &data_dest);
	printf("%X\n", data_dest);
	return 0;
}

このプログラムをさくらのクラウドシェルで実行してみると、以下のようになった。(Programmming font を使用している)

実行結果

x86-64 はリトルエンディアンなので、変数 data_src に格納されている整数 0xDEADBEEF はメモリ上では EF BE AD DE というバイト列として格納される。
ここからレジスタ AL に入るだけのデータを変数 data_dest にコピーした結果、最初の1バイト EF のみがコピーされたため、この変数の値として EF が出力されている。
もしレジスタ AL が16ビットであれば、EF BE がコピーされ、出力は BEEF になるはずである。

このことから、x86-64 における AL レジスタは、16ビットではなく8ビットであることがわかる。

おまけ

関係ないとは思うが、川澄綾子が出ているアニメを貼っておく。

川澄綾子は、他にも 硫酸(リューさん) 役などで知られている。


いいなと思ったら応援しよう!