Hello, world!
先日、UNIX V1が動いたという話を書いたが、現実逃避でHello, world!書いてみた。もちろんPDP-11アセンブリでである。
r0にstdoutのファイル記述子を入れてwriteシステムコールを呼び出す。文字列のアドレスと文字数は、sys命令の後に列挙する。$は即値で、14の後のピリオドは10進数を意味する(デフォルトは8進数)。ちなみに、a.outのサイズは68バイト。
# ed hello.s
?
a
mov $1,r0
sys write; 1f; 14.
sys exit
1: <hello, world!\n>
.
w
64
q
# as hello.s
I
II
# ./a.out
hello, world!ところで、エディタはedしかないので頑張れ。私もedでのプログラミングははじめてだった。catを使う手もあるけど...
また、ユーザランドコマンドのイディオムとしてよく現れるのは、こんな感じの使い方。
jsr r5,mesg; <hello, world!\n\0>; .even
sys exit
mesg:
movb (r5)+,ch
beq 1f
mov $1,r0
sys write; ch; 1
br mesg
1:
inc r5
bic $1,r5
rts r5
.bss
ch: .=.+2nullターミネートな文字列ってのは、このころすでに使っていたのか。と思ったら、ここによると、DECのマクロアセンブラの.ASCIZディレクティブがnullターミネートだったようだ。この辺がC文字列の起源なのかな。