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)