概要
paiza.ioでelixirやってみた。
練習問題やってみた。
構想編
練習問題
俺cpuのアセンブラから、x64アセンブラを生成せよ。
下のコードから、下の下のコードを生成せよ。
push 1
set a
push 1
set b
label30:
get a
get b
*
set c
get c
push 10
/
push 48
+
out
get c
push 10
%
push 48
+
out
push 32
out
push ','
out
push 32
out
get a
push 1
+
set a
get a
push 10
<
jz label30
push 10
out
get b
push 1
+
set b
push 1
set a
get b
push 10
<
jz label30
bye:
bye
mov $1, %r11
mov %r11, %r13
mov $1, %r11
mov %r11, %r14
label30:
mov %r13, %r11
mov %r14, %r12
mov %r11, %rax
mul %r12
mov %rax, %r11
mov %r11, %r15
mov %r15, %r11
mov $10, %r12
mov %r11, %rax
div %r12
mov %rax, %r11
mov $48, %r12
mov %r11, %rax
add %r12
mov %rax, %r11
lea msg(%rip), %rdi
mov %r11, %rax;
mov %rax, (%rdi)
mov $1, %rax;
mov $1, %rdi;
mov $msg, %rsi;
mov $1, %rdx;
syscall;
bye:
mov $60, %rax;
syscall;
方針
- ソースは、\nと" "でsplitする。
- ステートメントで、関数に飛ぶ
- データ構造
%{u:""}
俺cpu ニーモニック
俺cpuは、スタックマシーンです。
ニーモニック | 意味 | stackの状態 | code |
---|---|---|---|
% | stack-1,stackの剰余を求める。 | 1個減る | f004 |
+ | stack-1,stackの加算を求める。 | 1個減る | f000 |
/ | stack-1,stackの除算を求める。 | 1個減る | f005 |
* | stack-1,stackの乗算を求める。 | 1個減る | f002 |
- | stack-1,stackの減算を求める。 | 1個減る | f001 |
= | stack-1,stackの等しいを求める。 | 1個減る | f00a |
< | stack-1,stackの大小を求める。 | 1個減る | f00e |
push 13 | stackに整数13を積む。 | 1個増える | 1001 |
set a | 変数aにstackを入れる。 | 1個減る | 300i |
get a | stackに、変数aの値を入れる。 | 1個増える | 200i |
out | stackを文字で印字する。 | 1個減る | e000 |
jz label | stackが真ならlabelへ飛ぶ。 | 1個減る | 500i |
jp label | 無条件でlabelへ飛ぶ。 | 変化無し | 400i |
end | 停止 | 変化無し | 0000 |
以上。