code = [] code.append('format elf64 executable 3') code.append('entry start') code.append('read:') code.append('xor rax, rax') code.append('xor rdi, rdi') code.append('mov rsi, int_buffer') code.append('mov rdx, 20') code.append('syscall') code.append('xor rcx, rcx') code.append('mov cl, [int_buffer + rax - 1]') code.append('cmp rcx, 10') code.append('jne newlineskip') code.append('dec rax') code.append('newlineskip:') code.append('mov rsi, rax') code.append('xor rax, rax') code.append('cmp rsi, 0') code.append('je skipread') code.append('xor rcx, rcx') code.append('mov rdi, 10') code.append('keepreading:') code.append('mul rdi') code.append('mov dl, [int_buffer + rcx]') code.append('sub rdx, 48') code.append('add rax, rdx') code.append('inc rcx') code.append('cmp rcx, rsi') code.append('jl keepreading') code.append('skipread:') code.append('ret') 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 rbx, [rsp - 8]') code.append('ret') code.append('start:') loop_stack = [] loop_index = -1 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 rdi') code.append('pop rax') code.append('sub rax, rdi') code.append('push rax') elif word == '++': code.append('pop rax') code.append('inc rax') code.append('push rax') elif word == '--': code.append('pop rax') code.append('dec rax') code.append('push rax') elif word == '*': code.append('pop rax') code.append('pop rdi') code.append('imul 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_number': code.append('call print') code.append('pop rax') elif word == 'read_number': code.append('call read') code.append('push rax') elif word == 'newline': 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') elif word == '[': loop_index += 1 loop_stack.append(loop_index) code.append('l' + str(loop_index) + ':') code.append('cmp DWORD [rsp], 0') code.append('je e' + str(loop_index)) elif word == ']': loop_end = loop_stack.pop() code.append('jmp l' + str(loop_end)) code.append('e' + str(loop_end) + ':') code.append('pop rax') 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)