LoginSignup
1
0

More than 1 year has passed since last update.

paiza.ioでelixir その146

Last updated at Posted at 2022-12-15

概要

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

以上。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0