Entry

小さな hello world を書いてみる

2007年03月25日

ど深夜のおでましです。眠れないので,ひとつ書いてみました。

『Binay Hacks』を読んでいたら,「glibc を使わないで Hello World を書く」というのがあったので,ちょっとやってみることに。もっとも,残念ながら,あたしゃ FreeBSD を使っているので,Linux の include ファイルを利用する本書の Hack はできません。ただ,やってることは要するに,「システムコールを直接(glibc を使わないで)呼んじゃうよ」というもんなので,同じ方針でやってみます。

まず,普通の「hello world」。

#include <stdio.h>
int
main(int argc, char *argv[])
{
    printf("hello, world\n");
    return 0;
}

大きさは,こんな感じです。

aian:~ % ls -l hello
-rwxr-xr-x  1 aian  aian  5818  3 25 03:20 hello*

上のサイズは dynamic にリンクした時のサイズなので,static にリンクしてみます。すると,こんな感じ……ごっついですね。

aian:~ % ls -l hello
-rwxr-xr-x  1 aian  aian  118303  3 25 03:23 hello*

で,小さい hello world は直接システムコールを呼ぶ……と。これでいいのか。

.code32
.text
.global _start
_start:
        push    $len
        push    $msg
        push    $0x1
        movl    $0x4, %eax
        push    $0x4
        int      $0x80

        movl    $0x1, %eax
        int      $0x80
.data
msg:    .ascii "hello, world\n"
msgend: len = msgend - msg

アセンブルとリンクはこんな風にします。実行してみると,ちゃんと「hello, world」って言いますね。

aian:~ % as -a=hello.lst -o hello.o hello.S
aian:~ % ld -o hello hello.o
aian:~ % ./hello
hello, world

サイズはこんな風になりました。

aian:~ % ls -l hello
-rwxr-xr-x  1 aian  aian  755  3 25 03:33 hello*

『Binay Hacks』に倣って,もう少しダイエットしてみます。strip(1) を使って,シンボルを消してみましょう。

aian:~ % strip -s hello
aian:~ % ls -l hello
-rwxr-xr-x  1 aian  aian  388  3 25 03:36 hello*

『Binary Hacks』の hello world は488バイトだったところ,100バイト軽いのができました。勝ったぞ!(←意味不明)

と,こんな感じで,今アセンブリをボチボチ書いているんですけれど,巷にある as(1) の使い方は Linux 向けがほとんどで,FreeBSD 向けの説明はあまり無いんですよね。システムコールの呼び出し方からして,レジスタ経由で渡すモノと(Linux の場合),スタック経由で渡すモノ(FreeBSD の場合)とで違いがあったります。とりあえず,nasm 向けにあった「FreeBSD Assembly Language Programming」が参考になったので,これを読みつつ,as(1) に翻訳していくってな方法で書いていくことになりそうです。もちろん,as(1) に翻訳する前に nasm のやり方を見るってのもいいんですけどね。FreeBSD の boot0 は as(1) 向けに書かれているみたいだし,とりあえず見るのは as(1) かな……と。

IA-32 のアセンブリはほとんど未経験なんですけれど,AVR をいぢっていた(いる)せいか,割と取っ付きはいい感じです。しばらく遊び相手になってもらおうっと。眠気も戻ってきたし……さぁ,寝よ寝よ。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN