MinCamlで出力したx86のアセンブリコードを実行するまでの手順
https://gyazo.com/3a7784e297493be7f2d5406590283e55
Intel Mac上でMinCamlが出力したx86のアセンブリコードを実行するまでの手順をまとめた。
事前準備
MacやWindowsのWSL環境だとビルドしたMinCamlが動かないため、以下を参考に my/min-caml のDockerイメージを用意しておく。
コンテナの中へ
は上記で作成したDockerコンテナの中に入る
code:sh
cd ~/src/min-caml
docker run -it --rm -v pwd:/root -w /root my/min-caml bash
MinCamlをビルド
MinCamlをビルドする。デフォルトではSparcのコードを出力するので、x86のコードを出力するようにして(./to_x86)からビルド(make)する
code:sh
./to_x86
make
サンプルコードをコンパイル
MinCamlコンパイラができたので、MinCamlで書かれたサンプルコードをコンパイルする
以下のようなサンプルコードを用意して、
code:4649.ml
(* sample code *)
let x = 4649 in
print_int x;
print_newline ()
サンプルコードをコンパイル
code:sh
./min-caml 4649
以下のアセンブリコードが出力される
code:4649.s
.data
.balign 8
.text
.globl min_caml_start
min_caml_start:
.globl _min_caml_start
_min_caml_start: # for cygwin
pushl %eax
pushl %ebx
pushl %ecx
pushl %edx
pushl %esi
pushl %edi
pushl %ebp
movl 32(%esp),%ebp
movl 36(%esp),%eax
movl %eax,min_caml_hp
movl $4649, %eax
call min_caml_print_int
call min_caml_print_newline
popl %ebp
popl %edi
popl %esi
popl %edx
popl %ecx
popl %ebx
popl %eax
ret
実行ファイルをビルド & 実行
出力されたアセンブリコードから実行ファイルをビルド
code:sh
gcc -m32 -g -O2 -Wall 4649.s libmincaml.S stub.c -lm -o 4649
ビルドされた実行ファイルを実行してみる。4649 が出力されれば成功。
code:sh
$ ./4649
sp = 0xff9a62c0, hp = 0xf78d2010
4649
$
【おまけ】PowerPCのアセンブリソースを出力する手順
コンテナに入ったあと、以下のコマンドでMinCamlをビルドする。テストをスキップするため make min-caml でビルドを行う必要がある(PowerPC環境じゃないとテストに失敗してしまう)
code:sh
./to_ppc
make min-caml
MinCamlをビルド後、サンプルプログラム(4649.ml)をコンパイルする
(サンプルプログラム)
code:4649.ml
(* sample code *)
let x = 4649 in
print_int x;
print_newline ()
(コンパイル)
code:sh
./min-caml 4649
(出力されたアセンブリコード)
code:4649.s
.text
.globl _min_caml_start
.align 2
_min_caml_start: # main entry point
mflr r0
stmw r30, -8(r1)
stw r0, 8(r1)
stwu r1, -96(r1)
# main program starts
li r2, 4649
mflr r31
stw r31, 4(r3)
addi r3, r3, 8
bl min_caml_print_int
subi r3, r3, 8
lwz r31, 4(r3)
mtlr r31
mflr r31
stw r31, 4(r3)
addi r3, r3, 8
bl min_caml_print_newline
subi r3, r3, 8
lwz r31, 4(r3)
mtlr r31
# main program ends
lwz r1, 0(r1)
lwz r0, 8(r1)
mtlr r0
lmw r30, -8(r1)
blr