-
Notifications
You must be signed in to change notification settings - Fork 0
/
strstr.asm
115 lines (103 loc) · 2.38 KB
/
strstr.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
SECTION .text
GLOBAL strstr
strlen: ; label de debut de la fonction
; rdi contient le premier argument:char const *str;convention de debut de fonction
push rbp ; convention de debut de fonction
mov rbp, rsp ; convention de debut de fonction
mov rax, 0 ; rax = 0
start_strlen: ; label de debut de boucle (utilise par jmp)
cmp byte[rdi], 0 ; compare le byte (char) a l’adresse de rdi avec 0 (\0) ; soit *str == 0
je end_strlen ; jump seulement si les valeurs comparees sont egales (Jump Equal)
add rax, 1 ; rax = rax + 1
add rdi, 1 ; rdi = rdi + 1 (decalage de pointeur)
jmp start_strlen ; retourne au debut de la boucle
end_strlen: ; label de fin de boucle (utilise par jmp)
leave ; convention de debut de fonction
ret ; quitte la fonction (la valeur de retour est toujours dans rax)
strncmp:
push rbp
mov rbp, rsp
mov rax, 0
mov rcx, 0
my_for:
cmp rdx, 0
je end_strcmp
sub rdx, 1
mov r8b, [rsi + rcx]
mov rax, [rdi + rcx]
cmp r8b, 0
je end_strcmp
cmp rax, 0
je end_strcmp
cmp al, r8b
jne end_strcmp
add rcx, 1
jmp my_for
end_strcmp:
sub al, r8b
movsx rax, al
leave
ret
;char *strstr(const char *meuledefoin, const char *aiguille);
;
; int j = 0;
; char *tmp = null
;
; while (*meuledefoin != '\0') {
; if (*meuledefoins == aiguille[j])
; tmp = *meuledefoins;
; while (meuledefoins[i] == aiguille[j]) {
; *meuledefoins++
; j++;
; if (aiguille[j + 1] == 0)
; return tmp
; if (meuledefoins[i] == 0 || aiguille[j] == 0)
; return tmp
; }
; j = 0
; *meuledefoins++;
;}
strstr:
push rbp
mov rbp, rsp
mov rax, 0
mov rcx, 0
; rdi s1
; rsi s2
mov rdx, 0 ;n
cmp byte[rdi], 0
je empty
cmp byte[rsi], 0
je empty
jmp my_call_strlen
my_call_strlen:
push rdi
mov rdi, rsi
call strlen
mov rdx, rax
pop rdi
my_for_strstr:
cmp byte[rdi], 0
je end_strstr_lose
push rdi
push rsi
push rdx
call strncmp
pop rdx
pop rsi
pop rdi
cmp rax, 0
je end_strstr_win
inc rdi
jmp my_for_strstr
empty:
leave
ret
end_strstr_win:
mov rax, rdi
leave
ret
end_strstr_lose:
mov rax, 0
leave
ret