アセンブラ

gasのディレクティブについて

アセンブリコードをアセンブルすると機械語になる。こういう説明が世の中じゃされてるけど、でもそれは半分ウソ。アセンブリコードの中でも機械語に直接対応しないものがある。それがディレクティブと呼ばれているもので、ドットから始まる命令がこれにあた…

セクションについて

gccによってコンパイルされたアセンブリソースを眺めていると、そこかしこに .text だとか .ascii だとか書かれているのを見かける。これらは一体なんなのさ、ということについて調べた。ピリオドで始まるこれはディレクティブと言うもので、様々な意味を持…

lealについて

lea命令は、Load Effective Address命令というもので、メモリ上の場所のアドレス値をレジスタに格納するもの。そのアドレスへのパイプを作っているような具合。なので、 leal 4(%esp), %eax とあったら、「ESPの値に4を足したメモリ位置」のアドレスを、EAX…

関数呼び出し

(C言語の)関数の呼び出し方に関するコンベンション類。原典がどこにあるか良く分からないので、ソースは日本語だったり観察から得られた事実だったりします。 環境は、gas 2.17.50 gcc 4.1.2 x86(Pentium M) Ubuntu Feisty Fawn ってな感じです。 関数に…

x86のレジスタについての簡単なまとめ

x86には8つの汎用レジスタがある。 各レジスタには使用目的があるので、それに応じて使い分けることでコードが分かりやすくなるし、命令も最適化される。また同じ命令がたくさん並ぶことになるので、圧縮の効率も上がる。 って http://www.swansontec.com/s…

PCをゲットしよう in x86 Linux

x86の命令ではPCを直接取得する命令はない。多分。でもcallを使うとメモリ上にPCは退避される。だったらそれを横から掠めてやれば、いつだってPCを見放題だね。 前回書いたように、Linuxでは関数の中のローカル変数一個めの位置から幾つか先に行ったところに…

スタックフレーム続き

とりあえず gcc -S してみた。 まずはmain部をretするまで。 main: leal 4(%esp), %ecx andl $-16, %esp pushl -4(%ecx) pushl %ebp movl %esp, %ebp pushl %ecx subl $20, %esp movl $printf, 8(%esp) movl $main, 4(%esp) movl $.LC1, (%esp) call printf …

アセンブリ言語を始めてみる

アセンブリ言語*1を始めてみることにした。 OCamlとLispはちょいとお休みで、しばらくはバイナリ方面をやってみることにした。手始めにインラインアセンブラについて勉強してみているところ。 思考タレ流しに近いので、以前やってたこととあんまり変わりない…