From 5fe5b58147198747f5f33d9142b46f54f34cd3ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juhani=20Krekel=C3=A4?= Date: Wed, 12 May 2021 17:36:43 +0300 Subject: [PATCH] Minimize size further and fix bug where . used stdin instead of stdout --- minibfc.asm | 84 +++++++++++++++++++++++++++++------------------------ 1 file changed, 46 insertions(+), 38 deletions(-) diff --git a/minibfc.asm b/minibfc.asm index 9c3c400..f9c0d81 100644 --- a/minibfc.asm +++ b/minibfc.asm @@ -46,49 +46,50 @@ _start: mov rdi, rsp .copy_header: - mov rsi, $$ - mov rcx, headers_length + mov esi, $$ + mov ecx, headers_length rep movsb .copy_init: - mov rsi, init_code - mov rcx, init_code_length + mov esi, init_code + mov ecx, init_code_length rep movsb mov rbp, rdi mainloop: ; Read one byte - mov rax, 0 - mov rdi, 0 + xor eax, eax + xor edi, edi mov rsi, rbp - mov rdx, 1 + xor edx, edx + inc edx syscall .was_eof: - test rax, rax + test eax, eax jz end mov al, [rbp] - mov rcx, 8 - mov rbx, command_table - xor rdx, rdx + mov ecx, 8 + mov ebx, command_table + xor edx, edx .table_find: - mov dl, [rbx+1] - cmp al, [rbx] + mov dl, [ebx+1] + cmp al, [ebx] je .table_found add dl, 2 - add rbx, rdx + add ebx, edx loop .table_find - xor rdx, rdx + xor edx, edx .table_found: - lea rsi, [rbx + 2] + lea esi, [ebx + 2] mov rdi, rbp - mov rcx, rdx + mov ecx, edx rep movsb mov rbp, rdi @@ -96,9 +97,9 @@ mainloop: end: .copy_end_code: - mov rsi, end_code + mov esi, end_code mov rdi, rbp - mov rcx, end_code_length + mov ecx, end_code_length rep movsb mov rbp, rdi @@ -143,10 +144,10 @@ end: stosd ; Jumping backwards, we need to invert the displacement and then account for the size of the [ - neg rax - xor rbx, rbx + neg eax + xor ebx, ebx mov byte bl, [while_length] - sub rax, rbx + sub eax, ebx ; Store in our displacement field mov rdi, rsi @@ -159,24 +160,25 @@ end: .fixup_done: - xor rbx, rbx + xor ebx, ebx .output_loop: mov rsi, rsp add rsi, rbx cmp rsi, rbp je .exit - mov rax, 1 - mov rdi, 1 - mov rdx, 1 + xor eax, eax + inc eax + mov edi, eax + mov edx, eax syscall - inc rbx + inc ebx jmp .output_loop .exit: - mov rax, 60 - xor rdi, rdi + mov eax, 60 + xor edi, edi syscall command_table: @@ -204,32 +206,38 @@ command_table: times 3 db 0 getc: db ',', putc - $ - 2 mov byte [rbx], 0 - mov rax, 0 - mov rdi, 0 + xor eax, eax + xor edi, edi mov rsi, rbx - mov rdx, 1 + xor edx, edx + inc edx syscall putc: db '.', ._end - $ - 2 - mov rax, 1 - mov rdi, 0 + xor eax, eax + inc eax + mov edi, eax mov rsi, rbx - mov rdx, 1 + mov edx, eax syscall ._end: init_code: - mov rcx, 0x10000 ; 64KiB of memory + mov ecx, 0x10000 ; 64KiB of memory + + ; Clear out the memory sub rsp, rcx mov rdi, rsp - mov rbx, rdi xor al, al rep stosb + ; Initialize tape head + mov rbx, rsp + init_code_length equ $ - init_code end_code: mov rax, 60 - xor rdi, rdi + xor edi, edi syscall end_code_length equ $ - end_code