Binary2.0勉強会 2
前回は逆アセして出力するところまでいきました。
今回は命令の説明とかレジスタの説明とかで。途中で終わりそうだな。
前回出力した逆アセ結果をもう一度貼ります。
00000000 <main>: 0: 8d 4c 24 04 lea 0x4(%esp),%ecx 4: 83 e4 f0 and $0xfffffff0,%esp 7: ff 71 fc pushl -0x4(%ecx) a: 55 push %ebp b: 89 e5 mov %esp,%ebp d: 51 push %ecx e: b8 00 00 00 00 mov $0x0,%eax 13: 59 pop %ecx 14: 5d pop %ebp 15: 8d 61 fc lea -0x4(%ecx),%esp 18: c3 ret
lea、and、pushl、push…とかいうのは何か命令ぽいですね。その右側の%espとかがその命令の対象なんでしょうが、何だかよく分からない。
さて計算機は前回説明した通り色々してくれる賢い子なわけですが、値を記憶しておく部分が無いと計算結果を取っておけないので結局何もできませんね。その値を記憶する部分は普通はメモリなのですが、これはCPUとは別の物なので、CPUからのアクセスに結構時間がかかってしまいます。容量はそんなにたくさんなくていいから、頻繁に参照する値を置いておくスペースがCPU内に欲しい。
そんなわけで存在するのがレジスタと呼ばれる領域です。よくわからなかったら「CPU内でのみ使えるちょっぱやな変数」だと思ってください。
先ほどの %esp はレジスタの一つです。
レジスタはそこそこたくさん存在するのですが、とりあえず知っておかないといけないのは、
eax, ebx, ecx, edx, esi, edi, ebp, esp
この8つだけだと思います。すべて32ビットの領域を持っています(勿論32ビットのCPUならです)。
eax, ebx, ecx, edx は順番に、「accumulator」「base」「counter」「data」を意味しています。質的には同じ物だけれど、用途は違うということです。eとかxは気にするな!
ちなみにこれ書いてる時点で eax と ebx 以外のレジスタの用途がいまいち分かってませんから、困ったことですね。
ebp, esp の説明の前にスタックの説明忘れてたのでします。
スタックというのは一般的にはFILOなデータ構造のことを指すと思うのですが(pushしたりpopしたりするアレです)、ここではそれを使って表されるメモリ上のデータ領域を指すとします。すごいいい加減な説明だな。
さてそのスタックをアセンブリ言語で扱う際に使われるのが ebp, esp の二つのレジスタで、ebp はスタックの「底」を、 esp はスタックの「頭」を指しています。指しています、ということはつまりスタックの操作をなんらかの命令によって行った時、これらの値は自動的に置き換えられる、ということです。まあこの辺の詳細は命令の方で。
esi, edi はよく知りません(知っておかないといけないんじゃなかったのか!)。出てきたら調べます。
長くなってしまったのでおしまい。