う え き ぷ に き あ く ん 笑 Advent Calendar 2021 18日目です
##この記事について
本記事では、アセンブリを読む際に必要となるレジスタの知識について説明します。
環境はx64アーキテクチャを想定しています。
##レジスタって?
レジスタとは、プロセッサ内にある記憶装置のことで、メモリなどと比べると高速に動作しますが、容量が非常に小さいです。容量はプロセッサによって変わり、現在は64bitのものが広く使われています。
主に、プロセッサが命令を実行する際に使用されます。
##レジスタの種類
レジスタには、
・RAX, RBX, RCX, RDX, RSI, RDI, R8, R9, R10, R11, R12, R13, R14, R15の汎用レジスタ(RSI, RDIはインデックスレジスタとも呼ばれます)
・RBP, RSP, RIPの特殊レジスタ
・RFLAGSのフラグレジスタ
・CS, DS, ES, SSのセグメントレジスタ
などがあります。これらは全て64bitです。
##レジスタの名称と用途
レジスタにはそれぞれ正式名称と主な使用用途があります。
汎用レジスタについての使用用途は、あくまでも主に用いられる用途であるため、必ずこの用途に使われるということではありません。
ここでは、執筆時間と重要度の観点から(は?)、セグメントレジスタを除いた名称と用途について記します(後日追記します)。
###汎用レジスタ
RAX:アキュムレータレジスタ 演算の結果を格納
RBX:ベースレジスタ アドレスのベース値を格納
RCX:カウンタレジスタ ループなどのカウンタの値を格納
RDX:データレジスタ 演算に使用するデータを格納
RSI:ソースインデックスレジスタ 一部のデータ転送命令において、データの転送元を格納
RDI:デスティネーションインデックスレジスタ 一部のデータ転送命令において、データの転送先を格納
###特殊レジスタ
RBP:ベースポインタレジスタ 現在のスタックにおける底のアドレスを保持
RSP:スタックポインタレジスタ 現在のスタックにおけるトップのアドレスを保持
RIP:インストラクションポインタレジスタ 次に実行する命令のアドレスを保持
###フラグレジスタ
OF:オーバーフローフラグ 演算命令で桁溢れが発生した際に1になる
DF:ディレクションフラグ ストリームの方向を制御する
IF:割り込み可能フラグ 割り込みを有効化する際に1になる
TF:トラップフラグ デバッグ時に1になる
SF:サインフラグ 演算命令の結果が負になった際に1になる
ZF:ゼロフラグ 演算命令の結果が0になった際に1になる
AF:調整フラグ BCD演算時に桁上がりあるいは桁借りが発生した際に1になる
PF:パリティフラグ 演算命令の結果について、1となるビットの数が偶数個の際に1になる
CF:キャリーフラグ 演算命令で桁上がりあるいは桁借りが発生した際に1になる
##汎用レジスタの部位
汎用レジスタには部位によって名前があり、RAXレジスタを例にあげると、
RAXレジスタの下位32bitはEAXレジスタ
EAXレジスタの下位16bitはAXレジスタ
AXレジスタの上位8bitはAH, 下位8bitはALレジスタと呼ばれます。
RBX, RCX, RDXレジスタはRAXレジスタと同じように、
下位32bitはEBX, ECX, EDXレジスタ
下位16bitはBX, CX, DXレジスタ
下位9~16bitはBH, CH, DHレジスタ
下位8bitはBL, CL, DLレジスタ
と呼ばれています。
インデックスレジスタは、
このようになります。
RDIレジスタもRSIレジスタと同様です。
##最後に
いかがでしたか?レジスタの意味を理解することは、アセンブラを読み解く上でとても役に立ちます。
目指せrevマスター!なりたい、revマスター...
明日の分の記事はうえきさんが書きます!では!