「ぐいぐい01」のAPI再検討
(0)
- OSASK-IRCでneriさんにCOM64plusのフォーマットであれこれアドバイスしていたら、あっという間に非常にコンパクトな仕様になり、helloが25バイトで書けることになってしまった。helloだけならまだしもcharsも26バイトで書けるらしい。
- 一時は「これはしょうがない」とあきらめたものの、いい方法を思いついたのでそれをベースに再設計を試みる。
- このようなハイレベルな競争ができることを本当にありがたく思う。
(1)
- アイデアリスト:
- EBX=-1を正式なものにする。・・・いやまて、EBXではなくEDXで指定することにする。本当はEDIにしたい。・・・やっぱりEDXでいいや。EDXで困るのはIN/OUTとMUL/DIVくらいなもの。EDIだってストリング命令で困るし、手ごろなアドレスレジスタだってほしい。だからこれでいい。・・・いややっぱりEDIにしよう。C言語のことはひとまず忘れる。悪いのはC言語の仕様であって、それに流されるべきではない。
- 最初はEIP自動インクリメント、モードgh4、長さ無限、にする。
- 4bitの6をプリフィクスにする。
- 6_0: 32bitレジスタ、スタック指定プリフィクス
- 6_1: 8bitレジスタ、スタック指定プリフィクス
- 6_2: 式用リザーブ
- 6_3: 各種定数など
- 6_4: ブランチ系0
- 6_4_a_b_c_d: aのbit0は個数式/ターミネータ式, bit1がgosub/goto, bit2がインクリメントありなし、ポインタありなし, bがgh4/8bit/16bit/32bit/64bit..., cが個数もしくはターミネータ, dはポインタ
- 0はポインタなし
- 1はポインタありインクリメントあり
- 2はポインタありインクリメントなし
- gotoはつまり個数=infだ。gosubでないなら個数もターミネータも関係ない
- 6_5_a_b_c_d: ブランチ系1 (個数もしくはターミネータがコマンドの動作としても有効)
- これを[個数-データ列]が来る場所に置く。gosubのみ。gotoだとコマンドが終わらない。
- 6_6: 各種拡張
- そもそもシグネチャの後にタグ総数がないのはおかしい。終わりが分からないじゃないか。それとも終端制にするか?いや個数にする。
- そして0個はありえないので、0個ならイメージのみと判定、サイズも別の方法で取得できるから省略とする。これでオーバヘッドは5バイト。
- 個数0だと4bitあまる。これがもったいない。
- bit1はHLT->CALL(EBP)置換。悪くないけどエスケープしにくそうだからやめた。コードセクションでもっとも出現頻度の低いバイトを探せ。・・・やっぱF4でやろう。
- bit0はrjcのキャンセルフラグ。
- bit2は終了時自動改行抑制フラグ。
- デフォルトrjc。しかもrjc後にコードセクションの末尾にRETのコードを付加。
- ボツ案:
- 個数を指定する文脈で6_6_0が来ると、個数ではなくターミネータ指定。・・・っていうかそんなのオプションでいいじゃん。確かにそうだ。
- やはり最初はブランチ・モード指定
- ボツ案の6_4を省いて、aのbit0に個数は非データ/データを追加したもの。
(2)
- 実験:
- hello:
- 5 0 6_5_(001)_0 "hello, world\n\0" -- 17バイト
- これに5バイトつけると、22バイト
- HLT変換+自動改行で20バイト
- chars:
- 5 0 1 6_1_0 3 -- 3.5バイト
- 5 0 1 [0a] 3 -- 3バイト
- AL=20; CALL(EBP); DB(4バイト); EAX++; CMP(AL,0x7f); JB do; CALL(EBP); DB(3バイト);
- 5+18=23バイト
- HLT変換+自動改行で17バイト
こめんと欄