JavaScript で x86 アセンブラ (32 bit) を書いてみた

4/22追記: Mach-O builder も実装したので Intel Mac でも遊べる。

JQuery っぽい文法で、ブックマークレットとして簡単に遊べるアセンブラが欲しいと思って勢いで書いてみた (デモ)。とりあえず以下のサンプルが動くくらいにしか実装してない。

var buf = new Buffer();
with (new Assembler(buf)) {
    call($('get_addr'));
$$('get_addr');    
    pop(ecx);

    add($('str - get_addr'), ecx);
    mov($('sizeof(str)'), edx);
    xor(ebx, ebx);
    mov(4, eax); // write(2)
    int(0x80);

    mov(1, eax);
    int(0x80); // _exit(2)

$$('str');
    $string('Hello, world!\x0a');
$end();
}

location.href = 'data:application/octet-stream,' + escape(buildELF(buf));

ああ、気持ち悪い…。

今回のは ELF バイナリを吐くバージョンなんだけど、ELF のセクションを適当に作っているので Linux じゃないと動かないかも。

追記: etaConvert() の eta は「η」です。