0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

インラインアセンブラで使う汎用レジスタと変数について

Last updated at Posted at 2022-07-23

汎用レジスタとは

汎用レジスタとは、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;
    
}

第一オペランドは汎用レジスタを記述したほうが良い。
理由としては、第一オペランドに変数を書くとエラーになってしまう命令があるからだ。
それを事前に防ぐために、第一オペランドには汎用レジスタを記述する癖をつけておいたほうがいいと思う。
そして、変数の容量を変数名で判断できるようにするために、ハンガリアン記法という、変数の型の頭文字を、変数名の頭文字にするという記法を使うことを推奨する。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?