|
|
@@ -0,0 +1,77 @@
|
|
|
+format ELF64
|
|
|
+
|
|
|
+include './syscalls.inc'
|
|
|
+include './types.inc'
|
|
|
+include './utils.inc'
|
|
|
+
|
|
|
+section ".text" executable
|
|
|
+
|
|
|
+;; rdi -> const char *filename
|
|
|
+;; rsi -> RET size_t *size
|
|
|
+;; rax <- char *buf
|
|
|
+;; rdx <- file_err err
|
|
|
+;file_read_all:
|
|
|
+; sys_open path, O_RDONLY, 0
|
|
|
+; if_lt_jmp rax, -1, fail_open
|
|
|
+; mov [fd], rax
|
|
|
+; ret
|
|
|
+;_file_read_all_fail_open:
|
|
|
+
|
|
|
+;; rdi -> const char *cstr1
|
|
|
+;; rsi -> size_t cstr1_size
|
|
|
+;; rdx -> const char *cstr2
|
|
|
+;; rcx -> size_t cstr2_size
|
|
|
+;; rax <- char *cstr
|
|
|
+;; rdx <- size_t cstr_size
|
|
|
+;str_concat:
|
|
|
+; cmp cstr2_size, 0
|
|
|
+; je _str_concat_empty
|
|
|
+; ret
|
|
|
+;_str_concat_empty:
|
|
|
+; mov rax, rdi
|
|
|
+; ret
|
|
|
+
|
|
|
+extrn alloc
|
|
|
+
|
|
|
+public _start
|
|
|
+_start:
|
|
|
+ pp aerr err
|
|
|
+ pp _ptr ptr
|
|
|
+ mov [_ptr.cap], 10
|
|
|
+ mov rdi, [_ptr.cap]
|
|
|
+ call alloc
|
|
|
+ mov [_ptr], rax
|
|
|
+ mov r10, [rdx]
|
|
|
+ mov [aerr.code], r10
|
|
|
+ add rdx, 8
|
|
|
+ mov r10, [rdx]
|
|
|
+ mov [aerr.name], r10
|
|
|
+ add rdx, 8
|
|
|
+ mov r10, [rdx]
|
|
|
+ mov [aerr.name.size], r10
|
|
|
+ sys_write 1, [aerr.name], [aerr.name.size]
|
|
|
+ pp new_line db 10
|
|
|
+ sys_write 1, new_line, new_line.size
|
|
|
+ sys_munmap [_ptr], [_ptr.cap]
|
|
|
+ sys_exit [aerr.code]
|
|
|
+
|
|
|
+fail_open:
|
|
|
+ pp fail_open_msg db "Failed to open file", 10
|
|
|
+ sys_write 2, fail_open_msg, fail_open_msg.size
|
|
|
+ sys_exit 1
|
|
|
+
|
|
|
+fail_read:
|
|
|
+ pp fail_read_msg db "Failed to read file", 10
|
|
|
+ sys_write 2, fail_read_msg, fail_read_msg.size
|
|
|
+ sys_exit 1
|
|
|
+
|
|
|
+fail_write:
|
|
|
+ pp fail_write_msg db "Failed to write file", 10
|
|
|
+ sys_write 2, fail_write_msg, fail_write_msg.size
|
|
|
+ sys_exit 1
|
|
|
+
|
|
|
+section ".bss" writeable
|
|
|
+
|
|
|
+path db "./Makefile", 0
|
|
|
+fd rq 1
|
|
|
+msg db "Hello World", 10
|