たまに書きます。

気になって調べたことを書いていきます。

アセンブリ言語勉強中。。。

某大学生命科学科の僕ですが、今学期は初めて、他学科の授業をひとつだけ受けています。それは何かと言うと、アセンブリ言語。
「エキスパートCプログラミング」などの書籍は読んでいたので、C言語がアセンブリ言語に翻訳されるとき、どのように置き換えられるのか、少々の理解はあるつもりでしたが、実際自分で書いてみるとなると、全く難しい限りです。
やっぱりプログラミング言語の習得なんて、どんなクダらんプログラムであろうと、自分でとりあえず書いてみてナンボですね。
とりあえず、最低限の四則演算の仕方は把握したつもりです。
でも、何か手元で参照するものがなければ全然書けません。

なんとなく書いてみたものを載せてみます。
(9+6)*3/9を計算して、最終的にeaxレジスタに保存。
それを、スタックポインタ上に関数コールの為のスタックフレームを作成した後で、おなじみのprintf関数に渡して出力するコードです。

ふぅ。。。お酒を飲んで疲れたので寝よう。。。

.data
L_fmt:
.ascii "%d\n\0"
.text
.globl _main
_main:
 movl  $9,   %eax       # (9 + 6) * 3 / 9 =
 addl  $6,   %eax
 imull $3,   %eax
 movl  $9,   %ecx
 idivl %ecx
 pushl %ebp
 movl  %esp, %ebp
 subl  $8,   %esp
 subl  $8,   %esp
 pushl %eax
 pushl $L_fmt
 call _printf
 leave
 ret