Minimize size further and fix bug where . used stdin instead of stdout
This commit is contained in:
parent
e6b09df3d7
commit
5fe5b58147
84
minibfc.asm
84
minibfc.asm
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue