アセンブラ内インタプリタ
アセンブラを高機能化すると、アセンブラ内にインタプリタが欲しくなる
アセンブラ内で計算式を処理するため
char *p = "012"+1;において、pに定数を初期値として与えたい
コンパイル時点で文字列のアドレスは不明なので、単一の値としてのアドレス値を算出することはできない
STR_LABEL + 1のように、文字列の先頭アドレスをラベルとして残さざるを得ない
インタプリタの計算例
MOV rax, LABEL + DEF_VALUE*3とか
中置記法で式を書けるようにする案
アセンブラの中にコンパイラの様な構文解析器を搭載する必要が出てくる
嫌
アセンブリコードを手書きする時代であれば分かりやすく書けた方が良いだろうが、コンパイラが出すアセンブリコードだけをアセンブルすれば良いのであれば、アセンブラが解釈しやすい文法になっていて良いはず
アセンブラ疑似命令で数式を指定する案
ドット「.」始まりのものが疑似命令とする
アセンブラ内インタプリタはスタックマシン構造とする
code:アセンブラ内インタプリタを使って計算する例
.PUSH LABEL
.PUSH DEF_VALUE
.PUSH 3
.MUL
.ADD
MOV rax, $STACK_TOP
.POP
$STACK_TOPは、その時点でのインタプリタ内スタックトップの値
モチベーション:ラベル値を使った定数値計算
char *p = "012"+1;において、pに定数を初期値として与えたい
アセンブラでPUSH STR0 + 1みたいなことをやりたい
中置記法を書けるようにしてしまうと、アセンブラ内に再帰下降型構文解析を載せる必要が出てくる
それは嫌だ
アセンブラ内計算機