スクリプト
いつものように妄想という名の遊び。
バイトコード
スクリプトを解析後,変換されるバイトコード。
命令長が多少長くなっても,1命令で処理される内容が多い方がよいだろう。
./言語仕様
./バイトコード
./オレ言語を作ってみたい人へ
アセンブラ言語
オペランド
num - 数値
頭に何も付けず数値,この場合は10進数表記。
もしくは頭に表記接頭辞f,b,d,h,x,を付ける。
符号を付ける場合は,表記接頭辞より手前に書く。
0
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
| #spanend
#spandel
// 10進数表記
#spanend
#spandel
copy4 &bp[-4] 12345
#spanend
#spandel
copy4 &bp[-4] d12345
#spanend
#spandel
// 2進数表記
#spanend
#spandel
copy4 &bp[-4] b0001
#spanend
#spandel
// 8進数表記
#spanend
#spandel
copy4 &bp[-4] h7543
#spanend
#spandel
// 16進数表記
#spanend
#spandel
copy4 &bp[-4] x0123ABCD
#spanend
#spandel
// 浮動点小数
#spanend
#spandel
copy4 &bp[-4] f1.23456
#spanend
#spandel
|
pointer value
- @ - シンボル
シンボル名に使っていい文字列は[a-zA-Z0-9_]。ただし1文字目に数値は使えない。
宣言するときはシンボル名の後に:。
参照するときは頭に@を付け,その後シンボル名。
0
1
2
3
4
5
6
7
8
9
10
11
12
| #spanend
#spandel
VALUE_ONE:
#spanend
s32 1
#spanadd
[[./メモ]]
#spanend
#spandel
func:
#spanend
copy4 &bp[-4] @VALUE_ONE[0]
#spandel
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
-
|
|
|
|
|
|
| #spanend
#spanadd
#spanend
#spanadd
module Project.Util.Vector3;
#spanend
#spandel
:bp - ベースポインタレジスタ|
#spanend
#spandel
スタック上のベースとなる位置。
#spanend
#spandel
#code(){{
#spanend
#spandel
func:
#spanend
copy4 &bp[-4] 1
#spandel
|
using Std.Math;
- reg - 計算用レジスタ
好きに使って良いテンポラリレジスタ。
reg[0]からreg[31]まで使える。
エイリアスもある。
r0 == ®[0] , r1 == ®[4] , ... r7 = ®[28]
- & - アドレス値を受け取る
先頭に&。
0
1
2
3
4
| #spanend
#spandel
func:
#spanend
copy4 &bp[-4] &bp
#spandel
|
- * - アドレス先の値を受け取る
先頭に*。
0
1
2
3
4
| #spanend
#spandel
func:
#spanend
copy4 &bp[-4] *bp[-8]
#spandel
|
- 相対アドレスの指定
後ろに[数値]で指定。
省略したら[0]と等価。
- example
0
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
| #spanend
# addr is 0x100
#spandel
CONST_VALUE:
#spanend
s32 10
s32 20
u32 0x100
u32 0x110
#spandel
#spanend
#spandel
#addr is 0x110
#spanend
#spandel
MUTABLE_VALUE:
#spanend
s32 0
s32 0
#spandel
#spanend
#spandel
func:
#spanend
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
#spandel
#spanend
#spandel
|
ニーモニック命令
表記
- 型の接頭辞
- a - any なんでもよし
- i - integer 整数
- s - signed integer 符号付き整数
- u - unsigned integer 符号無し整数
- f - float 浮動小数
add - addition
- 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
- 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
- code
bnot1 addr
bnot2 addr
bnot4 addr
bnot8 addr
- c summary
*addr = ~*addr;
bor - bit or
- code
bor1 addr val
bor2 addr val
bor4 addr val
bor8 addr val
- c summary
*addr = *addr | val;
bxor - bit xor
- code
bxor1 addr val
bxor2 addr val
bxor4 addr val
bxor8 addr val
- c summary
*addr = *addr ^ val;
cmp - compare
- 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
- 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
- code
copy1 addr val
copy2 addr val
copy4 addr val
copy8 addr val
- c summary
*addr = val
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
- 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
- code
leave
- summary
sp = bp; pop bp;
mcopy - multi data copy
- code
mcopy dest src length
- summary
memcpy(dest,src,length);
mod -
mul - multiply
sll - shift left as logical
- code
sll1 addr num
sll2 addr num
sll4 addr num
sll8 addr num
- c summary
*addr <<= num
srl - shift right as logical
- code
slr1 addr num
slr2 addr num
slr4 addr num
slr8 addr num
- c dummary
*addr >>= num
sub - substitute
メモ
0
1
2
3
4
5
6
7
8
9
10
11
| #spanend
#spandel
#spanend
#spandel
main:
#spanend
enter 4 # push bp , bp = sp , sp = bp-4
#spandel
#spanend
leave # sp = bp , pop bp
#spandel
|
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
-
|
|
|
|
|
|
-
|
!
|
|
|
|
|
|
!
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
!
| #spanend
#spandel
#spanend
#spandel
const int CONST_VALUE = 1;
#spanend
#spandel
const int* CONST_VALUE_ADDR = &CONST_VALUE;
#spanend
#spandel
#spanend
#spandel
struct Pos
#spanend
#spanadd
#spanend
#spanadd
pod Vector3
#spanend
{
int x;
int y;
#spanadd
public:
#spanend
float length()const
{
return Math.Sqrt( x*x + y*y + z*z );
}
#spanadd
#spanend
float x;
float y;
float z;
};
#spandel
const Pos CONST_OBJ_VALUE = {0,0};
#spanend
#spandel
const Pos* CONST_OBJ_VALUE_ADDR = &CONST_OBJ_VALUE;
#spanend
#spandel
void func()
#spanend
#spandel
{
#spanend
int stack_value;
int* stack_value_ptr:
#spandel
#spanend
int i;
i = 1;
#spandel
#spanend
i = *CONST_VALUE_ADDR;
#spandel
#spanend
i = CONST_OBJ_VALUE.y;
#spandel
#spanend
i = stack_value;
#spandel
#spanend
stack_value_addr = &stack_value;
#spandel
#spanend
i = *stack_value_ptr;
#spandel
}
#spanend
#spanadd
#spanend
#spanadd
#spanend
|