-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstring.asm
More file actions
189 lines (143 loc) · 3.73 KB
/
string.asm
File metadata and controls
189 lines (143 loc) · 3.73 KB
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
section .text
global format_decimal
global format_node
global format_string
global format_pointer
global format_key
global format_string_scanf
global format_empty_command
global format_max_size_allowed
global format_key_nonexistent
global format_long
global format_invalid_update_syntax
global unknown_command
global inside_func
global strcpy
global strlen
global strcmp
global strstr
global strchr
strlen:
push rbp
mov rbp , rsp
sub rsp , 8
%define i -8
mov dword [rbp + i] , 0
.for:
mov eax , [rbp + i]
cmp byte [rdi + rax] , 0
jz .done
inc dword [rbp + i]
jmp .for
.done:
%undef i
mov rsp , rbp
pop rbp
ret
strcpy:
push rbp
mov rbp , rsp
sub rsp , 8
%define i -8
mov dword [rbp + i] , 0
.for:
mov eax , dword [rbp + i]
mov bl , [rsi + rax]
mov byte [rdi + rax] , bl
cmp byte [rsi + rax] , 0
jz .done
inc dword [rbp + i]
jmp .for
.done:
mov rsp , rbp
pop rbp
; %undef i
ret
strcmp:
push rbp
mov rbp , rsp
.for:
cmp byte [rdi] , 0
jnz .else
cmp byte [rsi] , 0
jnz .else
jmp .ret0
.else:
mov al , byte [rdi]
cmp al , byte [rsi]
jb .ret2
ja .ret1
inc rdi
inc rsi
jmp .for
.done:
.ret0:
mov rax , 0
jmp strcmp.finish
.ret1:
mov rax , 1
jmp strcmp.finish
.ret2:
mov rax , -1
jmp strcmp.finish
.finish:
mov rsp , rbp
pop rbp
ret
strstr:
push rbp
mov rbp , rsp
.for1:
mov rbx , 0
mov rax , rdi
.for2:
cmp byte [rsi + rbx] , 0
je .return
cmp byte [rdi + rbx] , 0
je .done1
mov cl , [rsi + rbx]
cmp [rdi + rbx] , cl
jne .skip
inc rbx
jmp .for2
.done2:
.skip:
inc rdi
jmp .for1
.done1:
mov rax , 0
.return:
mov rsp , rbp
pop rbp
ret
strchr:
push rbp
mov rbp , rsp
.for:
cmp byte [rdi] , 0
je .done
mov rax , rdi
cmp byte [rdi] , sil
je .return
inc rdi
jmp .for
.done:
mov rax , 0
.return:
mov rsp , rbp
pop rbp
ret
section .data
format_string_scanf: db "%s" , 0
format_decimal: db "%d" , 10 , 0
format_long: db "%lld" , 10 , 0
format_string: db "%s" , 10 , 0
format_node: db "left:%10p right:%10p height:%5d key: %6s value: %5d addr: %10p" , 10 , 0
format_key: db "%s" , 10 , 0
format_pointer: db "%p" , 10 , 0
format_empty_command: db "Empty commands are not allowed" , 10 , 0
format_max_size_allowed: db "Variable name must have maximum 19 characters" , 10 , 0
format_key_nonexistent: db "Key doesn't exist" , 10 , 0
format_invalid_update_syntax: db "Invalid syntax" , 10 , 0
unknown_command: db "Unknown command!" , 0
inside_func: db "inside" , 0