-
Notifications
You must be signed in to change notification settings - Fork 0
/
x86_64.mli
347 lines (284 loc) · 10.2 KB
/
x86_64.mli
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
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
(** {0 Bibliothèque pour l'écriture de programmes X86-64 }
Il s'agit là uniquement d'un fragment relativement petit
de l'assembleur X86-64.
@author Jean-Christophe Filliâtre (CNRS)
@author Kim Nguyen (Université Paris Sud)
*)
(** {1 Code } *)
type 'a asm
(** type abstrait du code assembleur.
Le paramètre ['a] est utilisé comme type fantôme. *)
type text = [ `text ] asm
(** du code assembleur se trouvant dans la zone de texte *)
type data = [ `data ] asm
(** du code assembleur se trouvant dans la zone de données *)
type label = string
(** les étiquettes d'addresses sont des chaînes de caractères *)
val nop : [> ] asm
(** l'instruction vide. Peut se trouver dans du text ou du data *)
val ( ++ ) : ([< `text|`data ] asm as 'a)-> 'a -> 'a
(** concatène deux bouts de codes (soit text avec text, soit data avec
data) *)
val inline: string -> [> ] asm
(** [inline s] recopie la chaîne [s] telle quelle dans le fichier
assembleur *)
type program = {
text : text;
data : data;
}
(** un programme est constitué d'une zone de texte et d'une zone de données *)
val print_program : Format.formatter -> program -> unit
(** [print_program fmt p] imprime le code du programme [p] dans le
formatter [fmt] *)
val print_in_file: file:string -> program -> unit
(** {1 Registres } *)
type size = [`B | `W | `L | `Q]
type 'size register
(** type abstrait des registres *)
val rax: [`Q] register
val rbx: [`Q] register
val rcx: [`Q] register
val rdx: [`Q] register
val rsi: [`Q] register
val rdi: [`Q] register
val rbp: [`Q] register
val rsp: [`Q] register
val r8 : [`Q] register
val r9 : [`Q] register
val r10: [`Q] register
val r11: [`Q] register
val r12: [`Q] register
val r13: [`Q] register
val r14: [`Q] register
val r15: [`Q] register
(** registres 64 bits *)
val eax: [`L] register
val ebx: [`L] register
val ecx: [`L] register
val edx: [`L] register
val esi: [`L] register
val edi: [`L] register
val ebp: [`L] register
val esp: [`L] register
val r8d: [`L] register
val r9d: [`L] register
val r10d: [`L] register
val r11d: [`L] register
val r12d: [`L] register
val r13d: [`L] register
val r14d: [`L] register
val r15d: [`L] register
(** registres 32 bits *)
val ax: [`W] register
val bx: [`W] register
val cx: [`W] register
val dx: [`W] register
val si: [`W] register
val di: [`W] register
val bp: [`W] register
val sp: [`W] register
val r8w: [`W] register
val r9w: [`W] register
val r10w: [`W] register
val r11w: [`W] register
val r12w: [`W] register
val r13w: [`W] register
val r14w: [`W] register
val r15w: [`W] register
(** registres 16 bits *)
val al: [`B] register
val bl: [`B] register
val cl: [`B] register
val dl: [`B] register
val ah: [`B] register
val bh: [`B] register
val ch: [`B] register
val dh: [`B] register
val sil: [`B] register
val dil: [`B] register
val bpl: [`B] register
val spl: [`B] register
val r8b: [`B] register
val r9b: [`B] register
val r10b: [`B] register
val r11b: [`B] register
val r12b: [`B] register
val r13b: [`B] register
val r14b: [`B] register
val r15b: [`B] register
(** registres 8 bits *)
(** {1 Opérandes } *)
type 'size operand
(** Le type abstrait des opérandes *)
val imm: int -> [>] operand
(** opérande immédiate $i *)
val imm32: int32 -> [>] operand
(** opérande immédiate $i *)
val reg: 'size register -> 'size operand
val (!%): 'size register -> 'size operand
(** registre *)
val ind: ?ofs:int -> ?index:'size1 register -> ?scale:int ->
'size2 register -> [>] operand
(** opérande indirecte ofs(register, index, scale) *)
val lab: label -> [>] operand
(** étiquette L *)
val ilab: label -> [`Q] operand
(** étiquette immédiate $L *)
(** {1 Instructions } *)
(** {2 Transfert } *)
val movb: [`B] operand -> [`B] operand -> text
val movw: [`W] operand -> [`W] operand -> text
val movl: [`L] operand -> [`L] operand -> text
val movq: [`Q] operand -> [`Q] operand -> text
(** attention : toutes les combinaisons d'opérandes ne sont pas permises *)
val movsbw: [`B] operand -> [`W] register -> text
val movsbl: [`B] operand -> [`L] register -> text
val movsbq: [`B] operand -> [`Q] register -> text
val movswl: [`W] operand -> [`L] register -> text
val movswq: [`W] operand -> [`Q] register -> text
val movslq: [`L] operand -> [`Q] register -> text
(** 8->64 bit, avec extension de signe *)
val movzbw: [`B] operand -> [`W] register -> text
val movzbl: [`B] operand -> [`L] register -> text
val movzbq: [`B] operand -> [`Q] register -> text
val movzwl: [`W] operand -> [`L] register -> text
val movzwq: [`W] operand -> [`Q] register -> text
(** 8->64 bit, avec extension par zéro *)
val movabsq: int64 -> [`Q] register -> text
(** copie une valeur immédiate 64 bits dans un registre *)
(** {2 Arithmétique } *)
val leab: [`B] operand -> [`B] register -> text
val leaw: [`W] operand -> [`W] register -> text
val leal: [`L] operand -> [`L] register -> text
val leaq: [`Q] operand -> [`Q] register -> text
val incb: [`B] operand -> text
val incw: [`W] operand -> text
val incl: [`L] operand -> text
val incq: [`Q] operand -> text
val decb: [`B] operand -> text
val decw: [`W] operand -> text
val decl: [`L] operand -> text
val decq: [`Q] operand -> text
val negb: [`B] operand -> text
val negw: [`W] operand -> text
val negl: [`L] operand -> text
val negq: [`Q] operand -> text
val addb: [`B] operand -> [`B] operand -> text
val addw: [`W] operand -> [`W] operand -> text
val addl: [`L] operand -> [`L] operand -> text
val addq: [`Q] operand -> [`Q] operand -> text
val subb: [`B] operand -> [`B] operand -> text
val subw: [`W] operand -> [`W] operand -> text
val subl: [`L] operand -> [`L] operand -> text
val subq: [`Q] operand -> [`Q] operand -> text
val imulw: [`W] operand -> [`W] operand -> text
val imull: [`L] operand -> [`L] operand -> text
val imulq: [`Q] operand -> [`Q] operand -> text
val idivq: [`Q] operand -> text
val cqto: text
(** {2 Opérations logiques } *)
val notb: [`B] operand -> text
val notw: [`W] operand -> text
val notl: [`L] operand -> text
val notq: [`Q] operand -> text
val andb: [`B] operand -> [`B] operand -> text
val andw: [`W] operand -> [`W] operand -> text
val andl: [`L] operand -> [`L] operand -> text
val andq: [`Q] operand -> [`Q] operand -> text
val orb : [`B] operand -> [`B] operand -> text
val orw : [`W] operand -> [`W] operand -> text
val orl : [`L] operand -> [`L] operand -> text
val orq : [`Q] operand -> [`Q] operand -> text
val xorb: [`B] operand -> [`B] operand -> text
val xorw: [`W] operand -> [`W] operand -> text
val xorl: [`L] operand -> [`L] operand -> text
val xorq: [`Q] operand -> [`Q] operand -> text
(** Opérations de manipulation de bits. "et" bit à bit, "ou" bit à
bit, "not" bit à bit *)
(** {2 Décalages } *)
val shlb: [`B] operand -> [`B] operand -> text
val shlw: [`W] operand -> [`W] operand -> text
val shll: [`L] operand -> [`L] operand -> text
val shlq: [`Q] operand -> [`Q] operand -> text
(** note: shl est la même chose que sal *)
val shrb: [`B] operand -> [`B] operand -> text
val shrw: [`W] operand -> [`W] operand -> text
val shrl: [`L] operand -> [`L] operand -> text
val shrq: [`Q] operand -> [`Q] operand -> text
val sarb: [`B] operand -> [`B] operand -> text
val sarw: [`W] operand -> [`W] operand -> text
val sarl: [`L] operand -> [`L] operand -> text
val sarq: [`Q] operand -> [`Q] operand -> text
(** {2 Sauts } *)
val call: label -> text
val call_star: [`Q] operand -> text
val leave: text
val ret: text
(** appel de fonction et retour *)
val jmp : label -> text
(** saut inconditionnel *)
val jmp_star: [`Q] operand -> text
(** saut à une adresse calculée *)
val je : label -> text (* = 0 *)
val jz : label -> text (* = 0 *)
val jne: label -> text (* <> 0 *)
val jnz: label -> text (* <> 0 *)
val js : label -> text (* < 0 *)
val jns: label -> text (* >= 0 *)
val jg : label -> text (* > signé *)
val jge: label -> text (* >= signé *)
val jl : label -> text (* < signé *)
val jle: label -> text (* <= signé *)
val ja : label -> text (* > non signé *)
val jae: label -> text (* >= non signé *)
val jb : label -> text (* < non signé *)
val jbe: label -> text (* <= non signé *)
(** sauts conditionnels *)
(** {2 Conditions } *)
val cmpb: [`B] operand -> [`B] operand -> text
val cmpw: [`W] operand -> [`W] operand -> text
val cmpl: [`L] operand -> [`L] operand -> text
val cmpq: [`Q] operand -> [`Q] operand -> text
val testb: [`B] operand -> [`B] operand -> text
val testw: [`W] operand -> [`W] operand -> text
val testl: [`L] operand -> [`L] operand -> text
val testq: [`Q] operand -> [`Q] operand -> text
val sete : [`B] operand -> text (* = 0 *)
val setne: [`B] operand -> text (* <> 0 *)
val sets : [`B] operand -> text (* < 0 *)
val setns: [`B] operand -> text (* >= 0 *)
val setg : [`B] operand -> text (* > signé *)
val setge: [`B] operand -> text (* >= signé *)
val setl : [`B] operand -> text (* < signé *)
val setle: [`B] operand -> text (* <= signé *)
val seta : [`B] operand -> text (* > non signé *)
val setae: [`B] operand -> text (* >= non signé *)
val setb : [`B] operand -> text (* < non signé *)
val setbe: [`B] operand -> text (* <= non signé *)
(** positionne l'octet opérande à 1 ou 0 selon que le test est vrai ou non *)
(** {2 Manipulation de la pile} *)
val pushq : [`Q] operand -> text
(** [pushq r] place le contenu de [r] au sommet de la pile.
Rappel : %rsp pointe sur l'adresse de la dernière case occupée *)
val popq : [`Q] register -> text
(** [popq r] place le mot en sommet de pile dans [r] et dépile *)
(** {2 Divers } *)
val label : label -> [> ] asm
(** un label. Peut se retrouver dans du text ou du data *)
val globl : label -> [> ] asm
(** déclaration .globl (pour main, typiquement) *)
val comment : string -> [> ] asm
(** place un commentaire dans le code généré. Peut se retrouver dans
du text ou du data *)
(** {2 Données } *)
val string : string -> data
(** une constante chaîne de caractères (terminée par 0) *)
val dbyte : int list -> data
val dword : int list -> data
val dint : int list -> data
val dquad : int list -> data
(** place une liste de valeurs sur 1/2/4/8 octets dans la zone data *)
val address: label list -> data
(** place une liste d'adresses dans la zone data (avec .quad) *)
val space: int -> data
(** [space n] alloue [n] octets (valant 0) dans le segment de données *)