Files
klibc/core.asm

123 lines
1.8 KiB
NASM

section .text
global min
global minu
global max
global maxu
global islower
global isupper
global tolower
global toupper
;----- min(int a, int b) -----;
; return value: lowest value
min:
push rbp
mov rbp, rsp
mov rax, rdi
cmp rdi, rsi
cmovg rax, rsi
leave
ret
;----- minu(unsigned int a, unsigned int b) -----;
; return value: lowest value
minu:
push rbp
mov rbp, rsp
mov rax, rdi
cmp rdi, rsi
cmova rax, rsi
leave
ret
;----- max(int a, int b) -----;
; return value: highest value
max:
push rbp
mov rbp, rsp
mov rax, rdi
cmp rdi, rsi
cmovl rax, rsi
leave
ret
;----- maxu(unsigned int a, unsigned int b) -----;
; return value: highest value
maxu:
push rbp
mov rbp, rsp
mov rax, rdi
cmp rdi, rsi
cmovb rax, rsi
leave
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:
push rbp
mov rbp, rsp
xor rax, rax
cmp byte [rdi], 'a'
jb .quit
cmp byte [rdi], 'z'
ja .quit
mov rax, 1
.quit:
leave
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:
push rbp
mov rbp, rsp
xor rax, rax
cmp byte [rdi], 'A'
jb .quit
cmp byte [rdi], 'Z'
ja .quit
mov rax, 1
.quit:
leave
ret
;----- tolower(char* c) -----;
; return value: ASCII value. Same as original if it was not an uppercase letter, otherwise lowercase letter
tolower:
push rbp
mov rbp, rsp
call isupper
mov rcx, rax
mov al, byte [rdi]
cmp rcx, 1
jne .quit
add al, 32
.quit:
leave
ret
;----- toupper(char* c) -----;
; return value: ASCII value. Same as original if it was not a lowercase letter, otherwise uppercase letter
toupper:
push rbp
mov rbp, rsp
call islower
mov rcx, rax
mov al, byte [rdi]
cmp rcx, 1
jne .quit
sub al, 32
.quit:
leave
ret