-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutil.asm
203 lines (179 loc) · 2.64 KB
/
util.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
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
global string_length
global print_newline
global print_char
global print_string
global print_uint
global print_int
global parse_int
global parse_uint
global string_equals
global read_char
global read_word
global string_copy
global in_fd
section .data
in_fd: dq 0
section .text
string_length:
xor rax, rax
.loop:
cmp byte [rdi+rax], 0
je .end
inc rax
jmp .loop
.end:
ret
print_newline:
mov rdi, 10
print_char:
push rdi
mov rdi, rsp
call print_string
pop rdi
ret
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
; returns rax: number, rdx : length
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
; returns rax: number, rdx : length
parse_uint:
mov r8, 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
mov rdi, [in_fd]
mov rsi, rsp
mov rdx, 1
syscall
pop rax
ret
section .text
read_word:
push r14
xor r14, r14
.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, 254
je .C
jmp .B
.C:
mov byte [rdi + r14], 0
mov rax, rdi
mov rdx, r14
pop r14
ret
string_copy:
mov dl, byte[rdi]
mov byte[rsi], dl
inc rdi
inc rsi
test dl, dl
jnz string_copy
ret