Files
klibc/core.asm

144 lines
2.3 KiB
NASM

extern NR_exit
extern strclr
section .text
global min
global minu
global max
global maxu
global islower
global isupper
global tolower
global toupper
global itoa
global exit
;----- min(int a, int b) -----;
; return value: lowest value
min:
mov rax, rdi
cmp rdi, rsi
cmovg rax, rsi
ret
;----- minu(unsigned int a, unsigned int b) -----;
; return value: lowest value
minu:
mov rax, rdi
cmp rdi, rsi
cmova rax, rsi
ret
;----- max(int a, int b) -----;
; return value: highest value
max:
mov rax, rdi
cmp rdi, rsi
cmovl rax, rsi
ret
;----- maxu(unsigned int a, unsigned int b) -----;
; return value: highest value
maxu:
mov rax, rdi
cmp rdi, rsi
cmovb rax, rsi
ret
;----- islower(char* c) -----;
; return value: 1 (character is in range of 'a'-'z') or 0 (character is nog in range of 'a'-'z')
islower:
xor rax, rax
cmp byte [rdi], 'a'
jb .quit
cmp byte [rdi], 'z'
ja .quit
mov rax, 1
.quit:
ret
;----- isupper(char* c) -----;
; return value: 1 (character is in range of 'A'-'Z') or 0 (character is not in range of 'A'-'Z')
isupper:
xor rax, rax
cmp byte [rdi], 'A'
jb .quit
cmp byte [rdi], 'Z'
ja .quit
mov rax, 1
.quit:
ret
;----- tolower(char* c) -----;
; return value: ASCII value. Same as original if it was not an uppercase letter, otherwise lowercase letter
tolower:
call isupper
mov rcx, rax
mov al, byte [rdi]
cmp rcx, 1
jne .quit
add al, 32
.quit:
ret
;----- toupper(char* c) -----;
; return value: ASCII value. Same as original if it was not a lowercase letter, otherwise uppercase letter
toupper:
call islower
mov rcx, rax
mov al, byte [rdi]
cmp rcx, 1
jne .quit
sub al, 32
.quit:
ret
;----- itoa(int num, char* str) -----;
; return value: pointer to str
itoa:
push rbx
push rsi
push rdi
mov rdi, rsi
call strclr
pop rdi
mov rax, rdi
mov r8, rsi
xor rcx, rcx
test rax, rax
jnz .checkNeg
mov byte [rsi], '0'
mov byte [rsi+1], 0
jmp .quit
.checkNeg:
xor rbx, rbx
test rax, rax
jns .convert
neg rax
mov rbx, 1
.convert:
xor rdx, rdx
mov r10, 10
div r10
add rdx, '0'
push rdx
inc rcx
test rax, rax
jnz .convert
test rbx, rbx
jz .toString
push byte '-'
inc rcx
.toString:
pop rdx
mov byte [rsi], dl
inc rsi
loop .toString
mov byte [rsi], 0
.quit:
pop rax
pop rbx
ret
;----- exit(int exit_code) -----;
; returns: nothing
exit:
mov rax, NR_exit
syscall