aboutsummaryrefslogtreecommitdiff
path: root/bfc.S
diff options
context:
space:
mode:
Diffstat (limited to 'bfc.S')
-rw-r--r--bfc.S58
1 files changed, 35 insertions, 23 deletions
diff --git a/bfc.S b/bfc.S
index 44ee7ec..7237ed4 100644
--- a/bfc.S
+++ b/bfc.S
@@ -1,8 +1,6 @@
-.global _start
-
-.data
+.section .constants, "a"
-v_elf_header:
+c_elf_header:
.byte 0x7f # Magic Number
.ascii "ELF" #
.byte 0x2 # 64-Bit
@@ -24,9 +22,11 @@ v_elf_header:
.hword 0x3 # TODO: Number Of Entries in Section Header Table
.hword 0x2 # TODO: Index of Section Header Table Entry containing section names
-v_usage_message:
+c_usage_message:
.asciz "bfc [input file] [output file]\n"
+.section .variables, "aw"
+
v_input_fd:
.int 0x0
@@ -42,33 +42,30 @@ v_buffer_end:
v_buffer_cursor:
.quad 0x0
+v_input_char:
+ .byte 0x0
-.text
+
+.section .code, "ax"
+.global _start
_start:
mov %rsp, %rbp
call f_check_args
call f_open_files
call f_init_buffer
- mov $v_buffer_cursor, %rbx
- mov (%rbx), %rsi
- add $0x300, %rsi
- mov %rsi, (%rbx)
- call f_check_buffer
-
- mov $v_buffer_cursor, %rsi
- mov (%rbx), %rsi
- add $0x300, %rsi
- mov %rsi, (%rbx)
- call f_check_buffer
-
- # ----
+l_read_loop:
+ call f_read_next_character
+ cmp $0, %rax
+ je l_read_loop_end
mov $1, %rax
- mov %rcx, %rdi
- mov $v_elf_header, %rsi
- mov $0x40, %rdx
+ mov $1, %rdi
+ mov $v_input_char, %rsi
+ mov $1, %rdx
syscall
+ jmp l_read_loop
+l_read_loop_end:
# ----
@@ -76,10 +73,12 @@ _start:
mov $0, %rdi
jmp f_exit
+
f_exit:
mov $60, %rax
syscall
+
f_check_args:
mov (%rbp), %rax
cmp $3, %rax
@@ -87,7 +86,7 @@ f_check_args:
mov $1, %rax
mov $2, %rdi
- mov $v_usage_message, %rsi
+ mov $c_usage_message, %rsi
mov $32, %rdx
syscall
@@ -97,6 +96,7 @@ f_check_args:
l_check_args_success:
ret
+
f_open_files:
mov $2, %rax
mov 16(%rbp), %rdi
@@ -115,6 +115,7 @@ f_open_files:
mov %eax, (%rbx)
ret
+
f_close_files:
mov $3, %rax
mov %rbx, %rsi
@@ -125,6 +126,7 @@ f_close_files:
syscall
ret
+
f_init_buffer:
mov $12, %rax
mov $0, %rdi
@@ -157,3 +159,13 @@ f_check_buffer:
call f_resize_buffer
l_check_buffer_large_enough:
ret
+
+
+f_read_next_character:
+ mov $0, %rax
+ mov $v_input_fd, %rbx
+ mov (%rbx), %rdi
+ mov $v_input_char, %rsi
+ mov $1, %rdx
+ syscall
+ ret