スクリプト
いつものように妄想という名の遊び。 バイトコードスクリプトを解析後,変換されるバイトコード。 命令長が多少長くなっても,1命令で処理される内容が多い方がよいだろう。 ./言語仕様 ./バイトコード ./オレ言語を作ってみたい人へ アセンブラ言語オペランドnum - 数値頭に何も付けず数値,この場合は10進数表記。 もしくは頭に表記接頭辞f,b,d,h,x,を付ける。 符号を付ける場合は,表記接頭辞より手前に書く。
pointer value
シンボル名に使っていい文字列は[a-zA-Z0-9_]。ただし1文字目に数値は使えない。 宣言するときはシンボル名の後に:。 参照するときは頭に@を付け,その後シンボル名。
using Std.Math;
好きに使って良いテンポラリレジスタ。 reg[0]からreg[31]まで使える。 エイリアスもある。 r0 == ®[0] , r1 == ®[4] , ... r7 = ®[28]
先頭に&。
先頭に*。
後ろに[数値]で指定。 省略したら[0]と等価。
ニーモニック命令表記
add - addition
addi1 addr:p lhs:i1 rhs:i1 addi2 addr:p lhs:i2 rhs:i2 addi4 addr:p lhs:i4 rhs:i4 addi8 addr:p lhs:i8 rhs:i8 addf4 addr:p lhs:f4 rhs:f4 addf8 addr:p lhs:f4 rhs:f8 addr is TypeP lhs is TypeA rhs is TypeA
*addr = lhs + rhs;
band - bit and
and1 addr:p lhs:a1 rhs:a1 and2 addr:p lhs:a2 rhs:a2 and4 addr:p lhs:a4 rhs:a4 and8 addr:p lhs:a8 rhs:a8 addr is TypeP lhs is TypeA rhs is TypeA
*addr = lhs & rhs;
bnot - bit not
bnot1 addr:p val:a1 bnot2 addr:p val:a2 bnot4 addr:p val:a4 bnot8 addr:p val:a8 addr is TypeP val is TypeA
*addr = ~val;
bor - bit or
bor1 addr:p lhs:a1 rhs:a1 bor2 addr:p lhs:a2 rhs:a2 bor4 addr:p lhs:a4 rhs:a4 bor8 addr:p lhs:a8 rhs:a8 addr is TypeP lhs is TypeA rhs is TypeA
*addr = lhs | rhs;
bxor - bit xor
bxor1 addr:p lhs:a1 rhs:a1 bxor2 addr:p lhs:a2 rhs:a2 bxor4 addr:p lhs:a4 rhs:a4 bxor8 addr:p lhs:a8 rhs:a8 addr is TypeP lhs is TypeA rhs is TypeA
*addr = lhs ^ rhs;
call - call function
call symbol:a symbol is TypeP cmp - compare
cmps1 lhs:s1 rhs:s1 cmps2 lhs:s2 rhs:s2 cmps4 lhs:s4 rhs:s4 cmps8 lhs:s8 rhs:s8 cmpu1 lhs:u1 rhs:u1 cmpu2 lhs:u2 rhs:u2 cmpu4 lhs:u4 rhs:u4 cmpu8 lhs:u8 rhs:u8 cmpf4 lhs:f4 rhs:f4 cmpf8 lhs:f8 rhs:f8 lhs is TypeA rhs is TypeA
cr[0] = lhs == rhs; cr[1] = lhs < rhs; cr[2] = lhs == NaN || rhs == NaN; ( only cmpf ) cnv - type convert
F4 cnvF4tF8 dest:p src:f4 cnvF4tS1 dest:p src:f4 cnvF4tS2 dest:p src:f4 cnvF4tS4 dest:p src:f4 cnvF4tS8 dest:p src:f4 cnvF4tU1 dest:p src:f4 cnvF4tU2 dest:p src:f4 cnvF4tU4 dest:p src:f4 cnvF4tU8 dest:p src:f4 F8 cnvF8tF4 dest:p src:f8 cnvF8tS1 dest:p src:f8 cnvF8tS2 dest:p src:f8 cnvF8tS4 dest:p src:f8 cnvF8tS8 dest:p src:f8 cnvF8tU1 dest:p src:f8 cnvF8tU2 dest:p src:f8 cnvF8tU4 dest:p src:f8 cnvF8tU8 dest:p src:f8 S1 cnvS1tF4 dest:p src:s1 cnvS1tF8 dest:p src:s1 cnvS1tS2 dest:p src:s1 cnvS1tS4 dest:p src:s1 cnvS1tS8 dest:p src:s1 cnvS1tU1 dest:p src:s1 cnvS1tU2 dest:p src:s1 cnvS1tU4 dest:p src:s1 cnvS1tU8 dest:p src:s1 S2 cnvS2tF4 dest:p src:s2 cnvS2tF8 dest:p src:s2 cnvS2tS1 dest:p src:s2 cnvS2tS4 dest:p src:s2 cnvS2tS8 dest:p src:s2 cnvS2tU1 dest:p src:s2 cnvS2tU2 dest:p src:s2 cnvS2tU4 dest:p src:s2 cnvS2tU8 dest:p src:s2 S4 cnvS4tF4 dest:p src:s4 cnvS4tF8 dest:p src:s4 cnvS4tS1 dest:p src:s4 cnvS4tS2 dest:p src:s4 cnvS4tS8 dest:p src:s4 cnvS4tU1 dest:p src:s4 cnvS4tU2 dest:p src:s4 cnvS4tU4 dest:p src:s4 cnvS4tU8 dest:p src:s4 S8 cnvS8tF4 dest:p src:s8 cnvS8tF8 dest:p src:s8 cnvS8tS1 dest:p src:s8 cnvS8tS2 dest:p src:s8 cnvS8tS4 dest:p src:s8 cnvS8tU1 dest:p src:s8 cnvS8tU2 dest:p src:s8 cnvS8tU4 dest:p src:s8 cnvS8tU8 dest:p src:s8 U1 cnvU1tF4 dest:p src:u1 cnvU1tF8 dest:p src:u1 cnvU1tS1 dest:p src:u1 cnvU1tS2 dest:p src:u1 cnvU1tS4 dest:p src:u1 cnvU1tS8 dest:p src:u1 cnvU1tU2 dest:p src:u1 cnvU1tU4 dest:p src:u1 cnvU1tU8 dest:p src:u1 U2 cnvU2tF4 dest:p src:u2 cnvU2tF8 dest:p src:u2 cnvU2tS1 dest:p src:u2 cnvU2tS2 dest:p src:u2 cnvU2tS4 dest:p src:u2 cnvU2tS8 dest:p src:u2 cnvU2tU1 dest:p src:u2 cnvU2tU4 dest:p src:u2 cnvU2tU8 dest:p src:u2 U4 cnvU4tF4 dest:p src:u4 cnvU4tF8 dest:p src:u4 cnvU4tS1 dest:p src:u4 cnvU4tS2 dest:p src:u4 cnvU4tS4 dest:p src:u4 cnvU4tS8 dest:p src:u4 cnvU4tU1 dest:p src:u4 cnvU4tU2 dest:p src:u4 cnvU4tU8 dest:p src:u4 ''U8' cnvU8tF4 dest:p src:u8 cnvU8tF8 dest:p src:u8 cnvU8tS1 dest:p src:u8 cnvU8tS2 dest:p src:u8 cnvU8tS4 dest:p src:u8 cnvU8tS8 dest:p src:u8 cnvU8tU1 dest:p src:u8 cnvU8tU2 dest:p src:u8 cnvU8tU4 dest:p src:u8 dest is TypeP src is TypeA
*dest = (type)*src;
copy - single data copy
copy1 addr:p val:a1 copy2 addr:p val:a2 copy4 addr:p val:a4 copy8 addr:p val:a8 addr is TypeP val is TypeA
*addr = val
dec - decremental
decf4 addr:p decf8 addr:p deci1 addr:p deci2 addr:p deci4 addr:p deci8 addr:p addr is TypeP
--*addr;
div - division
divf4 addr:p lhs:f4 rhs:f4 divf8 addr:p lhs:f8 rhs:f8 divs1 addr:p lhs:s1 rhs:s1 divs2 addr:p lhs:s2 rhs:s2 divs4 addr:p lhs:s4 rhs:s4 divs8 addr:p lhs:s8 rhs:s8 divu1 addr:p lhs:u1 rhs:u1 divu2 addr:p lhs:u2 rhs:u2 divu4 addr:p lhs:u4 rhs:u4 divu8 addr:p lhs:u8 rhs:u8 addr is TypeP lhs is TypeA rhs is TypeA
*addr = lhs / rhs;
enter - begin of function
enter push_stack_size:u4 enterR push_stack_size:u4 push_stack_size is TypeA
enter: push bp; bp = sp; sp -= push_stack_size; enterR: push bp; push reg; bp = sp; sp -= push_stack_size; inc - incremental
incf4 addr:p incf8 addr:p inci1 addr:p inci2 addr:p inci4 addr:p inci8 addr:p addr is TypeP
++*addr;
jump - jump program address
jump dest:p jumpe dest:p # if equal jumpne dest:p # if not equal jumpl dest:p # if less jumple dest:p # if less equal jumpu dest:p # if NaN exist jumpnu dest:p # if not NaN exist dest is TypeP leave - end of function
leave leaveR
leave: sp = bp; pop bp; leaveR: sp = bp; pop reg; pop bp; mcopy - multi data copy
mcopy4 dest:p src:p length:u4 dest is TypeP src is TypeP length is TypeA
memcpy(dest,src,length);
mod -
mods1 addr:p lhs:s1 rhs:s1 mods2 addr:p lhs:s2 rhs:s2 mods4 addr:p lhs:s4 rhs:s4 mods8 addr:p lhs:s8 rhs:s8 modu1 addr:p lhs:u1 rhs:u1 modu2 addr:p lhs:u2 rhs:u2 modu4 addr:p lhs:u4 rhs:u4 modu8 addr:p lhs:u8 rhs:u8 addr is TypeP lhs is TypeA rhs is TypeA
*addr = lhs % rhs;
mul - multiply
mulf4 addr:p lhs:f4 rhs:f4 mulf8 addr:p lhs:f8 rhs:f8 muls1 addr:p lhs:s1 rhs:s1 muls2 addr:p lhs:s2 rhs:s2 muls4 addr:p lhs:s4 rhs:s4 muls8 addr:p lhs:s8 rhs:s8 mulu1 addr:p lhs:u1 rhs:u1 mulu2 addr:p lhs:u2 rhs:u2 mulu4 addr:p lhs:u4 rhs:u4 mulu8 addr:p lhs:u8 rhs:u8 addr is TypeP lhs is TypeA rhs is TypeA
*addr = lhs * rhs;
sll - shift left as logical
sll1 addr:p lhs:a1 rhs:u1 sll2 addr:p lhs:a2 rhs:u2 sll4 addr:p lhs:a4 rhs:u4 sll8 addr:p lhs:a8 rhs:u8 addr is TypeP lhs is TypeA rhs is TypeA
*addr = lhs << rhs;
srl - shift right as logical
slr1 addr:p lhs:a1 rhs:u1 slr2 addr:p lhs:a2 rhs:u2 slr4 addr:p lhs:a4 rhs:u4 slr8 addr:p lhs:a8 rhs:u8 addr is TypeP lhs is TypeA rhs is TypeA
*addr = lhs >> rhs;
sub - substitute
subf4 addr:p lhs:f4 rhs:f4 subf8 addr:p lhs:f8 rhs:f8 subi1 addr:p lhs:i1 rhs:i1 subi2 addr:p lhs:i2 rhs:i2 subi4 addr:p lhs:i4 rhs:i4 subi8 addr:p lhs:i8 rhs:i8 addr is TypeP lhs is TypeA rhs is TypeA
*addr = lhs - rhs;
メモ
op[i1-i8f4-f8] val[p] val[i1-i8f4-f8] op[a1-a8] val[p] val[a1-a8] op[a1-a8] val[p] op[f4-f8s1-s8u1-u8] val[f4-f8s1-s8u1-u8] val[f4-f8s1-s8u1-u8] op[i1-i9f4-f8] val[p] op[f4-f8s1-s8u1-u8] val[p] val[f4-f8s1-s8u1-u8] op val:u4 op val:p op val:p val:p val:u4 op[s1-s8u1-u8] val[p] val[s1-s8u1-u8] op[a1-a8] val[p] val[u1-u8] cnvは特殊 val[p]: &bp[n] &symbol[n] ®[n] ®[n][n] *bp[n] *symbol[n] *reg[n] *reg[n][n] 値は禁止。 [0] : アドレスorアドレス参照 [12] 00 : bp [3] 0 : 12bit 相対アドレス指定 1 : 20bit 相対アドレス指定 [12] 01 : reg [1] 1 : symbol val[afisu]: num bp[n] symbol[n] reg[n] reg[n][n] *bp[n] *symbol[n] *reg[n] *reg[n][n] &bp[n] &symbol[n] ®[n] ®[n][n] [01] 00 : アドレス 01 : アドレス参照 10 : データ [23] 00 : num [45] type [67] type size [8-] data 00 : reg or bp 1 : symbol 11 : reg |