インラインアセンブリ

9fansにHello worldアセンブリで書きたいという投稿が流れていた。最終的には以前「アセンブリでHello, world!」で書いたようなプログラムになったようだが、Oberonでインラインアセンブリはこう書くというコードがフォローされていた。バイナリアンな感じがびしびし伝わってくるね。Wirthはこんなのを許すのか?と思っていたら、このコードはPaul Reedのコンパイラじゃないと動かないらしい。

PROCEDURE syspread(poshi, poslo: LONGINT;
           VAR buf: ARRAY OF CHAR; fd: LONGINT): LONGINT;
       BEGIN
               (*
                       18: return value
                       14: poshi
                       10: poslo
                       0c: buflen
                       08; buf ptr
                       04: fd
                       00: RA
               *)

               SYSTEM.CODE(
                       0C9H,   (* leave *)
                       06AH, 50, (* pushb $close *)
                       058H, (* pop eax *)
                       0CDH, 040H,     (* int $40h *)
                       089H,084H,024H,018H,000H,000H,000H,  (* movl eax, 18h(esp) *)
                       0C2H, 14H, 0    (* ret $14h *)
               )
       END syspread;

Plan9 Cコンパイラにはインラインアセンブリ構文はない。あくまでCはC、アセンブリアセンブリ。混ぜるな危険?というポリシらしい。