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

* バイトコード [#k6da8bb7]
スクリプトを解析後,変換されるバイトコード。
命令長が多少長くなっても,1命令で処理される内容が多い方がよいだろう。

* アセンブラ言語 [#fba2a405]
** オペランド [#t4cad9d2]
:num - 数値|
*** num - 数値 [#ae8a2597]
頭に何も付けず数値,この場合は10進数表記。
もしくは頭に表記接頭辞''f'',''b'',''d'',''h'',''x'',を付ける。
符号を付ける場合は,表記接頭辞より手前に書く。
#code(){{
// 10進数表記
copy4 bp[-4] 12345
copy4 bp[-4] d12345
copy4 &bp[-4] 12345
copy4 &bp[-4] d12345
// 2進数表記
copy4 bp[-4] b0001
copy4 &bp[-4] b0001
// 8進数表記
copy4 bp[-4] h7543
copy4 &bp[-4] h7543
// 16進数表記
copy4 bp[-4] x0123ABCD
copy4 &bp[-4] x0123ABCD
// 浮動点小数
copy4 bp[-4] f1.23456
copy4 &bp[-4] f1.23456
}}

*** pointer value [#dbd08b25]
:@ - シンボル|
シンボル名に使っていい文字列は[a-zA-Z0-9_]。ただし1文字目に数値は使えない。
宣言するときはシンボル名の後に'':''。
参照するときは頭に@を付け,その後シンボル名。
#code(){{
VALUE_ONE:
    s32 1

func:
    copy4 bp[-4] @VALUE_ONE[0]
    copy4 &bp[-4] @VALUE_ONE[0]
}}

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

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

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

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

:相対アドレスの指定|
bp,もしくは@の後ろに[数値]で指定。
後ろに[数値]で指定。
省略したら[0]と等価。

:example|
#code(){{
# addr is 0x100
CONST_VALUE:
  s32 10
  s32 20
  u32 0x100
  u32 0x110

#addr is 0x110
MUTABLE_VALUE:
  s32 0
  s32 0

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

}}
** ニーモニック命令 [#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
addi1 addr val
addi2 addr val
addi4 addr val
addi8 addr val
addf4 addr val
addf8 addr val

:summary|
dest += val
:c summary|
 *addr += val
*** cmp  - compare [#cc7b57c2]
: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.)

*** call - function call [#decffc2e]

: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 [#e24d1a69]
:code|
copy1 dest src
copy2 dest src
copy4 dest src
copy8 dest src
copy1 addr val
copy2 addr val
copy4 addr val
copy8 addr val

:summary|
dest = src

 *addr = val
*** 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]

: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 [#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
{
  int x;
  int y;
};
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; 
} 
}}


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