スクリプト Edit


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

バイトコード Edit


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

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

./言語仕様

./バイトコード

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

アセンブラ言語 Edit

オペランド Edit

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

./メモ
@ - シンボル

シンボル名に使っていい文字列は[a-zA-Z0-9_]。ただし1文字目に数値は使えない。

宣言するときはシンボル名の後に:

参照するときは頭に@を付け,その後シンボル名。
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
#spanend
#spandel
VALUE_ONE:
#spanend
    s32 1
#spanadd
#code(D,){{
#spanend
#spanadd
//-----------------------------------------------------------
#spanend
#spanadd
module Project.Util.Vector3;
#spanend
 
#spandel
func:
#spanend
    copy4 bp[-4] @VALUE_ONE[0]
#spandel

using Std.Math;
bp - ベースポインタレジスタ

スタック上のベースとなる位置。
  0
  1
  2
  3
  4
#spanend
#spandel
func:
#spanend
    copy4 bp[-4] 1
#spandel
reg - 計算用レジスタ

好きに使って良いテンポラリレジスタ。

reg[0]からreg[31]まで使える。

エイリアスもある。

r0 == reg[0] , r1 == reg[4] , ... r7 = reg[28]
* - アドレス先の値を受け取る

bp,もしくは@の前に*。
  0
  1
  2
  3
  4
#spanend
#spandel
func:
#spanend
    copy4 bp[-4] *bp[-8]
#spandel
& - アドレス値を受け取る

bp,もしくは@の前に&。
  0
  1
  2
  3
  4
#spanend
#spandel
func:
#spanend
    copy4 bp[-4] &bp
#spandel
相対アドレスの指定

bp,もしくは@の後ろに[数値]で指定。

省略したら[0]と等価。

ニーモニック命令 Edit

add - addition Edit

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 Edit

copy - single data copy Edit

code

copy1 dest src

copy2 dest src

copy4 dest src

copy8 dest src
summary

dest = src

dec - decremental Edit

div - division Edit

enter - begin of function Edit

code

enter push_stack_size
summary

push bp; sp -= push_stack_size;

inc - incremental Edit

jump - jump program address Edit

leave - end of function Edit

code

leave
summary

sp = bp; pop bp;

mcopy - multi data copy Edit

code

mcopy dest src length
summary

memcpy(dest,src,length);

mod - Edit

mul - multiply Edit

sub - substitute Edit

メモ 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

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