• 追加された行はこの色です。
  • 削除された行はこの色です。
* スクリプト [#a5edfb45]
#contents
いつものように妄想という名の遊び。

* バイトコード [#k6da8bb7]
スクリプトを解析後,変換されるバイトコード。
命令長が多少長くなっても,1命令で処理される内容が多い方がよいだろう。
[[./言語仕様]]
[[./バイトコード]]
[[./オレ言語を作ってみたい人へ]]

* アセンブラ言語 [#fba2a405]
** オペランド [#t4cad9d2]
:num - 数値|
頭に何も付けず数値,この場合は10進数表記。
もしくは頭に表記接頭辞''f'',''b'',''d'',''h'',''x'',を付ける。
符号を付ける場合は,表記接頭辞より手前に書く。
#code(){{
// 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文字目に数値は使えない。
宣言するときはシンボル名の後に'':''。
参照するときは頭に@を付け,その後シンボル名。
#code(){{
VALUE_ONE:
    s32 1
#code(D,){{
//-----------------------------------------------------------
module Project.Util.Vector3;

func:
    copy4 bp[-4] @VALUE_ONE[0]
}}
//-----------------------------------------------------------
using Std.Math;

:bp - ベースポインタレジスタ|
スタック上のベースとなる位置。
#code(){{
func:
    copy4 bp[-4] 1
}}

:reg - 計算用レジスタ|
好きに使って良いテンポラリレジスタ。
reg[0]からreg[31]まで使える。
エイリアスもある。
r0 == reg[0] , r1 == reg[4] , ... r7 = reg[28]

:* - アドレス先の値を受け取る|
bp,もしくは@の前に*。
#code(){{
func:
    copy4 bp[-4] *bp[-8]
}}

:& - アドレス値を受け取る|
bp,もしくは@の前に&。
#code(){{
func:
    copy4 bp[-4] &bp
}}

:相対アドレスの指定|
bp,もしくは@の後ろに[数値]で指定。
省略したら[0]と等価。
** ニーモニック命令 [#uc3b37a5]
*** add - addition [#qe926862]
: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 [#decffc2e]

*** copy - single data copy [#e24d1a69]
:code|
copy1 dest src
copy2 dest src
copy4 dest src
copy8 dest src

:summary|
dest = src

*** dec - decremental [#c3d22c67]

*** div - division [#q8f62086]

*** enter - begin of function [#s4d19122]
:code|
enter push_stack_size

:summary|
push bp;  sp -= push_stack_size;

*** inc - incremental [#c31d1776]

*** jump - jump program address [#y641cfb3]

*** leave - end of function [#j3a9666b]
:code|
leave

:summary|
sp = bp; pop bp;

*** mcopy - multi data copy [#e24d1a69]
:code|
mcopy dest src length

:summary|
memcpy(dest,src,length);

*** mod - [#g5b972f0]

*** mul - multiply [#sbf078cf]

*** sub - substitute [#cafb3924]

** メモ [#n35db29d]
#code(){{

main:
    enter 4 # push bp , bp = sp , sp = bp-4

    leave # sp = bp , pop bp
}}


#code(c,){{

const int CONST_VALUE = 1;
const int* CONST_VALUE_ADDR = &CONST_VALUE;

struct Pos
//-----------------------------------------------------------
pod Vector3
{
  int x;
  int y;
public:
    float length()const
    {
        return Math.Sqrt( x*x + y*y + z*z );
    }

    float x;
    float y;
    float z;
};
const Pos CONST_OBJ_VALUE = {0,0};
const Pos* CONST_OBJ_VALUE_ADDR = &CONST_OBJ_VALUE;

void func()
{
  int stack_value; // -4(bp)
  int* stack_value_ptr: // -8(bp)

  int i; // -12(bp)
  i = 1; // 値 load i 1

  // シンボルを参照 
  // load bp[-12] @CONST_VALUE_ADDR[0]
  i = *CONST_VALUE_ADDR; 

  // シンボルを参照 
  // load bp[-12] @CONST_OBJ_VALUE_ADDR[4]
  i = CONST_OBJ_VALUE.y; 

  // ベースポインタの相対指定
  // load bp[-12] bp[-4]
  i = stack_value; 

  // ベースポインタの相対アドレス
  // load bp[-8] &bp[-4]
  stack_value_addr = &stack_value;

  // ベースポインタの相対指定をアドレスとみなし参照
  // load bp[-12] *bp[-8]
  i = *stack_value_ptr; 
} 
//-----------------------------------------------------------
// EOF
}}


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