-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest.asm
More file actions
237 lines (198 loc) · 4.47 KB
/
test.asm
File metadata and controls
237 lines (198 loc) · 4.47 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
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
; AsmGrm Tests
;
; Copyright (C) 2014 Rob Hardwick
; stdlib.h
extern malloc
; stdio.h
extern strncmp
extern putchar
extern exit
extern __printf_chk
extern __vsprintf_chk
; permutations.asm
extern asmgrm_permutations
;
; Data
;
section .data
test_fail: db `\033[31mTest '%s' FAILED\033[0m\n\0`
test_pass: db `%s\n\033[32mTest '%s' PASSED\033[0m\n\n\0`
test1_result: db `<p>a</p>\0`
test1_name: db `a permutations\0`
test2_result: db `<p>ab</p>\n<p>ba</p>\n\0`
test2_name: db `ab permutations\0`
test3_result: db `<p>abc</p>\n<p>acb</p>\n<p>bac</p>\n<p>bca</p>\n<p>cba</p>\n<p>cab</p>\n\0`
test3_name: db `abc permutations\0`
test4_result: db `<p>abcd</p>\n<p>abdc</p>\n<p>acbd</p>\n<p>acdb</p>\n<p>adcb</p>\n<p>adbc</p>\n<p>bacd</p>\n<p>badc</p>\n<p>bcad</p>\n<p>bcda</p>\n<p>bdca</p>\n<p>bdac</p>\n<p>cbad</p>\n<p>cbda</p>\n<p>cabd</p>\n<p>cadb</p>\n<p>cdab</p>\n<p>cdba</p>\n<p>dbca</p>\n<p>dbac</p>\n<p>dcba</p>\n<p>dcab</p>\n<p>dacb</p>\n<p>dabc</p>\n\0`
test4_name: db `abcd permutations\0`
test5_result: db `<p>$\?!</p>\n<p>$!\?</p>\n<p>\?$!</p>\n<p>\?!$</p>\n<p>!\?$</p>\n<p>!$\?</p>\n\0`
test5_name: db `$\?! permutations\0`
;
; Code
;
section .text
global _start, FCGX_FPrintF
;
; Run tests
;
; Stack
%define test_buffer 48
%define test1_input 32
%define test2_input 16
%define test3_input 1088
%define test4_input 1072
%define test5_input 1104
%define start_stack 1128
_start:
sub rsp, start_stack
lea rax, [rsp+test_buffer]
mov qword[rsp], rax
.test1:
mov word[rsp+test1_input], `a`
lea rdx, [rsp+test1_input]
mov ecx, test1_result
mov esi, test1_name
mov rdi, rsp
call test
.test2:
mov word[rsp+test2_input], `ab`
mov byte[rsp+test2_input+2], `\0`
lea rdx, [rsp+test2_input]
mov ecx, test2_result
mov esi, test2_name
mov rdi, rsp
call test
.test3:
mov dword[rsp+test3_input], `abc\0`
lea rdx, [rsp+test3_input]
mov ecx, test3_result
mov esi, test3_name
mov rdi, rsp
call test
.test4:
mov dword[rsp+test4_input], `abcd`
mov byte[rsp+test4_input+4], `\0`
lea rdx, [rsp+test4_input]
mov ecx, test4_result
mov esi, test4_name
mov rdi, rsp
call test
.test5:
mov dword[rsp+test5_input], `$\?!\0`
lea rdx, [rsp+test5_input]
mov ecx, test5_result
mov esi, test5_name
mov rdi, rsp
call test
.exit:
add rsp, start_stack
xor rdi, rdi
call exit
;
; Run test
;
; Stack
%define test_stack 40
test:
mov qword[rsp-40], rbx
mov qword[rsp-32], rbp
mov qword[rsp-24], r12
mov qword[rsp-16], r13
mov qword[rsp-8], r14
sub rsp, test_stack
mov rbx, rdi
mov r14, rsi
mov rsi, rdx
mov rbp, rcx
mov qword[rdi+8], 0
mov r12, -1
mov rdi, rdx
mov r13d, 0
mov rcx, r12
mov eax, r13d
repnz scasb
not rcx
add rcx, r12
mov edx, 0
mov rdi, rbx
call asmgrm_permutations
mov rdi, rbp
mov rcx, r12
mov eax, r13d
repnz scasb
mov r12, rcx
not r12
lea rdx, [r12-1]
mov rsi, rbp
mov rdi, qword[rbx]
call strncmp
test eax, eax
je .pass
.fail:
mov rdx, r14
mov esi, test_fail
mov edi, 1
mov eax, 0
call __printf_chk
jmp .ret
.pass:
mov rcx, r14
mov rdx, rbp
mov esi, test_pass
mov edi, 1
mov eax, 0
call __printf_chk
.ret:
mov rbx, qword[rsp]
mov rbp, qword[rsp+8]
mov r12, qword[rsp+16]
mov r13, qword[rsp+24]
mov r14, qword[rsp+32]
add rsp, test_stack
ret
;
; Mock FCGX_FPrintF (fcgiapp.h)
;
; Stack
%define fprintf_stack 208
FCGX_FPrintF:
push rbx
sub rsp, fprintf_stack
mov rbx, rdi
mov qword[rsp+48], rdx
mov qword[rsp+56], rcx
mov qword[rsp+64], r8
mov qword[rsp+72], r9
test al, al
je .vsprintf
; Load vargs
movaps [rsp+80], xmm0
movaps [rsp+96], xmm1
movaps [rsp+112], xmm2
movaps [rsp+128], xmm3
movaps [rsp+144], xmm4
movaps [rsp+160], xmm5
movaps [rsp+176], xmm6
movaps [rsp+192], xmm7
.vsprintf:
mov rcx, rsi
mov dword[rsp+8], 16
mov dword[rsp+12], 48
lea rax, [rsp+224]
mov qword[rsp+16], rax
lea rax, [rsp+32]
mov qword[rsp+24], rax
mov rdi, qword[rbx]
add rdi, qword[rbx+8]
lea r8, [rsp+8]
mov rdx, -1
mov esi, 1
call __vsprintf_chk
test eax, eax
jle .ret
cdqe
add qword[rbx+8], rax
.ret:
add rsp, fprintf_stack
pop rbx
ret