swfはスタックマシン その2

#概要
swfスタックマシンのアセンブラの処理系を作った。仕様は、俺々。
#ニーモニック
```
push "x"    スタックに"x"を積む
add         スタックの二番目と一番目を文字列連結
+           スタックの二番目と一番目を足す
-           スタックの二番目から一番目を引く
/           スタックの二番目を一番目で割る
*           スタックの二番目と一番目を掛ける
set         スタックの二番目を変数として、一番目の値をセット
get         スタックの一番目を変数として、その値をセット
++          スタックの一番目をインクリメント
<           スタックの二番目を一番目で比較
>           スタックの二番目を一番目で比較
!           スタックの一番目を反転
if  skip    スタックの一番目が真ならskipに飛ぶ
jp loop     loopに飛ぶ
int         スタックの一番目を整数化
end         停止
```
#サンプルコード
```
function run() {
	var c1, c2, c3, a, i, j;
	var pc = 0;
    var la = new Array(10);
	var r = new Array(200);
    var src = document.getElementById('src0').value;
	var m = src.split("\n");
	for (j = 0; j < m.length ; j++)
	{
        var cm = m[j].split("  ");
		if (cm[0] != "")
        {
            la[cm[0]] = pc + 2;
        }
		switch (cm[1])
		{
		case "if":
			r[pc] = 0x9D;
			pc++;
			r[pc] = 0x02;
			pc++;
			r[pc] = 0x00;
			pc++;
			if (la[cm[2]] > 1)
			{
				c3 = 255 + la[cm[2]] - pc - 3;
				r[pc] = c3;
				pc++;
				r[pc] = 0xFF;
				pc++;
			}
			else
			{
				r[pc] = cm[2];
				pc++;
				r[pc] = 0x00;
				pc++;
			}
		break;
		case "jp":
			r[pc] = 0x99;
			pc++;
			r[pc] = 0x02;
			pc++;
			r[pc] = 0x00;
			pc++;
			if (la[cm[2]] > 1)
			{
				c3 = 255 + la[cm[2]] - pc - 3;
				r[pc] = c3;
				pc++;
				r[pc] = 0xFF;
				pc++;
			}
			else
			{
				r[pc] = cm[2];
				pc++;
				r[pc] = 0x00;
				pc++;
			}
		break;
		case "push":
			r[pc] = 0x96;
			pc++;
	    	c1 = cm[2].indexOf("\"") + 1;
			c2 = cm[2].indexOf("\"", 1) - c1;
			a = cm[2].substr(c1, c2);
			c3 = c2 + 2;
			r[pc] = c3;
			pc++;
			r[pc] = 0x00;
			pc++;
			r[pc] = 0x00;
			pc++;
			for (i = 0; i < c2; i++)
		    {
				r[pc] = a.charCodeAt(i);
				pc++;
			}
			r[pc] = 0x00;
			pc++;
		break;
		case "end":
			r[pc] = 0x00;
			pc++;
		break;
		case "+":
			r[pc] = 0x0A;
			pc++;
		break;
		case "-":
			r[pc] = 0x0B;
			pc++;
		break;
		case "*":
			r[pc] = 0x0C;
			pc++;
		break;
		case "/":
			r[pc] = 0x0D;
			pc++;
		break;
		case "=":
			r[pc] = 0x0E;
			pc++;
		break;
		case ">":
			r[pc] = 0x0F;
			pc++;
		break;
		case "&":
			r[pc] = 0x10;
			pc++;
		break;
		case "|":
			r[pc] = 0x11;
			pc++;
		break;
		case "!":
			r[pc] = 0x12;
			pc++;
		break;
		case "eq":
			r[pc] = 0x13;
			pc++;
		break;
		case "len":
			r[pc] = 0x14;
			pc++;
		break;
		case "pop":
			r[pc] = 0x17;
			pc++;
		break;
		case "int":
			r[pc] = 0x18;
			pc++;
		break;
		case "get":
			r[pc] = 0x1C;
			pc++;
		break;
        case "++":
			r[pc] = 0x50;
			pc++;
		break;
		case "dp":
			r[pc] = 0x4C;
			pc++;
		break;        
		case "set":
			r[pc] = 0x1D;
			pc++;
		break;
		case "add":
			r[pc] = 0x21;
			pc++;
		break;
		case "rnd":
			r[pc] = 0x30;
			pc++;
		break;
		case "time":
			r[pc] = 0x34;
			pc++;
		break;
		}
	}		
    for (var a in la) 
	{

        for (i = 0; i < pc; i++)
		{
			if (r[i] == a)
			{

                c3 = la[a] - i - 4;
				r[i] = c3;
			}
		}
	}
	for (i = 0; i < pc; i++)
	{
	    swf21[i + 31] = r[i];
	}
        var b = _arrayBufferToBase64(swf21);
    var h = '<embed src ="';
    var l = '" type="application/x-shockwave-flash" width="100" height="100"></embed>';
    var swf = h + tob(b) + l;
    var out = document.getElementById('out');
    out.innerHTML = swf;
}
```
#アセンブラコード
1から100まで表示。
```
  push  "x"
  push  ""
  set  
  push  "i"
  push  "0"
  set
loop  push  "i"
  push  "i"
  get
  ++
  set
  get
  push  "x"
  push  "x"
  get
  push  "i"
  get
  add
  set
  push  "x"
  push  "x"
  get
  push  " "
  add
  set  
  push  "i"
  get
  push  "100"
  ">
  !
  if  skip
  jp  loop
skip  end
```