インラインアセンブリ
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、アセンブリはアセンブリ。混ぜるな危険?というポリシらしい。