いつものように妄想という名の遊び。
スクリプトを解析後,変換されるバイトコード。 命令長が多少長くなっても,1命令で処理される内容が多い方がよいだろう。
0 1 2 3 4 5 6 7
// 10進数表記 copy bp[-4] 12345 copy bp[-4] d12345 // 2進数表記 copy bp[-4] b0001 // 8進数表記 copy bp[-4] h7543 // 16進数表記 copy bp[-4] x0123ABCD
0 1 2 3
VALUE_ONE: s32 1 func: copy bp[-4] @VALUE_ONE[0]
0
func: copy bp[-4] 1
func: copy bp[-4] *bp[-8]
func: copy bp[-4] &bp
C言語で書くとdest = src。 copy1 dest src copy2 dest src copy4 dest src copy8 dest src
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
- | | ! - | | | | | | | | | | | | | | | | | | | | | | | | | !
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; }