* スクリプト [#a5edfb45] #contents いつものように妄想という名の遊び。 * バイトコード [#k6da8bb7] スクリプトを解析後,変換されるバイトコード。 命令長が多少長くなっても,1命令で処理される内容が多い方がよいだろう。 * アセンブラ言語 [#fba2a405] ** オペランド [#t4cad9d2] *** num - 数値 [#ae8a2597] 頭に何も付けず数値,この場合は10進数表記。 もしくは頭に表記接頭辞''f'',''b'',''d'',''h'',''x'',を付ける。 符号を付ける場合は,表記接頭辞より手前に書く。 #code(){{ // 10進数表記 copy4 &bp[-4] 12345 copy4 &bp[-4] d12345 // 2進数表記 copy4 &bp[-4] b0001 // 8進数表記 copy4 &bp[-4] h7543 // 16進数表記 copy4 &bp[-4] x0123ABCD // 浮動点小数 copy4 &bp[-4] f1.23456 }} *** pointer value [#dbd08b25] :@ - シンボル| シンボル名に使っていい文字列は[a-zA-Z0-9_]。ただし1文字目に数値は使えない。 宣言するときはシンボル名の後に'':''。 参照するときは頭に@を付け,その後シンボル名。 #code(){{ VALUE_ONE: s32 1 func: copy4 &bp[-4] @VALUE_ONE[0] }} :bp - ベースポインタレジスタ| スタック上のベースとなる位置。 #code(){{ func: copy4 &bp[-4] 1 }} :reg - 計算用レジスタ| 好きに使って良いテンポラリレジスタ。 reg[0]からreg[31]まで使える。 エイリアスもある。 r0 == ®[0] , r1 == ®[4] , ... r7 = ®[28] :& - アドレス値を受け取る| 先頭に''&''。 #code(){{ func: copy4 &bp[-4] &bp }} :* - アドレス先の値を受け取る| 先頭に''*''。 #code(){{ func: copy4 &bp[-4] *bp[-8] }} :相対アドレスの指定| 後ろに[数値]で指定。 省略したら[0]と等価。 :example| #code(){{ # addr is 0x100 CONST_VALUE: s32 10 s32 20 u32 0x100 u32 0x110 #addr is 0x110 MUTABLE_VALUE: s32 0 s32 0 func: copy4 @MUTABLE_VALUE @CONST_VALUE # 0x110 = 0x100 copy4 @MUTABLE_VALUE @CONST_VALUE[0] # 0x110 = 10 copy4 @MUTABLE_VALUE &@CONST_VALUE[1] # 0x110 = 0x108 copy4 @MUTABLE_VALUE *@CONST_VALUE[2] # 0x110 = 10 }} ** ニーモニック命令 [#uc3b37a5] *** 表記 [#b934f54d] |表記|説明| |addr|読み書きするアドレス。| |[name]:[type]|値の名前とその値の型。| |name|名前。| |type|型。最初1文字が種類。2文字目がバイト数| :型の接頭辞| -a - any なんでもよし -i - integer 整数 -s - signed integer 符号付き整数 -u - unsigned integer 符号無し整数 -f - float 浮動小数 *** add - addition [#qe926862] :code| addi1 addr val:i1 addi2 addr val:i2 addi4 addr val:i4 addi8 addr val:i8 addf4 addr val:f4 addf8 addr val:f8 :c summary| *addr = *addr + val; *** band - bit and [#ke51ecc3] :code| and1 addr val:a1 and2 addr val:a2 and4 addr val:a4 and8 addr val:a8 :c summary| *addr = addr & val; *** bnot - bit not [#t94f668f] :code| bnot1 addr bnot2 addr bnot4 addr bnot8 addr :c summary| *addr = ~*addr; *** bor - bit or [#s44cc09f] :code| bor1 addr val bor2 addr val bor4 addr val bor8 addr val :c summary| *addr = *addr | val; *** bxor - bit xor [#c38745c8] :code| bxor1 addr val bxor2 addr val bxor4 addr val bxor8 addr val :c summary| *addr = *addr ^ val; *** cmp - compare [#cc7b57c2] :code| cmps1 lhs rhs cmps2 lhs rhs cmps4 lhs rhs cmps8 lhs rhs cmpu1 lhs rhs cmpu2 lhs rhs cmpu4 lhs rhs cmpu8 lhs rhs cmpf4 lhs rhs cmpf8 lhs rhs (cmps is signed integer compare. cmpu is unsigned integer compare. cmpf is floating point compare.) :c summary| cr[0] = lhs < rhs; cr[1] = lhs == rhs; cr[2] = lhs == NaN; (only cmpf) cr[3] = rhs == NaN; (only cmpf) *** cnv - type convert [#we231cea] :code| cnvF4tF8 addr cnvF4tS4 addr cnvF4tU4 addr cnvF8tF4 addr cnvF8tS8 addr cnvF8tU8 addr cnvS1tS4 addr cnvS2tS4 addr cnvS4tF4 addr cnvS4tS1 addr cnvS4tS2 addr cnvS4tS8 addr cnvS4tU4 addr cnvS8tF8 addr cnvS8tS4 addr cnvS8tU8 addr cnvU1tU4 addr cnvU2tU4 addr cnvU4tF4 addr cnvU4tS4 addr cnvU4tU1 addr cnvU4tU2 addr cnvU4tU8 addr cnvU8tF8 addr cnvU8tS8 addr cnvU8tU4 addr *** copy - single data copy [#e24d1a69] :code| copy1 addr val copy2 addr val copy4 addr val copy8 addr val :c summary| *addr = val *** dec - decremental [#c3d22c67] *** div - division [#q8f62086] *** enter - begin of function [#s4d19122] :code| enter push_stack_size :summary| push bp; sp -= push_stack_size; *** inc - incremental [#c31d1776] *** jump - jump program address [#y641cfb3] :code| jump dist_or_symbol jumpe dist # if equal jumpne dist # if not equal jumpl dist # if less jumple dist # if less equal jumpv dist # if NaN exist jumpnv dist # if not NaN exist *** leave - end of function [#j3a9666b] :code| leave :summary| sp = bp; pop bp; *** mcopy - multi data copy [#e24d1a69] :code| mcopy dest src length :summary| memcpy(dest,src,length); *** mod - [#g5b972f0] *** mul - multiply [#sbf078cf] *** sll - shift left as logical [#e4fbcec7] :code| sll1 addr num sll2 addr num sll4 addr num sll8 addr num :c summary| *addr <<= num *** srl - shift right as logical [#r4a47f80] :code| slr1 addr num slr2 addr num slr4 addr num slr8 addr num :c dummary| *addr >>= num *** sub - substitute [#cafb3924] ** メモ [#n35db29d] #code(){{ main: enter 4 # push bp , bp = sp , sp = bp-4 leave # sp = bp , pop bp }} #code(c,){{ const int CONST_VALUE = 1; const int* CONST_VALUE_ADDR = &CONST_VALUE; struct Pos { int x; int y; }; const Pos CONST_OBJ_VALUE = {0,0}; const Pos* CONST_OBJ_VALUE_ADDR = &CONST_OBJ_VALUE; void func() { int stack_value; // -4(bp) int* stack_value_ptr: // -8(bp) int i; // -12(bp) i = 1; // 値 load i 1 // シンボルを参照 // load bp[-12] @CONST_VALUE_ADDR[0] i = *CONST_VALUE_ADDR; // シンボルを参照 // load bp[-12] @CONST_OBJ_VALUE_ADDR[4] i = CONST_OBJ_VALUE.y; // ベースポインタの相対指定 // load bp[-12] bp[-4] i = stack_value; // ベースポインタの相対アドレス // load bp[-8] &bp[-4] stack_value_addr = &stack_value; // ベースポインタの相対指定をアドレスとみなし参照 // load bp[-12] *bp[-8] i = *stack_value_ptr; } }} |