diff options
Diffstat (limited to 'main.py')
-rw-r--r-- | main.py | 90 |
1 files changed, 90 insertions, 0 deletions
@@ -0,0 +1,90 @@ +parameter_registers = ['rdi', 'rsi', 'rdx', 'rcx', 'r8', 'r9'] +return_registers = ['rax', 'rdx'] + +syscall_registers = ['rdi', 'rsi', 'rdx', 'r10', 'r8', 'r9'] +static_chain_pointer = 'r10' + +fparameter_registers = ['xmm0', 'xmm1', 'xmm2', 'xmm3', 'xmm4', 'xmm5', 'xmm6', 'xmm7'] +freturn_registers = ['xmm0', 'xmm1'] + +callee_must_clean = ['rbx', 'rsp', 'rbp', 'r12', 'r13', 'r14', 'r15'] + +code = [] + +code.append('format elf64 executable 3') +code.append('entry start') +code.append('print:') +code.append('mov [rsp - 8], rbx') +code.append('mov rax, [rsp + 8]') +code.append('mov rdi, 10') +code.append('xor rcx, rcx') +code.append('print_loop0:') +code.append('mov [int_buffer + rcx], 48') +code.append('inc rcx') +code.append('cmp rcx, 20') +code.append('jl print_loop0') +code.append('xor rbx, rbx') +code.append('xor rdx, rdx') +code.append('print_loop1:') +code.append('div rdi') +code.append('dec rcx') +code.append('inc rbx') +code.append('add [int_buffer + rcx], dl') +code.append('xor rdx, rdx') +code.append('cmp rax, 0') +code.append('jg print_loop1') +code.append('mov rax, 1') +code.append('mov rdi, 1') +code.append('lea rsi, [int_buffer + rcx]') +code.append('mov rdx, rbx') +code.append('syscall') +code.append('mov [int_buffer], 10') +code.append('mov rax, 1') +code.append('mov rdi, 1') +code.append('mov rsi, int_buffer') +code.append('mov rdx, 1') +code.append('syscall') +code.append('mov rbx, [rsp - 8]') +code.append('ret') + +code.append('start:') +with open('input.stk', 'r') as f: + text = f.read() + words = text.replace('\n', ' ').strip().split(' ') + for word in words: + if word.isdecimal(): + code.append('push ' + word) + elif word == '+': + code.append('pop rax') + code.append('pop rdi') + code.append('add rax, rdi') + code.append('push rax') + elif word == '-': + code.append('pop rax') + code.append('pop rdi') + code.append('sub rax, rdi') + code.append('push rax') + elif word == '*': + code.append('pop rax') + code.append('pop rdi') + code.append('mul rdi') + code.append('push rax') + elif word == 'pop': + code.append('pop rax') + elif word == 'dup': + code.append('pop rax') + code.append('push rax') + code.append('push rax') + elif word == 'print': + code.append('call print') + else: + print('Unknown word:', word) + +code.append('mov rax, 60') +code.append('mov rdi, 0') +code.append('syscall') +code.append('segment writable') +code.append('int_buffer rb 20') + +for line in code: + print(line) |