-
Notifications
You must be signed in to change notification settings - Fork 1
/
macros.inc
224 lines (176 loc) · 2.37 KB
/
macros.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
nblocals equ 0
macro beginProc name,[arg]{
nblocals equ 0
num equ 8
forward
if ~ arg eq
arg equ ebp+num
num equ num+4
end if
common
name:
push ebp
mov ebp,esp
}
macro xcall proc, [arg]{
common
if ~ arg eq
reverse
pushd arg
common
end if
call proc }
macro endProc n{
mov esp,ebp
pop ebp
if ~ n eq
ret n*4
else
ret
end if
}
macro getParm reg,num{
mov reg,[ebp+8+4*num]
}
macro program{
format binary
use32
org 0x40000000
IMAGE_START:
dd 0xAADDBBFF
dd MAIN ;init method
_argc dd 0x0
dd _argv
dd IMAGE_END
}
macro endProgram{
_tmpNext dd 0x0
_tryStackPos dd _tryStack
_tryStack:
rb 1024
_argv rb 1024
IMAGE_END:
}
macro try id{
local .n
mov eax,dword [_tryStackPos]
mov dword [eax],.n
add eax,4
mov dword [eax],ebp
add eax,4
mov dword [eax],esp
add eax,4
mov dword [_tryStackPos],eax
xor eax,eax
.n:
test eax,eax
jnz catch#id
}
macro endtry id{
jmp ecatch#id
etry#id:
mov eax,[_tryStackPos]
sub eax,12
mov dword [_tryStackPos],eax
ecatch#id:
}
macro throw x{
mov eax,[_tryStackPos]
sub eax,12
mov dword [_tryStackPos],eax
mov ebp,[eax+4]
mov esp,[eax+8]
push dword [eax]
pop dword [_tmpNext]
mov eax,x
push dword [_tmpNext]
ret
}
macro catch id{
jmp etry#id
catch#id:
}
macro var name {
nblocals equ nblocals+4
sub esp,4
name equ ebp-(nblocals)
}
macro xcmp v1,v2{
push dword v1
pop dword eax
push dword v2
pop dword ebx
cmp eax,ebx
}
macro ifeq v1,v2,id{
xcmp v1,v2
jne .suite#id
}
macro ifl v1,v2,id{
xcmp v1,v2
jnl .suite#id
}
macro ifg v1,v2,id{
xcmp v1,v2
jng .suite#id
}
macro endif id{
.suite#id:
}
numFor equ 0
macro for variable,initial,last,steps,id{
numFor equ numFor+1
push dword initial
pop dword [variable]
push dword last
pop dword [l.#id]
if ~ steps eq
push dword steps
else
push dword 1
end if
pop dword [s.#id]
b.#id:
mov eax,[variable]
mov ebx,[l.#id]
cmp eax,ebx
if (steps>=0)
jg e.#id
else
jl e.#id
end if
}
macro next variable,id{
mov eax,[variable]
add eax,[s.#id]
mov [variable],eax
jmp b.#id
s.#id dd 0x0
l.#id dd 0x0
e.#id:
}
macro twoOP v1,v2{
mov eax,v1
mov ebx,v2
}
macro xmul v1,v2{
twoOP v1,v2
imul eax,ebx
push eax
}
macro xadd v1,v2{
twoOP v1,v2
add eax,ebx
push eax
}
macro xsub v1,v2{
twoOP v1,v2
sub eax,ebx
push eax
}
macro let dst{
pop dst
}
macro string n,t{
n db t,0
}