スクリプト
いつものように妄想という名の遊び。 バイトコードスクリプトを解析後,変換されるバイトコード。 命令長が多少長くなっても,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 val:i1 addi2 addr:p val:i2 addi4 addr:p val:i4 addi8 addr:p val:i8 addf4 addr:p val:f4 addf8 addr:p val:f8
*addr = *addr + val;
band - bit and
and1 addr:p val:a1 and2 addr:p val:a2 and4 addr:p val:a4 and8 addr:p val:a8
*addr = addr & val;
bnot - bit not
bnot1 addr:p bnot2 addr:p bnot4 addr:p bnot8 addr:p
*addr = ~*addr;
bor - bit or
bor1 addr:p val:a1 bor2 addr:p val:a2 bor4 addr:p val:a4 bor8 addr:p val:a8
*addr = *addr | val;
bxor - bit xor
bxor1 addr:p val:a1 bxor2 addr:p val:a2 bxor4 addr:p val:a4 bxor8 addr:p val:a8
*addr = *addr ^ val;
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
cr[0] = lhs < rhs; cr[1] = lhs == rhs; cr[2] = lhs == NaN; (only cmpf) cr[3] = rhs == NaN; (only cmpf) cnv - type convert
cnvF4tS4 addr:p cnvF4tU4 addr:p cnvF8tS8 addr:p cnvF8tU8 addr:p cnvS1tU1 addr:p cnvS2tU2 addr:p cnvS4tF4 addr:p cnvS4tU4 addr:p cnvS8tF8 addr:p cnvS8tS4 addr:p cnvU1tS1 addr:p cnvU2tS2 addr:p cnvU4tF4 addr:p cnvU4tS4 addr:p cnvU8tF8 addr:p cnvU8tS8 addr:p ... cnvF4tF8 dest:p src:f4 cnvF8tF4 dest:p src:f8 cnvS1tS4 dest:p src:s1 cnvS2tS4 dest:p src:s2 cnvS4tS1 dest:p src:s4 cnvS4tS2 dest:p src:s4 cnvS4tS8 dest:p src:s4 cnvS8tU8 dest:p src:s8 cnvU1tU4 dest:p src:u1 cnvU2tU4 dest:p src:u2 cnvU4tU1 dest:p src:u4 cnvU4tU2 dest:p src:u4 cnvU4tU8 dest:p src:u4 cnvU8tU4 dest:p src:u8
*addr = (type)*addr; *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 = val
dec - decremental
decf4 addr:p decf8 addr:p deci1 addr:p deci2 addr:p deci4 addr:p deci8 addr:p
--*addr;
div - division
divf4 addr:p val:f4 divf8 addr:p val:f8 divs1 addr:p val:s1 divs2 addr:p val:s2 divs4 addr:p val:s4 divs8 addr:p val:s8 divu1 addr:p val:u1 divu2 addr:p val:u2 divu4 addr:p val:u4 divu8 addr:p val:u8
*addr = *addr / val;
enter - begin of function
enter push_stack_size:u4
push bp; 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;
jump - jump program address
jump dest_or_symbol: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 leave - end of function
leave
sp = bp; pop bp; mcopy - multi data copy
mcopy4 dest:p src:p length:u4
memcpy(dest,src,length);
mod -
mods1 addr:p val:s1 mods2 addr:p val:s2 mods4 addr:p val:s4 mods8 addr:p val:s8 modu1 addr:p val:u1 modu2 addr:p val:u2 modu4 addr:p val:u4 modu8 addr:p val:u8
*addr = *addr % val;
mul - multiply
mulf4 addr:p val:f4 mulf8 addr:p val:f8 muls1 addr:p val:s1 muls2 addr:p val:s2 muls4 addr:p val:s4 muls8 addr:p val:s8 mulu1 addr:p val:u1 mulu2 addr:p val:u2 mulu4 addr:p val:u4 mulu8 addr:p val:u8
*addr = *addr * val;
sll - shift left as logical
sll1 addr:p num:u1 sll2 addr:p num:u2 sll4 addr:p num:u4 sll8 addr:p num:u8
*addr = *addr << num;
srl - shift right as logical
slr1 addr:p num:u1 slr2 addr:p num:u2 slr4 addr:p num:u4 slr8 addr:p num:u8
*addr = *addr >> num;
sub - substitute
subf4 addr:p val:f4 subf8 addr:p val:f8 subi1 addr:p val:i1 subi2 addr:p val:i2 subi4 addr:p val:i4 subi8 addr:p val:i8
*addr = *addr - val;
メモ
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 |