* スクリプト [#a5edfb45] #contents いつものように妄想という名の遊び。 * バイトコード [#k6da8bb7] スクリプトを解析後,変換されるバイトコード。 命令長が多少長くなっても,1命令で処理される内容が多い方がよいだろう。 ** アセンブラ言語 [#fba2a405] *** オペランド [#t4cad9d2] :num - 値| 頭に何も付けず数値,この場合は10進数表記。 もしくは頭に''b'',''d'',''h'',''x''を付ける。 #code(){{ // 10進数表記 copy bp[-4] 12345 copy bp[-4] d12345 // 2進数表記 copy bp[-4] b0001 // 8進数表記 copy bp[-4] h7543 // 16進数表記 copy bp[-4] x0123ABCD }} :@ - シンボル| シンボル名に使っていい文字列は[a-zA-Z0-9_]。ただし1文字目に数値は使えない。 宣言するときはシンボル名の後に'':''。 参照するときは頭に@を付け,その後シンボル名。 #code(){{ VALUE_ONE: s32 1 func: copy bp[-4] @VALUE_ONE[0] }} :bp - ベースポインタレジスタ| スタック上のベースとなる位置。 #code(){{ func: copy bp[-4] 1 }} :* - アドレス先の値を受け取る| bp,もしくは@の前に*。 #code(){{ func: copy bp[-4] *bp[-8] }} :& - アドレス値を受け取る| bp,もしくは@の前に&。 #code(){{ func: copy bp[-4] &bp }} :相対アドレスの指定| bp,もしくは@の後ろに[数値]で指定。 省略したら[0]と等価。 ** 命令 [#uc3b37a5] *** copy - 代入 [#e24d1a69] C言語で書くとdest = src。 copy1 dest src copy2 dest src copy4 dest src copy8 dest src ** メモ [#n35db29d] ** データの指定。 [#y48b504b] #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; } }} |