BlankTar

about | blog | works | photo

昨日大学でLT大会みたいなものがありまして、何だかアセンブリ言語の話をやたらと聞かされました。
何となく確認したら私のPCにはnasmが入っていたので、何となくハローワールドを書きました。

こんなん。まったく読めない。
section .txt
	global _start

_start:
	mov edx,len
	mov ecx,msg
	mov ebx,1
	mov eax,4
	int 0x80

	mov eax,1
	int 0x80

section .data
	msg db 'hello, world!', 0xa
	len equ $ - msg
サンプルソースそのまんま。
eaxにシステムコール番号とやらを入れて、0x80で呼び出す、ということらしい。らしいが、よく分からない。

実行する時は
$ nasm -f elf64 hello.asm
$ nasm ld hello.o
$ ./a.out
てな感じで。elf64になってますが、32ビット環境の時はelfでおっけーです。

何と出力される実行ファイルのサイズが1018バイト! 小さい!
ldに-sオプションを付けると560バイト!!

これは凄いんじゃないか? と思ってC言語でも書いてみた。
#include <stdio.h>

int main()
{
	printf("hello, world!\n");
	return 0;
}
実によくあるハローワールド。

$ gcc hello.c
でコンパイルして、出力されたファイルは7.8KB。でかい、でかいぞ?
こっちにも-sオプションを付けると6.1KBまで小さく・・・いややっぱりでかいぞ?

調子に乗ってHaskellでも書いてみた。
main = putStrLn "hello, world!"
ソースコードが笑っちゃうくらい短い。

$ ghc hello.hs
でこれもコンパイルして、実行ファイルが1.1MB。メガバイト。超デカい!?
-sオプションは無いっぽいのでやらなかった。

せっかくなのでC++
#include <iostream>

int main()
{
	std::cout << "hello, world!" << std::endl;
	return 0;
}
こんな感じ。
$ g++ hello.cpp
コンパイルして、結果は8.4KB。Cよりちょっと大きい。
-sオプション付きは6.2KBでした。

というわけで、
nasm: 1018 B
C言語: 7.8 KB
C++: 8.4 KB
Haskell: 1.1 MB
という結果に。
流石というか何というか、Haskellでかいよ・・・。

ちなみにソースコードのサイズで言うと
nasm: 178 B
C言語: 74 B
C++: 91 B
Haskell: 32 B
でした。綺麗に逆転・・・と言いたい所だけれど、CよりC++のが大きい。

凄いなぁアセンブリ言語。やる気にはならんけどなぁ。

参考: 素人プログラマがアセンブラでHello worldに挑戦してみた。 - DQNEO起業日記
< pythonのOpenCVでモザイクをかける linuxのdwmをマルチモニタで使おう >