diff options
Diffstat (limited to 'liblang.asm')
-rw-r--r-- | liblang.asm | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/liblang.asm b/liblang.asm new file mode 100644 index 0000000..52a68cc --- /dev/null +++ b/liblang.asm @@ -0,0 +1,141 @@ +SYS_EXIT equ 0x2000001 ;code +SYS_FORK equ 0x2000002 ;-- +SYS_READ equ 0x2000003 ;fd, buf, len +SYS_WRITE equ 0x2000004 ;fd, buf, len +SYS_MMAP equ 0x20000C5 ;addr, len, prot, flags, fd, offset + +global start, putc, putint, getc, _builtin_malloc +default rel + +extern main + +section .text +start: + call main + mov rdi, rax + mov eax, SYS_EXIT + syscall + jmp $ + +putc: + push rax + push rdi + push rsi + push rdx + push rcx + push r11 + mov eax, SYS_WRITE + 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, SYS_WRITE + 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, SYS_READ + 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, SYS_MMAP + syscall + pop rcx + pop r11 + pop r10 + pop r9 + pop r8 + pop rdx + pop rsi + pop rdi + ret + + +section .data +db 0 ; for dyld |