diff options
Diffstat (limited to 'prologue.asm')
-rw-r--r-- | prologue.asm | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/prologue.asm b/prologue.asm new file mode 100644 index 0000000..74d9de3 --- /dev/null +++ b/prologue.asm @@ -0,0 +1,134 @@ +; SYS_EXIT equ 0x2000001 ;code +; SYS_FORK equ 0x2000002 ;-- +; SYS_READ equ 0x2000003 ;fd, buf, len +; SYS_WRITE equ 0x2000004 ;fd, buf, len + +global start +default rel + +section .text +start: + call main + mov rdi, rax + mov eax, 0x2000001 + syscall + jmp $ + +putc: + push rax + push rdi + push rsi + push rdx + push rcx + push r11 + mov eax, 0x2000004 + mov edi, 1 + lea rsi, [rsp+56] + mov edx, edi + syscall + pop r11 + pop rcx + pop rdx + pop rsi + pop rdi + pop rax + ret + +putint: + push rdi + push rsi + push rax + push rbx + push rcx + push rdx + push r11 + mov rax, [rsp+64] + mov ebx, 18 + test rax, rax + jz .numzero + + mov ecx, 10 + +.strlp: + xor edx, edx + div rcx + add dl, '0' + dec rbx + mov [rsp+rbx], dl + test rax, rax + jnz .strlp + jmp .strdone + +.numzero: + dec rbx + mov byte [rsp+rbx], '0' + jmp .strdone + +.strdone: + mov eax, 0x2000004 + mov edi, 1 + lea rsi, [rsp+rbx] + mov edx, 18 + sub rdx, rbx + syscall + + pop r11 + pop rdx + pop rcx + pop rbx + pop rax + pop rsi + pop rdi + ret + +getc: + push rdi + push rsi + push rdx + push rcx + push r11 + mov eax, 0x2000003 + xor edi, edi + mov rsi, rsp + mov edx, 1 + syscall + cmp rax, 1 + jne .fail + mov rax, [rsp] +.finish: + pop r11 + pop rcx + pop rdx + pop rsi + pop rdi + ret +.fail: + mov rax, -1 + jmp .finish + +_builtin_malloc: + push rdi + push rsi + push rdx + push r8 + push r9 + push r10 + push r11 + push rcx + xor edi, edi + mov rsi, [rsp+72] + mov edx, 0x03 + mov r10d, 0x1001 + mov r8d, -1 + xor r9d, r9d + mov eax, 0x20000C5 + syscall + pop rcx + pop r11 + pop r10 + pop r9 + pop r8 + pop rdx + pop rsi + pop rdi + ret |