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