【アセンブリ】汎用レジスタについて(x86)
前回うさみみハリケーンの使い方などの記事を書きましたが、その際にあまり触れなかった汎用レジスタについて今回は記事を書きたいと思います。
当初はアセンブリ言語の命令も一緒にやろうとおもいましたが、大分長くなってしまうので分けます。
自分自身も勉強しつつの備忘録になるため、少々おかしな点や、引用が多々ありますが、お許しください。
0.お世話になってる参考書
この本は大分昔にうさみみハリケーンを使って色々知りたいと思ったときに、当時何も知らなかった自分は入門書代わりに購入しました。(うさみみハリケーンの作者の本)
アマゾンのレビューの通り、調べれば書いてあることが多いとレビューがありますが、そもそも教科書の様に1から教えてくれる物をまとめてくれているので重宝しています。(当時持っていたのは x64非対応版)
そもそも、俺は本で読むほうが好き(あと本棚にキレイに並べるのが好き)
一応今回は本を読んで勉強したことをさらっとまとめる感じにしますのと、なるべくは、本の内容ばかりに頼らない様にします。(内容まるまるそのままじゃ本買う人いなくなっちゃうよね)
1.レジスタとは
一般に、論理回路において、フリップフロップなどにより状態を保持する装置をレジスタと呼ぶ。コンピュータにおいては、プロセッサが内蔵しているそれを指す。(Wikiより)
論理回路、フリップフロップ、プロセッサなどなど。これらも記述していくとかなりこの記事が長くなってしまうので今回は割愛。(自分自身も勉強の必要があるため)
レジスタとはCPUの一時記憶装置です。そのレジスタの中に、汎用レジスタというものが含まれています。(他にも色々レジスタには含まれてます。今回は割愛)
CPUの仕様をもっと詳しく知りたい人はこちら
他のレジスタも知りたい人はこちら
今回は上記のリンクを参考に汎用レジスタのみ紹介します。
2.汎用レジスタ
汎用レジスタは8個あります。その汎用レジスタは
■ EAX(AX/AL/AH)
■ EBX(BX/BL/BH)
■ ECX(CX/CL/CH)
■ EDX(DX/DL/DH)
■ ESI/SI
■ EDI/DI
■ ESP/SP
■ EBP/BP
があります。一つづつ説明していきます。それと、括弧の中の *X,*L,*Hについては、一旦汎用レジスタの説明が終わってから書きます。
これらとは別に
■ EIP
■ EFLAGS
は デバッガによるx86プログラム解析入門では汎用レジスタとして扱っているのですが(なにかあるのかな)、EIPに関しては今回の記事で取り上げますが、
EFLAGSも取り上げるととんでもなく記事が長くなるので、今回はやめておきます。
2-1.EAX(AX/AL/AH)
名称 : アキュムレータレジスタ(AccumulatorRegister)
accumulate = 累積する という言葉の意味のようです。
なので、WIKIBOOKSのリンクのように、
用途 : 算術演算操作の結果が格納(累積)される
ということです。
2-2.EBX(BX/BL/BH)
名称 : ベースレジスタ(BaseRegister)
base = 基礎 基底 なので、基底レジスタ。まんまですね。
用途 : アクセスしたいメモリ上の先頭番地(基底)を記憶しておく。
ただ、このベースレジスタだけではなく、インデックスレジスタもともに使うようで、ベースアドレスからの相対位置をインデックスレジスタに格納する。(IT用語辞典より)
WIKIBOOKSによると
セグメントモードでのDSに格納されたデータを指し示すために使用される。
とのことで、DSというのはセグメントレジスタ(今回はやりません)にある6個のレジスタの1つ。データへのポインタが格納されているようです。
2-3.ECX(CX/CL/CH)
名称 : カウントレジスタ(CountRegister)
シフトローテート命令とループ命令に使用される。(WIKIBOOKSより)
ループ命令は、アセンブリの命令の
loop rep jcxz
などの繰り返しやジャンプ条件を処理する際に、繰り返した回数を格納しておきます。(参考URL)なので用途は
用途 : 繰り返した回数を格納しておく
2-4.EDX(DX/DL/DH)
名称 : データレジスタ(DataRegister)
EAXでは扱いきれないデータをEDXに避難させる(64bitの計算、EAXとの連携による乗除算)。
用途 : 扱いきれないデータの一時格納先
2-5.ESI(SI)
名称 : ソースインデックス(SourceIndex)
■ ストリーム操作でのソースへのポインタとして使用される。(WIKIBOOKS)
■ EDIとセット。movsなど、連続して移動する読み込みの際の目的アドレスを格納。(x86レジスタについての簡単な説明)
■ 特殊なデータ転送などで処理元データを示すポインタ(デバッガによるx86プログラム解析入門)
のように、参考元によっては書き方が違うのでちょっとよくわかりませんね?
デバッガによるx86プログラム解析入門にはこのようなことも書かれていました。
データ転送命令等でデータの転送元アドレス(SI : SourceIndex)
そもそもデータ転送命令ってなんだろうという話になります。
SRCオペランドからDESTオペランドにデータをコピーするMOV命令や、
SRCオペランドとDESTオペランドのデータを交換するXCHG(Exchange)命令
などで利用する際に ESI には SRCオペランドのアドレスが格納されるものと思われます。
今回はアセンブリ命令に関しては詳しくはやらないですが、説明のために軽く書きました。
ちなみにESI及びEDI(後述)は転送元ないし転送先レジスタとして定義はされていますが、汎用的な活用(おそらく一時的なデータの格納)にも利用できます。
2-6.EDI(DI)
名称 : デスティネーションインデックス(DestinationIndex)
名前がかっこいい。
Destination = 目的地 行き先 到着地 などの意味だそうです。日本語にするとそうでもない。
先程のESIとの対で、
SRCオペランドからDESTオペランドにデータをコピーするMOV命令や、
SRCオペランドとDESTオペランドのデータを交換するXCHG(Exchange)命令
などで利用する際に EDI には DESTオペランドのアドレスが格納されるものと思われます。
2-7.ESP(SP)
名称 : スタックポインタ(StackPointer)
プログラムが一時的にデータを格納するメモリ領域のアドレスの一番お尻をスタックポインタにアドレスを格納します。スタックという名前の通り、pushしたりpopして、アドレスを吐き出させます。スタックって何?push?pop?というのがいまいちわからない人後入れ先出しとおぼえててください。参考サイト
スタックを物で再現するとしたら、先程の参考サイトでもありましたが、お皿を積み重ねてください。pushしたら机にお皿を1枚おく。もう一度pushしたら机に乗っけたお皿の一番上に重ねる。popしたら一番上のお皿を取る。
ポインタの説明に関しては、ベースポインタの方でやってますのでそっちでどうぞ。
ちなみにスタックに関してですが、スタックというものがそもそも存在して、そこに対して、pushしたりpopしたりすることです。
用途 : データが格納されたアドレスが入っているスタックのお尻(後入れ先出し)部分がESPに入る。順番に処理する際に使われる。
2-8.EBP(BP)
名称 : ベースポインタ(BasePointer)
■ スタック上のデータに対するポインタとして使用されます(デバッガによるx86プログラム解析入門)
■ 引数やローカル変数を指定する際の基準アドレスを格納する。(x86のレジスタについての簡単なまとめ)
そういえばポインタに関して説明してなかったので、もしかしたら突っ込まれるかもしれませんが書きます。
0x004000 = 0xFF
EAX = 0x004000
ただ EAXを参照したら帰ってくるのは 0x004000です。
EAXをポインタとして参照すると、 FF が返ってきます。
つまり、EAXをポインタとして扱うということはEAXが示すアドレスに対して参照する。ということになります。
そういうことだと思います。違かったらごめんなさい。
で、EBPですが、色々調べてるうちにいい参考サイトがありました。
使用するスタックのベース(基底)を示してくれるようです。
なので用途は、
用途 : 使用するスタックのベース(基底)を示す
2-9.EIP(IP)
名称 : インストラクションポインタ(InstructionsPointer)
用途 : 次に実行される命令アドレスのポインタ
正直もうこの言葉の通りでして、次実行する命令アドレスのポインタが格納されてます。うさみみハリケーンの記事の回では、ちょろっとやりました。
ちなみに Instructions の意味は 教育や教えという意味です。
よかったらリンクどうぞ
3.先程説明しなかった物
先ほど説明しなかった E*X,*X,*H,*Lについて
説明してきます。
3-1.*X/*L/*Hについて
EAXやEBXなどの説明を書いた際、
(AX/AL/AH)のような補足を書いていました。補足とはいいましたがこれらはちゃんと意味がありますので、説明致します。
*X,*H,*Lはそれぞれ
■ *X = 2byte
■ *H = 1byte
■ *L = 1byte
となってます。
*X(多分クロス?の意味)の上位1byteが *H(igh)で、下位1byteが *L(ow) です。16bitCPUの時代はこれで良かったのですが、32bitではこれでは足りなかったので、 E*X というものが増え、これは上位2byteは*X。下位2byteも*Xとすることで、4byte確保しました。
3-2.そもそもEとは
このEはExtendのEで、拡張されたなどの意味です。16bitから32bitにExtendしたということです。
なので、EAXはエクステンドアキュムレータレジスタ。というのが本来は正しいのかもしれません。(どうかはわかりませんが)
ディスカッション
コメント一覧
まだ、コメントがありません