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:     .=.+2

nullターミネートな文字列ってのは、このころすでに使っていたのか。と思ったら、ここによると、DECのマクロアセンブラの.ASCIZディレクティブがnullターミネートだったようだ。この辺がC文字列の起源なのかな。