-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathio.inc
264 lines (197 loc) · 3.04 KB
/
io.inc
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
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
;we use a variable in memeory named noob(dq) and newb(db) for all functions operation to be easy
section .data
noob: dq 0
newb: db 0
exit: mov rax, 60
syscall
ret
string_length:
mov r8, 0
.loop:
mov r9b, [rdi+r8]
inc r8
cmp r9b, 0
jnz .loop
sub r8, 1
mov rax, r8
ret
print_string:
mov r8, 0
.loop:
mov r9b, [rdi+r8]
cmp r9b, 0
je .end
mov r10, rdi
add r10, r8
inc r8
push rdi
mov rax, 1
mov rdi, 1
mov rdx, 1
mov rsi, r10
syscall
pop rdi
jmp .loop
.end:
call print_newline
ret
print_uint:
mov rax, rdi ;dividend must be in rax by default
mov r11, 10 ;moving 10 to register
mov r10, 0 ;r9 is used as counter
.loop1:
mov rdx, 0
div r11 ;remainder to be pushed to stack
push rdx
inc r10
cmp rax, 0 ;
jne .loop1
.loop2:
pop r8 ;popping to get original number
add r8 , '0' ;add for making ascii value of digit
mov [noob], r8
;print the digit to stdout
mov rax, 1
mov rdi, 1
mov rdx, 1
mov rsi, noob
syscall
dec r10
test r10, r10 ;loop continues until r9 == 0
jnz .loop2
call print_newline
ret
print_newline:
mov qword[noob], 10
mov rax, 1
mov rdi, 1
mov rdx, 1
mov rsi, noob
syscall
ret
print_char:
mov byte[newb], dil
mov rsi, newb
mov rax, 1
mov rdi, 1
mov rdx, 1
syscall
call print_newline
ret
print_int:
cmp rdi, 0
jge .else
xor rdi, 0xffffffffffffffff
add rdi, 1
push rdi
mov byte[newb], '-'
mov rsi, newb
mov rax, 1
mov rdi, 1
mov rdx, 1
syscall
pop rdi
.else:
call print_uint
ret
parse_uint: ;returns uint in rax and digit count in rdx
mov r10, 0
mov r8, 0
mov rax, 0
.loop:
mov r8b, [rdi+r10]
cmp r8, 0
je .end
mov r9, 10
mul r9
sub r8b, '0'
add rax, r8
inc r10
jmp .loop
.end:
mov rdx, r10
ret
parse_int: ;returns int in rax, digits in rdx
mov r8, 0
mov r8b, [rdi]
cmp r8b, '-'
je .neg
call parse_uint
ret
.neg:
lea rdi, [rdi+1]
call parse_uint
inc rdx
xor rax, 0xffffffffffffffff
inc rax
ret
string_equals: ;returns 0 or 1 in rax
mov r8, 0
mov r9, 0
mov r10, 0
.loop:
mov r8b, [rdi+r10]
mov r9b, [rsi+r10]
inc r10
cmp r8b, r9b
je .elif
mov rax, 0
ret
.elif:
cmp r8b, 0
jne .loop
mov rax, 1
ret
read_char: ;returns charecter read in char
push 0
mov rax, 0
mov rdi, 0
mov rsi, rsp
mov rdx, 1
syscall
pop rax
ret
string_copy: ;returns buffer address or 0 in rax
call string_length
cmp rax, rdx
jge .big
mov r8, 0
mov r9, 0
.loop:
mov r8b, [rdi+r9]
mov [rsi+r9], r8b
inc r9
cmp r8b, 0
je .end
jmp .loop
.end:
mov rax, rsi
ret
.big:
mov rax, 0
ret
read_word: ;returns buffer address or 0 in rax
mov r8, rdi
mov r9, rsi
mov r10, 0
.star:
call read_char
cmp rax, ' '
je .star
mov [r8+r10], rax
inc r10
cmp r10, r9
jle .cont
mov rax, 0
ret
.cont:
cmp rax, 0
je .end
cmp rax, 10
je .end
jmp .star
.end:
dec r10
mov byte[r8+r10], 0
mov rax, r8
ret