-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathout.asm
424 lines (395 loc) · 13.7 KB
/
out.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
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
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
%include "io64.inc"
common arr 32 ;Define global variable
section .data
_STR2: db "Comparing these numbers:",0 ;global string
_STR3: db "The maximum is",0 ;global string
_STR1: db "That's too many!",0 ;global string
_STR0: db "Enter a number",0 ;global string
section .text
global main
getinput: ;Start of function
;FUNCTION HEADER
mov r8, rsp ;get current RSP
add r8, -24 ;Adjust stack pointer according to function size
mov [r8], rbp ;Store old RBP in activation record
mov [r8+8], rsp ;Store old RSP in activation record
mov rsp, r8 ;Set new RSP
;FUNCTION BODY
;WRITE STRING STATEMENT
PRINT_STRING _STR0 ;Print string
NEWLINE
;READ STATEMENT
mov rax, 16 ;Get Variable offset for in
add rax, rsp ;Add offset to stack pointer
GET_DEC 8, [rax] ;Read in value
;WRITE STATEMENT
mov rax, 16 ;Get Variable offset for in
add rax, rsp ;Add offset to stack pointer
mov rsi, [rax] ;Load variable from memory
PRINT_DEC 8, rsi ;Write value to output
NEWLINE
;RETURN STATEMENT
mov rax, 16 ;Get Variable offset for in
add rax, rsp ;Add offset to stack pointer
mov rsi, [rax] ;Load variable from memory
mov rbp, [rsp] ;Restore old RBP
mov rsp,[rsp+8] ;Restore old RSP
ret ;return
;FUNCTION FOOTER
mov rbp, [rsp] ;Restore old RBP
mov rsp,[rsp+8] ;Restore old RSP
ret ;return
writearr: ;Start of function
;FUNCTION HEADER
mov r8, rsp ;get current RSP
add r8, -56 ;Adjust stack pointer according to function size
mov [r8], rbp ;Store old RBP in activation record
mov [r8+8], rsp ;Store old RSP in activation record
mov rsp, r8 ;Set new RSP
;FUNCTION BODY
;EXPR_STMT
;ASSIGNMENT EXPRESSION
mov rsi, 0 ;"evaluate" integer literal (NUM_EXPR)
mov [rsp+24], rsi ;Save assignment RHS to temp variable
mov rax, 16 ;Get Variable offset for i
add rax, rsp ;Add offset to stack pointer
mov rbx, [rsp+24] ;Load temp variable into RBX
mov [rax], rbx ;Save to LHS
mov rsi, rbx ;copy to rsi
;LOOP STATEMENT
loop0: nop
;EXPRESSION (<)
mov rsi, 4 ;"evaluate" integer literal (NUM_EXPR)
mov [rsp+32], rsi ;Save Expression RHS to temp variable
mov rax, 16 ;Get Variable offset for i
add rax, rsp ;Add offset to stack pointer
mov rsi, [rax] ;Load variable from memory
mov rax, rsi ;copy RSI to RAX
mov rbx, [rsp+32] ;Load temp variable into RBX
cmp rax, rbx ;Compare RAX and RBX
setl al ;Get Less than flag
and rax, 1 ;mask RAX to first bit
mov [rsp+32], rax ;Save expression result to temp variable
mov rsi, rax ;Save expression result to RSI
cmp rsi, 0 ;do comparison
je end1 ;If FALSE, jump to loop end
;BLOCK STATEMENT
;WRITE STATEMENT
;ARRAY ACCESS
mov rax, 16 ;Get Variable offset for i
add rax, rsp ;Add offset to stack pointer
mov rsi, [rax] ;Load variable from memory
mov rbx, rsi ;store offset value in RBX
shl rbx, 3 ;Shift array offset
mov rax, arr ;Get global variable address
add rax, rbx ;Add array offset
mov rsi, [rax] ;Load variable from memory
PRINT_DEC 8, rsi ;Write value to output
NEWLINE
;EXPR_STMT
;ASSIGNMENT EXPRESSION
;EXPRESSION (+)
mov rsi, 1 ;"evaluate" integer literal (NUM_EXPR)
mov [rsp+40], rsi ;Save Expression RHS to temp variable
mov rax, 16 ;Get Variable offset for i
add rax, rsp ;Add offset to stack pointer
mov rsi, [rax] ;Load variable from memory
mov rax, rsi ;copy RSI to RAX
mov rbx, [rsp+40] ;Load temp variable into RBX
add rax, rbx ;perform addition
mov [rsp+40], rax ;Save expression result to temp variable
mov rsi, rax ;Save expression result to RSI
mov [rsp+48], rsi ;Save assignment RHS to temp variable
mov rax, 16 ;Get Variable offset for i
add rax, rsp ;Add offset to stack pointer
mov rbx, [rsp+48] ;Load temp variable into RBX
mov [rax], rbx ;Save to LHS
mov rsi, rbx ;copy to rsi
jmp loop0 ;Jump to loop start
end1: nop
;FUNCTION FOOTER
mov rbp, [rsp] ;Restore old RBP
mov rsp,[rsp+8] ;Restore old RSP
ret ;return
insert: ;Start of function
;FUNCTION HEADER
mov r8, rsp ;get current RSP
add r8, -48 ;Adjust stack pointer according to function size
mov [r8], rbp ;Store old RBP in activation record
mov [r8+8], rsp ;Store old RSP in activation record
mov rsp, r8 ;Set new RSP
;FUNCTION BODY
;IF STATEMENT
;EXPRESSION (>)
mov rsi, 3 ;"evaluate" integer literal (NUM_EXPR)
mov [rsp+32], rsi ;Save Expression RHS to temp variable
mov rax, 24 ;Get Variable offset for index
add rax, rsp ;Add offset to stack pointer
mov rsi, [rax] ;Load variable from memory
mov rax, rsi ;copy RSI to RAX
mov rbx, [rsp+32] ;Load temp variable into RBX
cmp rax, rbx ;Compare RAX and RBX
setg al ;Get Greater Than flag
and rax, 1 ;mask RAX to first bit
mov [rsp+32], rax ;Save expression result to temp variable
mov rsi, rax ;Save expression result to RSI
cmp rsi, 0 ;do comparison
je else2 ;If FALSE, jump to else
;WRITE STRING STATEMENT
PRINT_STRING _STR1 ;Print string
NEWLINE
jmp endif3 ;Jump to endif
else2: nop
;EXPR_STMT
;ASSIGNMENT EXPRESSION
mov rax, 16 ;Get Variable offset for value
add rax, rsp ;Add offset to stack pointer
mov rsi, [rax] ;Load variable from memory
mov [rsp+40], rsi ;Save assignment RHS to temp variable
;ARRAY ACCESS
mov rax, 24 ;Get Variable offset for index
add rax, rsp ;Add offset to stack pointer
mov rsi, [rax] ;Load variable from memory
mov rbx, rsi ;store offset value in RBX
shl rbx, 3 ;Shift array offset
mov rax, arr ;Get global variable address
add rax, rbx ;Add array offset
mov rbx, [rsp+40] ;Load temp variable into RBX
mov [rax], rbx ;Save to LHS
mov rsi, rbx ;copy to rsi
endif3: nop
;FUNCTION FOOTER
mov rbp, [rsp] ;Restore old RBP
mov rsp,[rsp+8] ;Restore old RSP
ret ;return
getmax: ;Start of function
;FUNCTION HEADER
mov r8, rsp ;get current RSP
add r8, -88 ;Adjust stack pointer according to function size
mov [r8], rbp ;Store old RBP in activation record
mov [r8+8], rsp ;Store old RSP in activation record
mov rsp, r8 ;Set new RSP
;FUNCTION BODY
;EXPR_STMT
;ASSIGNMENT EXPRESSION
;ARRAY ACCESS
mov rsi, 0 ;"evaluate" integer literal (NUM_EXPR)
mov rbx, rsi ;store offset value in RBX
shl rbx, 3 ;Shift array offset
mov rax, arr ;Get global variable address
add rax, rbx ;Add array offset
mov rsi, [rax] ;Load variable from memory
mov [rsp+32], rsi ;Save assignment RHS to temp variable
mov rax, 16 ;Get Variable offset for max
add rax, rsp ;Add offset to stack pointer
mov rbx, [rsp+32] ;Load temp variable into RBX
mov [rax], rbx ;Save to LHS
mov rsi, rbx ;copy to rsi
;EXPR_STMT
;ASSIGNMENT EXPRESSION
mov rsi, 0 ;"evaluate" integer literal (NUM_EXPR)
mov [rsp+40], rsi ;Save assignment RHS to temp variable
mov rax, 24 ;Get Variable offset for i
add rax, rsp ;Add offset to stack pointer
mov rbx, [rsp+40] ;Load temp variable into RBX
mov [rax], rbx ;Save to LHS
mov rsi, rbx ;copy to rsi
;LOOP STATEMENT
loop4: nop
;EXPRESSION (<)
mov rsi, 4 ;"evaluate" integer literal (NUM_EXPR)
mov [rsp+48], rsi ;Save Expression RHS to temp variable
mov rax, 24 ;Get Variable offset for i
add rax, rsp ;Add offset to stack pointer
mov rsi, [rax] ;Load variable from memory
mov rax, rsi ;copy RSI to RAX
mov rbx, [rsp+48] ;Load temp variable into RBX
cmp rax, rbx ;Compare RAX and RBX
setl al ;Get Less than flag
and rax, 1 ;mask RAX to first bit
mov [rsp+48], rax ;Save expression result to temp variable
mov rsi, rax ;Save expression result to RSI
cmp rsi, 0 ;do comparison
je end5 ;If FALSE, jump to loop end
;BLOCK STATEMENT
;IF STATEMENT
;EXPRESSION (>)
mov rax, 16 ;Get Variable offset for max
add rax, rsp ;Add offset to stack pointer
mov rsi, [rax] ;Load variable from memory
mov [rsp+56], rsi ;Save Expression RHS to temp variable
;ARRAY ACCESS
mov rax, 24 ;Get Variable offset for i
add rax, rsp ;Add offset to stack pointer
mov rsi, [rax] ;Load variable from memory
mov rbx, rsi ;store offset value in RBX
shl rbx, 3 ;Shift array offset
mov rax, arr ;Get global variable address
add rax, rbx ;Add array offset
mov rsi, [rax] ;Load variable from memory
mov rax, rsi ;copy RSI to RAX
mov rbx, [rsp+56] ;Load temp variable into RBX
cmp rax, rbx ;Compare RAX and RBX
setg al ;Get Greater Than flag
and rax, 1 ;mask RAX to first bit
mov [rsp+56], rax ;Save expression result to temp variable
mov rsi, rax ;Save expression result to RSI
cmp rsi, 0 ;do comparison
je else6 ;If FALSE, jump to else
;EXPR_STMT
;ASSIGNMENT EXPRESSION
;ARRAY ACCESS
mov rax, 24 ;Get Variable offset for i
add rax, rsp ;Add offset to stack pointer
mov rsi, [rax] ;Load variable from memory
mov rbx, rsi ;store offset value in RBX
shl rbx, 3 ;Shift array offset
mov rax, arr ;Get global variable address
add rax, rbx ;Add array offset
mov rsi, [rax] ;Load variable from memory
mov [rsp+64], rsi ;Save assignment RHS to temp variable
mov rax, 16 ;Get Variable offset for max
add rax, rsp ;Add offset to stack pointer
mov rbx, [rsp+64] ;Load temp variable into RBX
mov [rax], rbx ;Save to LHS
mov rsi, rbx ;copy to rsi
jmp endif7 ;Jump to endif
else6: nop
endif7: nop
;EXPR_STMT
;ASSIGNMENT EXPRESSION
;EXPRESSION (+)
mov rsi, 1 ;"evaluate" integer literal (NUM_EXPR)
mov [rsp+72], rsi ;Save Expression RHS to temp variable
mov rax, 24 ;Get Variable offset for i
add rax, rsp ;Add offset to stack pointer
mov rsi, [rax] ;Load variable from memory
mov rax, rsi ;copy RSI to RAX
mov rbx, [rsp+72] ;Load temp variable into RBX
add rax, rbx ;perform addition
mov [rsp+72], rax ;Save expression result to temp variable
mov rsi, rax ;Save expression result to RSI
mov [rsp+80], rsi ;Save assignment RHS to temp variable
mov rax, 24 ;Get Variable offset for i
add rax, rsp ;Add offset to stack pointer
mov rbx, [rsp+80] ;Load temp variable into RBX
mov [rax], rbx ;Save to LHS
mov rsi, rbx ;copy to rsi
jmp loop4 ;Jump to loop start
end5: nop
;RETURN STATEMENT
mov rax, 16 ;Get Variable offset for max
add rax, rsp ;Add offset to stack pointer
mov rsi, [rax] ;Load variable from memory
mov rbp, [rsp] ;Restore old RBP
mov rsp,[rsp+8] ;Restore old RSP
ret ;return
;FUNCTION FOOTER
mov rbp, [rsp] ;Restore old RBP
mov rsp,[rsp+8] ;Restore old RSP
ret ;return
main: ;Start of function
;FUNCTION HEADER
mov rbp, rsp ;set RBP to current RSP (MAIN ONLY)
mov r8, rsp ;get current RSP
add r8, -88 ;Adjust stack pointer according to function size
mov [r8], rbp ;Store old RBP in activation record
mov [r8+8], rsp ;Store old RSP in activation record
mov rsp, r8 ;Set new RSP
;FUNCTION BODY
;EXPR_STMT
;ASSIGNMENT EXPRESSION
mov rsi, 0 ;"evaluate" integer literal (NUM_EXPR)
mov [rsp+32], rsi ;Save assignment RHS to temp variable
mov rax, 16 ;Get Variable offset for i
add rax, rsp ;Add offset to stack pointer
mov rbx, [rsp+32] ;Load temp variable into RBX
mov [rax], rbx ;Save to LHS
mov rsi, rbx ;copy to rsi
;LOOP STATEMENT
loop8: nop
;EXPRESSION (<)
mov rsi, 5 ;"evaluate" integer literal (NUM_EXPR)
mov [rsp+40], rsi ;Save Expression RHS to temp variable
mov rax, 16 ;Get Variable offset for i
add rax, rsp ;Add offset to stack pointer
mov rsi, [rax] ;Load variable from memory
mov rax, rsi ;copy RSI to RAX
mov rbx, [rsp+40] ;Load temp variable into RBX
cmp rax, rbx ;Compare RAX and RBX
setl al ;Get Less than flag
and rax, 1 ;mask RAX to first bit
mov [rsp+40], rax ;Save expression result to temp variable
mov rsi, rax ;Save expression result to RSI
cmp rsi, 0 ;do comparison
je end9 ;If FALSE, jump to loop end
;BLOCK STATEMENT
;EXPR_STMT
;FUNCTION CALL (insert)
;FUNCTION CALL (getinput)
call getinput ;call function
mov [rsp+56], rsi ;save argument to temp variable
mov rax, 16 ;Get Variable offset for i
add rax, rsp ;Add offset to stack pointer
mov rsi, [rax] ;Load variable from memory
mov [rsp+48], rsi ;save argument to temp variable
mov rax, rsp ;get stack pointer
add rax, -40 ;get offset for parameter value
mov rbx, [rsp+56] ;get offset for arg temp variable
mov [rax], rbx ;save arg value
mov rax, rsp ;get stack pointer
add rax, -32 ;get offset for parameter value
mov rbx, [rsp+48] ;get offset for arg temp variable
mov [rax], rbx ;save arg value
call insert ;call function
;EXPR_STMT
;ASSIGNMENT EXPRESSION
;EXPRESSION (+)
mov rsi, 1 ;"evaluate" integer literal (NUM_EXPR)
mov [rsp+64], rsi ;Save Expression RHS to temp variable
mov rax, 16 ;Get Variable offset for i
add rax, rsp ;Add offset to stack pointer
mov rsi, [rax] ;Load variable from memory
mov rax, rsi ;copy RSI to RAX
mov rbx, [rsp+64] ;Load temp variable into RBX
add rax, rbx ;perform addition
mov [rsp+64], rax ;Save expression result to temp variable
mov rsi, rax ;Save expression result to RSI
mov [rsp+72], rsi ;Save assignment RHS to temp variable
mov rax, 16 ;Get Variable offset for i
add rax, rsp ;Add offset to stack pointer
mov rbx, [rsp+72] ;Load temp variable into RBX
mov [rax], rbx ;Save to LHS
mov rsi, rbx ;copy to rsi
jmp loop8 ;Jump to loop start
end9: nop
;WRITE STRING STATEMENT
PRINT_STRING _STR2 ;Print string
NEWLINE
;EXPR_STMT
;FUNCTION CALL (writearr)
call writearr ;call function
;EXPR_STMT
;ASSIGNMENT EXPRESSION
;FUNCTION CALL (getmax)
call getmax ;call function
mov [rsp+80], rsi ;Save assignment RHS to temp variable
mov rax, 24 ;Get Variable offset for m
add rax, rsp ;Add offset to stack pointer
mov rbx, [rsp+80] ;Load temp variable into RBX
mov [rax], rbx ;Save to LHS
mov rsi, rbx ;copy to rsi
;WRITE STRING STATEMENT
PRINT_STRING _STR3 ;Print string
NEWLINE
;WRITE STATEMENT
mov rax, 24 ;Get Variable offset for m
add rax, rsp ;Add offset to stack pointer
mov rsi, [rax] ;Load variable from memory
PRINT_DEC 8, rsi ;Write value to output
NEWLINE
;FUNCTION FOOTER
mov rbp, [rsp] ;Restore old RBP
mov rsp,[rsp+8] ;Restore old RSP
mov rsp, rbp ;RBP and RSP must be same when exiting MAIN
ret ;return