スクリプト Edit


いつものように妄想という名の遊び。

バイトコード Edit


スクリプトを解析後,変換されるバイトコード。

命令長が多少長くなっても,1命令で処理される内容が多い方がよいだろう。

./言語仕様

./バイトコード

./オレ言語を作ってみたい人へ

アセンブラ言語 Edit

オペランド Edit

num - 数値 Edit


頭に何も付けず数値,この場合は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 Edit

@ - シンボル

シンボル名に使っていい文字列は[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 == &reg[0] , r1 == &reg[4] , ... r7 = &reg[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

ニーモニック命令 Edit

表記 Edit

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
#spanend
 Operation:
   OperationCode Argument
   OperationCode Argument Argument
 
 OperactionCode:
   addi4
   copy4
   ...
#spandel
 
#spanend
 Argument:
   Name:Type
#spandel
 
#spanend
 Name:
   a-zA-Z
#spandel
 
#spanend
 Type:
   [aisuf][1248] # prefix is type kind. sufix is type size.
#spandel
型の接頭辞
  • a - any なんでもよし
  • i - integer 整数
  • s - signed integer 符号付き整数
  • u - unsigned integer 符号無し整数
  • f - float 浮動小数
  • p - address アドレス

add - addition Edit

code

addi1 addr:p val:i1

addi2 addr:p val:i2

addi4 addr:p val:i4

addi8 addr:p val:i8

addf4 addr:p val:f4

addf8 addr:p val:f8
c summary
*addr = *addr + val;

band - bit and Edit

code

and1 addr:p val:a1

and2 addr:p val:a2

and4 addr:p val:a4

and8 addr:p val:a8
c summary
*addr = addr & val;

bnot - bit not Edit

code

bnot1 addr:p

bnot2 addr:p

bnot4 addr:p

bnot8 addr:p
c summary
*addr = ~*addr;

bor - bit or Edit

code

bor1 addr:p val:a1

bor2 addr:p val:a2

bor4 addr:p val:a4

bor8 addr:p val:a8
c summary
*addr = *addr | val;

bxor - bit xor Edit

code

bxor1 addr:p val:a1

bxor2 addr:p val:a2

bxor4 addr:p val:a4

bxor8 addr:p val:a8
c summary
*addr = *addr ^ val;

cmp - compare Edit

code

cmps1 lhs:s1 rhs:s1

cmps2 lhs:s2 rhs:s2

cmps4 lhs:s4 rhs:s4

cmps8 lhs:s8 rhs:s8

cmpu1 lhs:u1 rhs:u1

cmpu2 lhs:u2 rhs:u2

cmpu4 lhs:u4 rhs:u4

cmpu8 lhs:u8 rhs:u8

cmpf4 lhs:f4 rhs:f4

cmpf8 lhs:f8 rhs:f8
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 Edit

code

cnvF4tS4 addr:p

cnvF4tU4 addr:p

cnvF8tS8 addr:p

cnvF8tU8 addr:p

cnvS1tU1 addr:p

cnvS2tU2 addr:p

cnvS4tF4 addr:p

cnvS4tU4 addr:p

cnvS8tF8 addr:p

cnvS8tS4 addr:p

cnvU1tS1 addr:p

cnvU2tS2 addr:p

cnvU4tF4 addr:p

cnvU4tS4 addr:p

cnvU8tF8 addr:p

cnvU8tS8 addr:p

...

cnvF4tF8 dest:p src:f4

cnvF8tF4 dest:p src:f8

cnvS1tS4 dest:p src:s1

cnvS2tS4 dest:p src:s2

cnvS4tS1 dest:p src:s4

cnvS4tS2 dest:p src:s4

cnvS4tS8 dest:p src:s4

cnvS8tU8 dest:p src:s8

cnvU1tU4 dest:p src:u1

cnvU2tU4 dest:p src:u2

cnvU4tU1 dest:p src:u4

cnvU4tU2 dest:p src:u4

cnvU4tU8 dest:p src:u4

cnvU8tU4 dest:p src:u8
c summary
*addr = (type)*addr;
*dest = (type)*src;

copy - single data copy Edit

code

copy1 addr:p val:a1

copy2 addr:p val:a2

copy4 addr:p val:a4

copy8 addr:p val:a8
c summary
*addr = val

dec - decremental Edit

code

decf4 addr:p

decf8 addr:p

deci1 addr:p

deci2 addr:p

deci4 addr:p

deci8 addr:p
c summary
--*addr;

div - division Edit

code

divf4 addr:p val:f4

divf8 addr:p val:f8

divs1 addr:p val:s1

divs2 addr:p val:s2

divs4 addr:p val:s4

divs8 addr:p val:s8

divu1 addr:p val:u1

divu2 addr:p val:u2

divu4 addr:p val:u4

divu8 addr:p val:u8
c summary
*addr = *addr / val;

enter - begin of function Edit

code

enter push_stack_size:u4
asm summary
push bp;  sp -= push_stack_size;

inc - incremental Edit

code

incf4 addr:p

incf8 addr:p

inci1 addr:p

inci2 addr:p

inci4 addr:p

inci8 addr:p
c summary
++*addr;

jump - jump program address Edit

code

jump dest_or_symbol:p

jumpe dest:p # if equal

jumpne dest:p # if not equal

jumpl dest:p # if less

jumple dest:p # if less equal

jumpu dest:p # if NaN exist

jumpnu dest:p # if not NaN exist

leave - end of function Edit

code

leave
asm summary

sp = bp; pop bp;

mcopy - multi data copy Edit

code

mcopy4 dest:p src:p length:u4
c summary
memcpy(dest,src,length);

mod - Edit

code

mods1 addr:p val:s1

mods2 addr:p val:s2

mods4 addr:p val:s4

mods8 addr:p val:s8

modu1 addr:p val:u1

modu2 addr:p val:u2

modu4 addr:p val:u4

modu8 addr:p val:u8
c summary
*addr = *addr % val;

mul - multiply Edit

code

mulf4 addr:p val:f4

mulf8 addr:p val:f8

muls1 addr:p val:s1

muls2 addr:p val:s2

muls4 addr:p val:s4

muls8 addr:p val:s8

mulu1 addr:p val:u1

mulu2 addr:p val:u2

mulu4 addr:p val:u4

mulu8 addr:p val:u8
c summary
*addr = *addr * val;

sll - shift left as logical Edit

code
sll1 addr:p num:u1
sll2 addr:p num:u2
sll4 addr:p num:u4
sll8 addr:p num:u8
c summary
*addr = *addr << num;

srl - shift right as logical Edit

code
slr1 addr:p num:u1
slr2 addr:p num:u2
slr4 addr:p num:u4
slr8 addr:p num:u8
c dummary
*addr = *addr >> num;

sub - substitute Edit

code

subf4 addr:p val:f4

subf8 addr:p val:f8

subi1 addr:p val:i1

subi2 addr:p val:i2

subi4 addr:p val:i4

subi8 addr:p val:i8
c summary
*addr = *addr - val;

メモ Edit

  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; // -4(bp)
  int* stack_value_ptr: // -8(bp)
#spandel
 
#spanend
  int i; // -12(bp)
  i = 1; // 値 load i 1
#spandel
 
#spanend
  // シンボルを参照 
  // load bp[-12] @CONST_VALUE_ADDR[0]
  i = *CONST_VALUE_ADDR; 
#spandel
 
#spanend
  // シンボルを参照 
  // load bp[-12] @CONST_OBJ_VALUE_ADDR[4]
  i = CONST_OBJ_VALUE.y; 
#spandel
 
#spanend
  // ベースポインタの相対指定
  // load bp[-12] bp[-4]
  i = stack_value; 
#spandel
 
#spanend
  // ベースポインタの相対アドレス
  // load bp[-8] &bp[-4]
  stack_value_addr = &stack_value;
#spandel
 
#spanend
  // ベースポインタの相対指定をアドレスとみなし参照
  // load bp[-12] *bp[-8]
  i = *stack_value_ptr; 
#spandel
} 
#spanend
#spanadd
//-----------------------------------------------------------
#spanend
#spanadd
// EOF
#spanend

op[i1-i8f4-f8] val[p] val[i1-i8f4-f8]

op[a1-a8] val[p] val[a1-a8]

op[a1-a8] val[p]

op[f4-f8s1-s8u1-u8] val[f4-f8s1-s8u1-u8] val[f4-f8s1-s8u1-u8]

op[i1-i9f4-f8] val[p]

op[f4-f8s1-s8u1-u8] val[p] val[f4-f8s1-s8u1-u8]

op val:u4

op val:p

op val:p val:p val:u4

op[s1-s8u1-u8] val[p] val[s1-s8u1-u8]

op[a1-a8] val[p] val[u1-u8]

cnvは特殊

val[p]:
&bp[n]
&symbol[n]
&reg[n]
&reg[n][n]
*bp[n]
*symbol[n]
*reg[n]
*reg[n][n]
値は禁止。
[0] : アドレスorアドレス参照
[12] 00 : bp
    [3] 0 : 12bit 相対アドレス指定
        1 : 20bit 相対アドレス指定
[12] 01 : reg
[1]  1  : symbol

val[afisu]:
num
bp[n]
symbol[n]
reg[n]
reg[n][n]
*bp[n]
*symbol[n]
*reg[n]
*reg[n][n]
&bp[n]
&symbol[n]
&reg[n]
&reg[n][n]
[01] 
00 : アドレス 
01 : アドレス参照
10 : データ
[23]
00 : num
    [45] type [67] type size [8-] data
00 : reg or bp
1  : symbol
11 : reg

    ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS