汎用レジスタとは
汎用レジスタとは、CPUが処理するデータを格納する記憶装置のことだ。
8086系アーキテクチャの場合、
・アキュムレータレジスタ
・ベースレジスタ
・カウントレジスタ
・データレジスタ
の4種類の汎用レジスタが準備されている。
容量別に、各汎用レジスタの末尾にl(low),h(high)をつけると8bitなる。
同じく末尾にxをつけると16bitの汎用レジスタとして使用することができる。
転送(mov)命令などでオペランドのレジスタの値を揃えなければエラーとなるので、この知識はアセンブラをする上で基礎となる。
汎用レジスタと変数は同じように扱える
容量さえ揃えれば、レジスタとC言語の変数は同じように扱うことができる。
そこで注意しなければいけないのが、容量だ。
・char 8bit
・short 16bit
このことに気をつければ、扱い方は汎用レジスタとほとんど同じである。
汎用レジスタと変数の使用例
#include <stdio.h>
#include <conio.h>
int main(void){
char ca; //8bit
scanf_s("%c",&ca);
__asm{
mov al,7
add al,ca
mov ca,al
}
printf("%c",ca);
/*---------------------------------*/
short sa;//16bit
scanf_s("%d",&sa);
__asm{
mov ax,7
add ax,sa
mov sa,ax
}
printf("%d",sa);
_getch();
return 0;
}
第一オペランドは汎用レジスタを記述したほうが良い。
理由としては、第一オペランドに変数を書くとエラーになってしまう命令があるからだ。
それを事前に防ぐために、第一オペランドには汎用レジスタを記述する癖をつけておいたほうがいいと思う。
そして、変数の容量を変数名で判断できるようにするために、ハンガリアン記法という、変数の型の頭文字を、変数名の頭文字にするという記法を使うことを推奨する。