diff options
author | tomsmeding <tom.smeding@gmail.com> | 2017-08-28 14:34:24 +0200 |
---|---|---|
committer | tomsmeding <tom.smeding@gmail.com> | 2017-08-28 14:34:24 +0200 |
commit | 3d5d85e00f2a81efb62bb17f8e5db63fe5a49a61 (patch) | |
tree | f93a1fa02b4b2cefbc5ca46a6f2fa227b07e7ecd /liblang.asm | |
parent | c129641b18156b463cd12318ba956c85a9017e39 (diff) |
Optimisations (and array shift)
Array points at data, not size
stack alignment
cross-platform liblang
fast strlen
Diffstat (limited to 'liblang.asm')
-rw-r--r-- | liblang.asm | 154 |
1 files changed, 143 insertions, 11 deletions
diff --git a/liblang.asm b/liblang.asm index 3ae345d..9cd905c 100644 --- a/liblang.asm +++ b/liblang.asm @@ -1,16 +1,77 @@ -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 +; TAKEN FROM https://github.com/davidad/asm_concurrency/blob/master/os_dependent_stuff.asm +; syscalls +%ifidn __OUTPUT_FORMAT__,elf64 +; http://lxr.linux.no/linux+v3.13.5/arch/x86/syscalls/syscall_64.tbl + %define SYS_READ 0 + %define SYS_OPEN 2 + %define SYS_WRITE 1 + %define SYS_MMAP 9 + %define SYS_FTRUNCATE 77 + %define SYS_PWRITE 18 + %define SYS_FORK 57 + %define SYS_WAITID 247 + %define SYS_EXIT 60 +%elifidn __OUTPUT_FORMAT__,macho64 +; http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/kern/syscalls.master + %define SYS_READ 0x2000003 + %define SYS_OPEN 0x2000005 + %define SYS_WRITE 0x2000004 + %define SYS_MMAP 0x20000C5 + %define SYS_FTRUNCATE 0x20000C9 + %define SYS_PWRITE 0x200009A + %define SYS_FORK 0x2000002 + %define SYS_WAITID 0x20000AD + %define SYS_EXIT 0x2000001 +%endif -global start, putc, putint, getc, exit, _builtin_malloc, _builtin_outofbounds +; mmap() and mprotect() flags +%ifidn __OUTPUT_FORMAT__,elf64 +; http://lxr.linux.no/linux+v3.13.5/include/uapi/asm-generic/mman-common.h + %define MAP_SHARED 0x01 + %define MAP_PRIVATE 0x02 + %define MAP_FIXED 0x10 + %define MAP_ANON 0x20 + %define PROT_NONE 0x0 + %define PROT_READ 0x1 + %define PROT_WRITE 0x2 + %define PROT_EXEC 0x4 + %define PROT_SEM 0x8 + %define PROT_GROWSDOWN 0x01000000 + %define PROT_GROWSUP 0x02000000 +%elifidn __OUTPUT_FORMAT__,macho64 +; http://www.opensource.apple.com/source/xnu/xnu-2050.18.24/bsd/sys/mman.h + %define MAP_SHARED 0x001 + %define MAP_PRIVATE 0x002 + %define MAP_FIXED 0x010 + %define MAP_RENAME 0x020 + %define MAP_NORESERVE 0x040 + %define MAP_INHERIT 0x080 + %define MAP_NOEXTEND 0x100 + %define MAP_SEMAPHORE 0x200 + %define MAP_NOCACHE 0x400 + %define MAP_JIT 0x800 + %define MAP_FILE 0x0000 + %define MAP_ANON 0x1000 + %define PROT_NONE 0x0 + %define PROT_READ 0x1 + %define PROT_WRITE 0x2 + %define PROT_EXEC 0x4 +%endif + +%define STDIN_FILENO 0 +%define STDOUT_FILENO 1 +%define STDERR_FILENO 2 + + +global start, _start, putc, putint, getc, exit, _builtin_malloc, _builtin_outofbounds default rel extern main section .text start: +_start: + and rsp, -16 ; make stack 16-byte aligned call main mov rdi, rax mov eax, SYS_EXIT @@ -25,7 +86,7 @@ putc: push rcx push r11 mov eax, SYS_WRITE - mov edi, 1 + mov edi, STDOUT_FILENO lea rsi, [rsp+56] mov edx, edi syscall @@ -91,7 +152,7 @@ getc: push rcx push r11 mov eax, SYS_READ - xor edi, edi + mov edi, STDIN_FILENO mov rsi, rsp mov edx, 1 syscall @@ -115,6 +176,73 @@ exit: syscall jmp $ +strlen: + push rbx + push rcx + push rdx + push rdi + push rsi + mov rsi, [rsp+8] ; string data pointer + mov rcx, [rsi-8] ; array size + xor edx, edx ; string walker + cmp rcx, 16 + jb .short + + movdqa [rsp], xmm1 + movdqa [rsp-16], xmm2 + + mov rax, rcx ; now array size + lea rbx, [rax-16] + pxor xmm2, xmm2 +.lp: + movdqu xmm1, [rsi+rdx] + pcmpistri xmm1, xmm2, 0x08 + js .nullfound + add rdx, 16 + cmp rdx, rbx + jbe .lp + + movdqa xmm2, [rsp-16] + movdqa xmm1, [rsp] + + cmp rdx, rax + je .nonull + + mov rcx, rax + sub rcx, rdx + +.short: + mov al, [rsi+rdx] + inc rdx + test al, al + loopnz .short + jnz .nonull + lea rax, [rdx-1] + pop rsi + pop rdi + pop rdx + pop rcx + pop rbx + ret + +.nullfound: + add rdx, rcx + mov rax, rdx + pop rsi + pop rdi + pop rdx + pop rcx + pop rbx + ret + +.nonull: + mov edi, STDERR_FILENO + lea rsi, [nonull_msg] + mov edx, nonull_msg.len + mov eax, SYS_WRITE + syscall + jmp exit255 + _builtin_malloc: push rdi push rsi @@ -126,12 +254,13 @@ _builtin_malloc: push rcx xor edi, edi mov rsi, [rsp+72] - mov edx, 0x03 - mov r10d, 0x1001 + mov edx, PROT_READ | PROT_WRITE + mov r10d, MAP_ANON | MAP_PRIVATE mov r8d, -1 xor r9d, r9d mov eax, SYS_MMAP syscall + add rax, 8 pop rcx pop r11 pop r10 @@ -143,11 +272,12 @@ _builtin_malloc: ret _builtin_outofbounds: - mov edi, 2 + mov edi, STDERR_FILENO lea rsi, [outofbounds_msg] mov rdx, outofbounds_msg.len mov eax, SYS_WRITE syscall +exit255: mov edi, 255 mov eax, SYS_EXIT syscall @@ -157,3 +287,5 @@ _builtin_outofbounds: section .data outofbounds_msg: db "Runtime Error: Out-of-bounds array access detected", 10 .len: equ $ - outofbounds_msg +nonull_msg: db "Runtime Error: No null byte found in string", 10 +.len: equ $ - nonull_msg |