非専門的シンギュラリティー研究所

無限に動き続けるシステムを表す方法を AI なども使って考えていきます。

アセンブラ(19)

倍精度浮動小数点数加減乗除コンパイルした結果が実行できるようになりました。

実行例(倍精度浮動小数点数の加算)

double dadd(double x, double y) {
	return x + y;
}

これをコンパイルすると以下のようなアセンブリ言語のコードが得られます。

_Z4dadddd:
	move.l 16(%sp),-(%sp)
	move.l 16(%sp),-(%sp)
	move.l 16(%sp),-(%sp)
	move.l 16(%sp),-(%sp)
	jsr __adddf3
	lea (16,%sp),%sp
	rts

これは __adddf3 のサブルーチンがないのでこのままでは実行できません。以下のような疑似関数を使えるようにします。

「*call_dadd」は「jsr __adddf3」の代わりに使えるものです。これを使うと以下のようになります。

_Z4dadddd:
	move.l 16(%sp),-(%sp)
	move.l 16(%sp),-(%sp)
	move.l 16(%sp),-(%sp)
	move.l 16(%sp),-(%sp)
	*call_dadd
	lea (16,%sp),%sp
	rts

「*dadd」はサブルーチンの本体の代わりに使えるものです。これを使うと以下のようになります。

_Z4dadddd:
	move.l 16(%sp),-(%sp)
	move.l 16(%sp),-(%sp)
	move.l 16(%sp),-(%sp)
	move.l 16(%sp),-(%sp)
	jsr __adddf3
	lea (16,%sp),%sp
	rts
__adddf3:
	*dadd
	rts

コマンドの追加

結果を表示するため以下のコマンドを追加します。

疑似関数

  • *lmulu, *lmuls, *call_lmulu, *call_lmuls
    • 乗算の関数の代わりに使う
    • 「u」が付くものは符号なし、「s」が付くものは符号あり
    • 「call_」が付くものは関数呼び出しの代わりに使う
  • *ldivu, *ldivs, *call_ldivu, *call_ldivs
    • 除算の関数の代わりに使う
    • 「u」が付くものは符号なし、「s」が付くものは符号あり
    • 「call_」が付くものは関数呼び出しの代わりに使う
  • *dadd, *call_dadd
    • 浮動小数点数の加算の関数の代わりに使う
    • 「call_」が付くものは関数呼び出しの代わりに使う
  • *dsub, *call_dsub
    • 浮動小数点数の減算の関数の代わりに使う
    • 「call_」が付くものは関数呼び出しの代わりに使う
  • *dmul, *call_dmul
    • 浮動小数点数の乗算の関数の代わりに使う
    • 「call_」が付くものは関数呼び出しの代わりに使う
  • *ddiv, *call_ddiv
    • 浮動小数点数の除算の関数の代わりに使う
    • 「call_」が付くものは関数呼び出しの代わりに使う
  • *dsin, *call_dsin
    • sin 関数の代わりに使う
    • 「call_」が付くものは関数呼び出しの代わりに使う
  • *dcos, *call_dcos
    • cos 関数の代わりに使う
    • 「call_」が付くものは関数呼び出しの代わりに使う
  • *dsqrt, *call_dsqrt
    • sqrt 関数の代わりに使う
    • 「call_」が付くものは関数呼び出しの代わりに使う
  • *itod, *call_itod
    • 整数から浮動小数点数への変換関数の代わりに使う
    • 「call_」が付くものは関数呼び出しの代わりに使う