-
Notifications
You must be signed in to change notification settings - Fork 0
/
lib.inc
227 lines (194 loc) · 2.9 KB
/
lib.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
section .text
global _start
exit:
xor rdi, rdi
mov rax, 60
syscall
string_length:
xor rax, rax ; zera o registrador rax
.loop:
cmp byte [rdi+rax], 0 ; compara se o endereço iniciado em rdi somado a rax=0 é 0
je .end ; se a rflag de igualdade estiver ativa pula para a subrotina .end
inc rax ; incrementa rax em 1byte
jmp .loop ; repete o loop
.end:
ret ; retorna da função
print_char:
push rdi ; salva rdi na pilha
mov rdi, rsp ; move rsp para rdi
call print_string ; chama a função de impressão de string
pop rdi ; puxa de volta rdi da pilha
ret ; retorna da função
print_newline:
mov rdi, 10
jmp print_char
print_string:
push rdi
call string_length
pop rsi
mov rdx, rax
mov rax, 1
mov rdi, 1
syscall
ret
print_uint:
mov rax, rdi
mov rdi, rsp
push 0
sub rsp, 16
dec rdi
mov r8, 10
.loop:
xor rdx, rdx
div r8
or dl, 0x30
dec rdi
mov [rdi], dl
test rax, rax
jnz .loop
call print_string
add rsp, 24
ret
print_int:
test rdi, rdi
jns print_uint
push rdi
mov rdi, '-'
call print_char
pop rdi
neg rdi
jmp print_uint
parse_int:
mov al, byte [rdi]
cmp al, '-'
je .signed
jmp parse_uint
.signed:
inc rdi
call parse_uint
neg rax
test rdx, rdx
jz .error
inc rdx
ret
.error:
xor rax, rax
ret
parse_uint:
mov 48, 10
xor rax, rax
xor rcx, rcx
.loop:
movzx r9, byte [rdi+rcx]
cmp r9b, '0'
jb .end
cmp r9b, '9'
ja .end
xor rdx,rdx
mul r8
and r9b, 0x0f
add rax, r9
inc rcx
jmp .loop
.end:
mov rdx, rcx
ret
string_equals:
mov al, byte [rdi]
cmp al, byte [rsi]
jne .no
inc rdi
inc rsi
test al, al
jnz string_equals
mov rax, 1
ret
.no:
xor rax, rax
ret
read_char:
push 0
xor rax, rax
xor rdi, rdi
mov rsi, rsp
mov rdx, 1
syscall
pop rax
ret
read_word:
push r14
push r15
xor r14, r14
mov r15, rsi
dec r15
.A:
push rdi
call read_char
pop rdi
cmp al, ' '
je .A
cmp al, 10
je .A
cmp al, 13
je .A
cmp al, 9
je .A
test al, al
jz .C
.B:
mov byte [rdi + r14], al
inc r14
push rdi
call read_char
pop rdi
cmp al, ' '
je .C
cmp al, 10
je .C
cmp al, 13
je .C
cmp al, 9
je .C
test al, al
jz .C
cmp r14, r15
je .D
jmp .B
.C:
mov byte [rdi + r14], 0
mov rax, rdi
mov rdx, r14
pop r15
pop r14
ret
.D:
xor rax, rax
pop 15
pop 14
ret
; rdi = source
; rsi = dest
; rdx = dest length
string_copy:
push rdi
push rsi
push rdx
call string_length
pop rdx
pop rsi
pop rdi
cmp rax, rdx
jae .too_long
push rsi
.loop:
mov dl, byte[rdi]
mov byte[rsi], dl
inc rdi
inc rsi
test dl, dl
jnz .loop
pop rax
ret
.too_long:
xor rax, rax
ret