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 として参照ができる。
ここからわかるように、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ビットであることがわかる。
おまけ
関係ないとは思うが、川澄綾子が出ているアニメを貼っておく。
川澄綾子は、他にも 硫酸(リューさん) 役などで知られている。