Minimize size further and fix bug where . used stdin instead of stdout

This commit is contained in:
Juhani Krekelä 2021-05-12 17:36:43 +03:00
parent e6b09df3d7
commit 5fe5b58147
1 changed files with 46 additions and 38 deletions

View File

@ -46,49 +46,50 @@ _start:
mov rdi, rsp mov rdi, rsp
.copy_header: .copy_header:
mov rsi, $$ mov esi, $$
mov rcx, headers_length mov ecx, headers_length
rep movsb rep movsb
.copy_init: .copy_init:
mov rsi, init_code mov esi, init_code
mov rcx, init_code_length mov ecx, init_code_length
rep movsb rep movsb
mov rbp, rdi mov rbp, rdi
mainloop: mainloop:
; Read one byte ; Read one byte
mov rax, 0 xor eax, eax
mov rdi, 0 xor edi, edi
mov rsi, rbp mov rsi, rbp
mov rdx, 1 xor edx, edx
inc edx
syscall syscall
.was_eof: .was_eof:
test rax, rax test eax, eax
jz end jz end
mov al, [rbp] mov al, [rbp]
mov rcx, 8 mov ecx, 8
mov rbx, command_table mov ebx, command_table
xor rdx, rdx xor edx, edx
.table_find: .table_find:
mov dl, [rbx+1] mov dl, [ebx+1]
cmp al, [rbx] cmp al, [ebx]
je .table_found je .table_found
add dl, 2 add dl, 2
add rbx, rdx add ebx, edx
loop .table_find loop .table_find
xor rdx, rdx xor edx, edx
.table_found: .table_found:
lea rsi, [rbx + 2] lea esi, [ebx + 2]
mov rdi, rbp mov rdi, rbp
mov rcx, rdx mov ecx, edx
rep movsb rep movsb
mov rbp, rdi mov rbp, rdi
@ -96,9 +97,9 @@ mainloop:
end: end:
.copy_end_code: .copy_end_code:
mov rsi, end_code mov esi, end_code
mov rdi, rbp mov rdi, rbp
mov rcx, end_code_length mov ecx, end_code_length
rep movsb rep movsb
mov rbp, rdi mov rbp, rdi
@ -143,10 +144,10 @@ end:
stosd stosd
; Jumping backwards, we need to invert the displacement and then account for the size of the [ ; Jumping backwards, we need to invert the displacement and then account for the size of the [
neg rax neg eax
xor rbx, rbx xor ebx, ebx
mov byte bl, [while_length] mov byte bl, [while_length]
sub rax, rbx sub eax, ebx
; Store in our displacement field ; Store in our displacement field
mov rdi, rsi mov rdi, rsi
@ -159,24 +160,25 @@ end:
.fixup_done: .fixup_done:
xor rbx, rbx xor ebx, ebx
.output_loop: .output_loop:
mov rsi, rsp mov rsi, rsp
add rsi, rbx add rsi, rbx
cmp rsi, rbp cmp rsi, rbp
je .exit je .exit
mov rax, 1 xor eax, eax
mov rdi, 1 inc eax
mov rdx, 1 mov edi, eax
mov edx, eax
syscall syscall
inc rbx inc ebx
jmp .output_loop jmp .output_loop
.exit: .exit:
mov rax, 60 mov eax, 60
xor rdi, rdi xor edi, edi
syscall syscall
command_table: command_table:
@ -204,32 +206,38 @@ command_table:
times 3 db 0 times 3 db 0
getc: db ',', putc - $ - 2 getc: db ',', putc - $ - 2
mov byte [rbx], 0 mov byte [rbx], 0
mov rax, 0 xor eax, eax
mov rdi, 0 xor edi, edi
mov rsi, rbx mov rsi, rbx
mov rdx, 1 xor edx, edx
inc edx
syscall syscall
putc: db '.', ._end - $ - 2 putc: db '.', ._end - $ - 2
mov rax, 1 xor eax, eax
mov rdi, 0 inc eax
mov edi, eax
mov rsi, rbx mov rsi, rbx
mov rdx, 1 mov edx, eax
syscall syscall
._end: ._end:
init_code: init_code:
mov rcx, 0x10000 ; 64KiB of memory mov ecx, 0x10000 ; 64KiB of memory
; Clear out the memory
sub rsp, rcx sub rsp, rcx
mov rdi, rsp mov rdi, rsp
mov rbx, rdi
xor al, al xor al, al
rep stosb rep stosb
; Initialize tape head
mov rbx, rsp
init_code_length equ $ - init_code init_code_length equ $ - init_code
end_code: end_code:
mov rax, 60 mov rax, 60
xor rdi, rdi xor edi, edi
syscall syscall
end_code_length equ $ - end_code end_code_length equ $ - end_code