Adds tolower(), toupper()
This commit is contained in:
36
src/core.asm
36
src/core.asm
@@ -4,6 +4,8 @@ section .text
|
|||||||
global exit
|
global exit
|
||||||
global islower
|
global islower
|
||||||
global isupper
|
global isupper
|
||||||
|
global tolower
|
||||||
|
global toupper
|
||||||
|
|
||||||
;----- exit(exit_code) -----;
|
;----- exit(exit_code) -----;
|
||||||
; Exits the program with given exit code
|
; Exits the program with given exit code
|
||||||
@@ -47,3 +49,37 @@ isupper:
|
|||||||
mov rax, 1
|
mov rax, 1
|
||||||
.quit:
|
.quit:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
;----- tolower(c) -----;
|
||||||
|
; Converts given ASCII character to lowercase if it is uppercase
|
||||||
|
; Return value: Converted lowercase ASCII character or the original input if it wasn't uppercase
|
||||||
|
; Used registers:
|
||||||
|
; rax* (ret)
|
||||||
|
; rdi (arg)
|
||||||
|
tolower:
|
||||||
|
call isupper
|
||||||
|
test al, al
|
||||||
|
jnz .makelow
|
||||||
|
mov rax, rdi
|
||||||
|
ret
|
||||||
|
.makelow:
|
||||||
|
mov rax, rdi
|
||||||
|
add rax, 32
|
||||||
|
ret
|
||||||
|
|
||||||
|
;----- toupper(c) -----;
|
||||||
|
; Converts given ASCII character to uppercase if it is lowercase
|
||||||
|
; Return value: Converted uppercase ASCII character or the original input if it wasn't lowercase
|
||||||
|
; Used registers:
|
||||||
|
; rax* (ret)
|
||||||
|
; rdi (arg)
|
||||||
|
toupper:
|
||||||
|
call islower
|
||||||
|
test al, al
|
||||||
|
jnz .makeupp
|
||||||
|
mov rax, rdi
|
||||||
|
ret
|
||||||
|
.makeupp:
|
||||||
|
mov rax, rdi
|
||||||
|
sub rax, 32
|
||||||
|
ret
|
||||||
|
114
src/tests.asm
114
src/tests.asm
@@ -4,6 +4,8 @@
|
|||||||
extern exit
|
extern exit
|
||||||
extern islower
|
extern islower
|
||||||
extern isupper
|
extern isupper
|
||||||
|
extern tolower
|
||||||
|
extern toupper
|
||||||
; console.asm
|
; console.asm
|
||||||
extern print
|
extern print
|
||||||
extern puts
|
extern puts
|
||||||
@@ -31,6 +33,8 @@ section .rodata
|
|||||||
TEST_strclr equ 1
|
TEST_strclr equ 1
|
||||||
TEST_islower equ 1
|
TEST_islower equ 1
|
||||||
TEST_isupper equ 1
|
TEST_isupper equ 1
|
||||||
|
TEST_tolower equ 1
|
||||||
|
TEST_toupper equ 1
|
||||||
TEST_strcmp equ 1
|
TEST_strcmp equ 1
|
||||||
|
|
||||||
str1 db "Hello, world!",EOS
|
str1 db "Hello, world!",EOS
|
||||||
@@ -114,6 +118,20 @@ section .rodata
|
|||||||
isupper4 db TAB,"isupper('D'): %d",NL,EOS
|
isupper4 db TAB,"isupper('D'): %d",NL,EOS
|
||||||
isupper5 db TAB,"isupper('!'): %d",NL,EOS
|
isupper5 db TAB,"isupper('!'): %d",NL,EOS
|
||||||
|
|
||||||
|
; tolower()
|
||||||
|
msgTolower db NL,"TEST tolower()",NL,EOS
|
||||||
|
tolower1 db TAB,"tolower(str1[0]): %c",NL,EOS
|
||||||
|
tolower2 db TAB,"tolower(str1[1]): %c",NL,EOS
|
||||||
|
tolower3 db TAB,"tolower('!'): %c",NL,EOS
|
||||||
|
tolower4 db TAB,"tolower() -- entire str4: %s",NL,EOS
|
||||||
|
|
||||||
|
; toupper()
|
||||||
|
msgToupper db NL,"TEST tolower()",NL,EOS
|
||||||
|
toupper1 db TAB,"toupper(str1[0]): %c",NL,EOS
|
||||||
|
toupper2 db TAB,"toupper(str1[1]): %c",NL,EOS
|
||||||
|
toupper3 db TAB,"toupper('!'): %c",NL,EOS
|
||||||
|
toupper4 db TAB,"toupper() -- entire str4: %s",NL,EOS
|
||||||
|
|
||||||
; strcmp()
|
; strcmp()
|
||||||
msgStrcmp db NL,"TEST strcmp()",NL,EOS
|
msgStrcmp db NL,"TEST strcmp()",NL,EOS
|
||||||
strcmp1 db TAB,"strcmp(str1, str1): %d",NL,EOS
|
strcmp1 db TAB,"strcmp(str1, str1): %d",NL,EOS
|
||||||
@@ -512,6 +530,102 @@ _start:
|
|||||||
call printf
|
call printf
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
;---
|
||||||
|
;--- tolower()
|
||||||
|
;---
|
||||||
|
%if TEST_tolower
|
||||||
|
lea rdi, [rel msgTolower]
|
||||||
|
call print
|
||||||
|
|
||||||
|
; TEST 1
|
||||||
|
mov dil, byte [str1]
|
||||||
|
call tolower
|
||||||
|
lea rdi, [rel tolower1]
|
||||||
|
mov rsi, rax
|
||||||
|
call printf
|
||||||
|
|
||||||
|
; TEST 2
|
||||||
|
mov dil, byte [str1 + 1]
|
||||||
|
call tolower
|
||||||
|
lea rdi, [rel tolower2]
|
||||||
|
mov rsi, rax
|
||||||
|
call printf
|
||||||
|
|
||||||
|
; TEST 3
|
||||||
|
mov dil, '!'
|
||||||
|
call tolower
|
||||||
|
lea rdi, [rel tolower3]
|
||||||
|
mov rsi, rax
|
||||||
|
call printf
|
||||||
|
|
||||||
|
; TEST 4
|
||||||
|
lea rdi, [rel strBuff1]
|
||||||
|
lea rsi, [rel str4]
|
||||||
|
mov rdx, 32
|
||||||
|
call strcpy
|
||||||
|
mov rdi, rax
|
||||||
|
call strlen
|
||||||
|
mov rcx, rax
|
||||||
|
lea rsi, [rel strBuff1]
|
||||||
|
.tolowerLoop:
|
||||||
|
mov dil, byte [rsi]
|
||||||
|
call tolower
|
||||||
|
mov byte [rsi], al
|
||||||
|
inc rsi
|
||||||
|
loop .tolowerLoop
|
||||||
|
lea rdi, [rel tolower4]
|
||||||
|
lea rsi, [rel strBuff1]
|
||||||
|
call printf
|
||||||
|
%endif
|
||||||
|
|
||||||
|
;---
|
||||||
|
;--- toupper()
|
||||||
|
;---
|
||||||
|
%if TEST_toupper
|
||||||
|
lea rdi, [rel msgToupper]
|
||||||
|
call print
|
||||||
|
|
||||||
|
; TEST 1
|
||||||
|
mov dil, byte [str1]
|
||||||
|
call toupper
|
||||||
|
lea rdi, [rel toupper1]
|
||||||
|
mov rsi, rax
|
||||||
|
call printf
|
||||||
|
|
||||||
|
; TEST 2
|
||||||
|
mov dil, byte [str1 + 1]
|
||||||
|
call toupper
|
||||||
|
lea rdi, [rel toupper2]
|
||||||
|
mov rsi, rax
|
||||||
|
call printf
|
||||||
|
|
||||||
|
; TEST 3
|
||||||
|
mov dil, '!'
|
||||||
|
call toupper
|
||||||
|
lea rdi, [rel toupper3]
|
||||||
|
mov rsi, rax
|
||||||
|
call printf
|
||||||
|
|
||||||
|
; TEST 4
|
||||||
|
lea rdi, [rel strBuff1]
|
||||||
|
lea rsi, [rel str4]
|
||||||
|
mov rdx, 32
|
||||||
|
call strcpy
|
||||||
|
mov rdi, rax
|
||||||
|
call strlen
|
||||||
|
mov rcx, rax
|
||||||
|
lea rsi, [rel strBuff1]
|
||||||
|
.toupperLoop:
|
||||||
|
mov dil, byte [rsi]
|
||||||
|
call toupper
|
||||||
|
mov byte [rsi], al
|
||||||
|
inc rsi
|
||||||
|
loop .toupperLoop
|
||||||
|
lea rdi, [rel toupper4]
|
||||||
|
lea rsi, [rel strBuff1]
|
||||||
|
call printf
|
||||||
|
%endif
|
||||||
|
|
||||||
;---
|
;---
|
||||||
;--- strcmp()
|
;--- strcmp()
|
||||||
;---
|
;---
|
||||||
|
Reference in New Issue
Block a user