Adds strcpy()
This commit is contained in:
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
section .text
|
section .text
|
||||||
global strlen
|
global strlen
|
||||||
|
global strcpy
|
||||||
|
|
||||||
;----- strlen(*str[]) -----;
|
;----- strlen(*str[]) -----;
|
||||||
; Gets the length of given string
|
; Gets the length of given string
|
||||||
@@ -19,3 +20,35 @@ strlen:
|
|||||||
not rax
|
not rax
|
||||||
dec rax
|
dec rax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
;----- strcpy(*dest[], *src[], maxLength) -----;
|
||||||
|
; Copies one string (src) into the other (dest), overwriting dest
|
||||||
|
; NOTE: maxLength must never exceed size of dest[].
|
||||||
|
; Return value: Pointer to dest
|
||||||
|
; Used registers:
|
||||||
|
; rax* (ret) Pointer to dest[]
|
||||||
|
; rdi (arg) Pointer to dest[]
|
||||||
|
; rsi (arg) Pointer to src[]
|
||||||
|
; rdx (arg) Max amount of characters to copy / size of dest[] <!>Must never be greater than size of dest[]!
|
||||||
|
; rcx* Counter for movsb
|
||||||
|
; r8* Backup for rdi
|
||||||
|
strcpy:
|
||||||
|
mov r8, rdi
|
||||||
|
mov rdi, rsi
|
||||||
|
call strlen
|
||||||
|
mov rcx, rdx
|
||||||
|
cmp rcx, rax
|
||||||
|
je .decMaxLen ;rcx-1 for EOS
|
||||||
|
ja .setMaxLen ;set rcx to strlen(src)
|
||||||
|
jmp .copy
|
||||||
|
.decMaxLen:
|
||||||
|
dec rcx
|
||||||
|
jmp .copy
|
||||||
|
.setMaxLen:
|
||||||
|
mov rcx, rax
|
||||||
|
.copy:
|
||||||
|
mov rdi, r8
|
||||||
|
rep movsb
|
||||||
|
mov byte [rdi], EOS
|
||||||
|
mov rax, r8
|
||||||
|
ret
|
||||||
|
@@ -7,12 +7,20 @@ extern print
|
|||||||
extern puts
|
extern puts
|
||||||
; string.asm
|
; string.asm
|
||||||
extern strlen
|
extern strlen
|
||||||
|
extern strcpy
|
||||||
; convert.asm
|
; convert.asm
|
||||||
|
|
||||||
section .rodata
|
section .rodata
|
||||||
TEST_print equ 1
|
TEST_print equ 1
|
||||||
TEST_puts equ 1
|
TEST_puts equ 1
|
||||||
TEST_strlen equ 1
|
TEST_strlen equ 1
|
||||||
|
TEST_strcpy equ 1
|
||||||
|
|
||||||
|
str1 db "Hello, world!",EOS
|
||||||
|
str2 db "Hello, World!",EOS
|
||||||
|
str3 db "Hello world!",EOS
|
||||||
|
str4 db "Howdy environment!",EOS
|
||||||
|
str5 db "The quick brown fox jumps over the lazy dog",EOS
|
||||||
|
|
||||||
; print()
|
; print()
|
||||||
msgPrint db "TEST print()",NL,EOS
|
msgPrint db "TEST print()",NL,EOS
|
||||||
@@ -24,9 +32,18 @@ section .rodata
|
|||||||
strlenStr1 db "Hello",EOS
|
strlenStr1 db "Hello",EOS
|
||||||
strlenStr2 db "Hello, world!",NL,EOS
|
strlenStr2 db "Hello, world!",NL,EOS
|
||||||
|
|
||||||
|
; strcpy()
|
||||||
|
msgStrcpy db "TEST strcpy()",NL,EOS
|
||||||
|
strcpy1 db TAB,"strcpy(strBuff1, str1, 12): ",NL,TAB,TAB,EOS
|
||||||
|
strcpy2 db TAB,"strcpy(strBuff1, str1, 13): ",NL,TAB,TAB,EOS
|
||||||
|
strcpy3 db TAB,"strcpy(strBuff1, str1, 32): ",NL,TAB,TAB,EOS
|
||||||
|
strcpy4 db TAB,"strcpy(strBuff1, str5, 32): ",NL,TAB,TAB,EOS
|
||||||
|
|
||||||
section .data
|
section .data
|
||||||
|
|
||||||
section .bss
|
section .bss
|
||||||
|
strBuff1 resb 32
|
||||||
|
strBuff2 resb 4
|
||||||
|
|
||||||
section .text
|
section .text
|
||||||
global _start
|
global _start
|
||||||
@@ -63,6 +80,51 @@ _start:
|
|||||||
call strlen
|
call strlen
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
;---
|
||||||
|
;--- strcpy()
|
||||||
|
;---
|
||||||
|
%if TEST_strcpy
|
||||||
|
lea rdi, [rel msgStrcpy]
|
||||||
|
call print
|
||||||
|
|
||||||
|
; TEST 1
|
||||||
|
lea rdi, [rel strcpy1]
|
||||||
|
call print
|
||||||
|
lea rdi, [rel strBuff1]
|
||||||
|
lea rsi, [rel str1]
|
||||||
|
mov rdx, 12
|
||||||
|
call strcpy
|
||||||
|
mov rdi, rax
|
||||||
|
call puts
|
||||||
|
; TEST 2
|
||||||
|
lea rdi, [rel strcpy2]
|
||||||
|
call print
|
||||||
|
lea rdi, [rel strBuff1]
|
||||||
|
lea rsi, [rel str1]
|
||||||
|
mov rdx, 13
|
||||||
|
call strcpy
|
||||||
|
mov rdi, rax
|
||||||
|
call puts
|
||||||
|
; TEST 3
|
||||||
|
lea rdi, [rel strcpy3]
|
||||||
|
call print
|
||||||
|
lea rdi, [rel strBuff1]
|
||||||
|
lea rsi, [rel str1]
|
||||||
|
mov rdx, 32
|
||||||
|
call strcpy
|
||||||
|
mov rdi, rax
|
||||||
|
call puts
|
||||||
|
; TEST 4
|
||||||
|
lea rdi, [rel strcpy4]
|
||||||
|
call print
|
||||||
|
lea rdi, [rel strBuff1]
|
||||||
|
lea rsi, [rel str5]
|
||||||
|
mov rdx, 32
|
||||||
|
call strcpy
|
||||||
|
mov rdi, rax
|
||||||
|
call puts
|
||||||
|
%endif
|
||||||
|
|
||||||
;---
|
;---
|
||||||
;--- exit()
|
;--- exit()
|
||||||
;---
|
;---
|
||||||
|
Reference in New Issue
Block a user