スクリプト 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

add - addition Edit

code

addi1 addr val

addi2 addr val

addi4 addr val

addi8 addr val

addf4 addr val

addf8 addr val
c summary
*addr += val

cmp - compare Edit

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)

copy - single data copy Edit

code

copy1 addr val

copy2 addr val

copy4 addr val

copy8 addr val
summary
*addr = val

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

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