スクリプト 
いつものように妄想という名の遊び。
バイトコード 
スクリプトを解析後,変換されるバイトコード。
命令長が多少長くなっても,1命令で処理される内容が多い方がよいだろう。
アセンブラ言語 
オペランド 
- num - 数値
- 頭に何も付けず数値,この場合は10進数表記。
もしくは頭に表記接頭辞f,b,d,h,x,を付ける。
符号を付ける場合は,表記接頭辞より手前に書く。
0
1
2
3
4
5
6
7
8
9
| // 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文字目に数値は使えない。
宣言するときはシンボル名の後に:。
参照するときは頭に@を付け,その後シンボル名。
0
1
2
3
| VALUE_ONE:
s32 1
func:
copy4 bp[-4] @VALUE_ONE[0]
|
- bp - ベースポインタレジスタ
- スタック上のベースとなる位置。
- reg - 計算用レジスタ
- 好きに使って良いテンポラリレジスタ。
reg[0]からreg[31]まで使える。
エイリアスもある。
r0 == reg[0] , r1 == reg[4] , ... r7 = reg[28]
- * - アドレス先の値を受け取る
- bp,もしくは@の前に*。
0
| func:
copy4 bp[-4] *bp[-8]
|
- & - アドレス値を受け取る
- bp,もしくは@の前に&。
- 相対アドレスの指定
- bp,もしくは@の後ろに[数値]で指定。
省略したら[0]と等価。
ニーモニック命令 
add - addition 
- 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 
copy - single data copy 
- code
- copy1 dest src
copy2 dest src
copy4 dest src
copy8 dest src
- summary
- dest = src
dec - decremental 
div - division 
enter - begin of function 
- code
- enter push_stack_size
- summary
- push bp; sp -= push_stack_size;
inc - incremental 
jump - jump program address 
leave - end of function 
- code
- leave
- summary
- sp = bp; pop bp;
mcopy - multi data copy 
- code
- mcopy dest src length
- summary
- memcpy(dest,src,length);
mod - 
mul - multiply 
sub - substitute 
メモ 
0
1
2
| main:
enter 4 # push bp , bp = sp , sp = bp-4
leave # sp = bp , pop bp
|
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; int* stack_value_ptr:
int i; i = 1;
i = *CONST_VALUE_ADDR;
i = CONST_OBJ_VALUE.y;
i = stack_value;
stack_value_addr = &stack_value;
i = *stack_value_ptr;
}
|
|