* スクリプト [#a5edfb45] #contents いつものように妄想という名の遊び。 * バイトコード [#k6da8bb7] スクリプトを解析後,変換されるバイトコード。 命令長が多少長くなっても,1命令で処理される内容が多い方がよいだろう。 * アセンブラ言語 [#fba2a405] ** オペランド [#t4cad9d2] :num - 数値| 頭に何も付けず数値,この場合は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 }} :@ - シンボル| シンボル名に使っていい文字列は[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 == reg[0] , r1 == reg[4] , ... r7 = reg[28] :* - アドレス先の値を受け取る| bp,もしくは@の前に*。 #code(){{ func: copy4 bp[-4] *bp[-8] }} :& - アドレス値を受け取る| bp,もしくは@の前に&。 #code(){{ func: copy4 bp[-4] &bp }} :相対アドレスの指定| bp,もしくは@の後ろに[数値]で指定。 省略したら[0]と等価。 ** ニーモニック命令 [#uc3b37a5] *** add - addition [#qe926862] :code| addi1 dest val addi2 dest val addi4 dest val addi8 dest val addf1 dest val addf2 dest val addf4 dest val addf8 dest val :summary| dest += val *** call - function call [#decffc2e] *** copy - single data copy [#e24d1a69] :code| copy1 dest src copy2 dest src copy4 dest src copy8 dest src :summary| dest = src *** 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] *** 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] *** 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; } }} |