-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathoutput.asm
262 lines (243 loc) · 7.3 KB
/
output.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
section .data
nc_int_var_a: dd 0
nc_int_var_b: dd 0
nc_int_var_c: dd 0
_const__nc_assign_1: dd 0
_const__nc_assign_2: dd 2
_const__nc_assign_3: dd 2
_const__nc_assign_4: dd 69
_const_print_5: db '', 10, 0
_const_print_5_LEN: equ $-_const_print_5
_const_print_7: db ' + ', 0
_const_print_7_LEN: equ $-_const_print_7
_const_print_8: db ' = ', 0
_const_print_8_LEN: equ $-_const_print_8
_const_print_9: db '', 10, 0
_const_print_9_LEN: equ $-_const_print_9
_const_print_10: db '', 10, 0
_const_print_10_LEN: equ $-_const_print_10
nc_mod_int2ascii_org: dd 0
nc_mod_int2ascii_num: dd 0
nc_mod_int2ascii_buf: times 1024 db 0, 0
nc_mod_int2ascii_chars: db '0123456789', 0
nc_mod_int2ascii_chars_LEN: equ $-nc_mod_int2ascii_chars
nc_mod_int2ascii_strLen: dd 0
nc_mod_int2ascii_strSz: dd 0
nc_mod_int2ascii_highestExp: dd 0
nc_mod_int2ascii_highestPow: dd 1
nc_mod_int2ascii_subs: dd 0
nc_mod_int2ascii_steps: dd 0
section .text
global _start
_start:
mov eax, [_const__nc_assign_1]
mov [nc_int_var_a], eax
mov eax, [nc_int_var_a]
mov [nc_mod_int2ascii_org], eax
mov [nc_mod_int2ascii_num], eax
call nc_mod_int2ascii_fnc_start
mov eax, 4
mov ebx, 1
int 80h
mov eax, [_const__nc_assign_2]
mov [nc_int_var_a], eax
mov eax, [_const__nc_assign_3]
mov [nc_int_var_b], eax
mov eax, [_const__nc_assign_4]
mov [nc_int_var_c], eax
mov ecx, _const_print_5
mov edx, _const_print_5_LEN
mov eax, 4
mov ebx, 1
int 80h
mov eax, [nc_int_var_a]
mov ebx, [nc_int_var_b]
add eax, ebx
mov [nc_int_var_c], eax
mov eax, [nc_int_var_a]
mov [nc_mod_int2ascii_org], eax
mov [nc_mod_int2ascii_num], eax
call nc_mod_int2ascii_fnc_start
mov eax, 4
mov ebx, 1
int 80h
mov ecx, _const_print_7
mov edx, _const_print_7_LEN
mov eax, 4
mov ebx, 1
int 80h
mov eax, [nc_int_var_b]
mov [nc_mod_int2ascii_org], eax
mov [nc_mod_int2ascii_num], eax
call nc_mod_int2ascii_fnc_start
mov eax, 4
mov ebx, 1
int 80h
mov ecx, _const_print_8
mov edx, _const_print_8_LEN
mov eax, 4
mov ebx, 1
int 80h
mov eax, [nc_int_var_c]
mov [nc_mod_int2ascii_org], eax
mov [nc_mod_int2ascii_num], eax
call nc_mod_int2ascii_fnc_start
mov eax, 4
mov ebx, 1
int 80h
mov ecx, _const_print_9
mov edx, _const_print_9_LEN
mov eax, 4
mov ebx, 1
int 80h
mov eax, [nc_int_var_c]
mov [nc_mod_int2ascii_org], eax
mov [nc_mod_int2ascii_num], eax
call nc_mod_int2ascii_fnc_start
mov eax, 4
mov ebx, 1
int 80h
mov ecx, _const_print_10
mov edx, _const_print_10_LEN
mov eax, 4
mov ebx, 1
int 80h
mov eax, 1
mov ebx, 0
int 80h
; This is an integer-to-ASCII conversion module for the Not-C compiler.
; Use the attached Python script to include it in the program.
nc_mod_int2ascii_fnc_start:
xor eax, eax ; Reset values as needed
cmp [nc_mod_int2ascii_num], eax ; check if number is zero and return immediately if so
jne nc_mod_int2ascii_fnc_algorithm
mov ebx, '0'
mov [nc_mod_int2ascii_buf], ebx
mov ecx, nc_mod_int2ascii_buf
mov edx, 1
xor ebx, ebx
ret
nc_mod_int2ascii_fnc_algorithm:
mov [nc_mod_int2ascii_subs], eax
mov [nc_mod_int2ascii_steps], eax
mov [nc_mod_int2ascii_strSz], eax
mov [nc_mod_int2ascii_strLen], eax
mov [nc_mod_int2ascii_highestExp], eax
inc eax
mov [nc_mod_int2ascii_highestPow], eax
nc_mod_int2ascii_fnc_mainLoop: ; while number != 0
mov ecx, [nc_mod_int2ascii_num] ; check loop condition
mov eax, 0
cmp ecx, eax
je nc_mod_int2ascii_fnc_result
nc_mod_int2ascii_fnc_findHighestPow:
xor eax, eax
mov [nc_mod_int2ascii_highestExp], eax ; resets exponent to be 0
inc eax
mov [nc_mod_int2ascii_highestPow], eax ; resets power to be 1
dec eax ; resets eax to be 0 for the loop
nc_mod_int2ascii_fnc_powFindLoop: ; while 10**highestPow <= number
mov ecx, [nc_mod_int2ascii_num]
mov ebx, [nc_mod_int2ascii_highestPow] ; check loop condition
cmp ebx, ecx
ja nc_mod_int2ascii_fnc_powFindExit
mov eax, 10
imul ebx
mov [nc_mod_int2ascii_highestPow], eax
mov eax, 1
mov ebx, [nc_mod_int2ascii_highestExp]
inc ebx
mov [nc_mod_int2ascii_highestExp], ebx
jmp nc_mod_int2ascii_fnc_powFindLoop
nc_mod_int2ascii_fnc_powFindExit:
mov edx, 0
cmp [nc_mod_int2ascii_strSz], edx ; if strSz == 0 then assign a size
jne nc_mod_int2ascii_fnc_powFindAlign
mov edx, [nc_mod_int2ascii_highestExp]
mov [nc_mod_int2ascii_strSz], edx
xor edx, edx
nc_mod_int2ascii_fnc_powFindAlign:
mov ebx, 10
mov eax, [nc_mod_int2ascii_highestPow]
cdq
idiv ebx
mov [nc_mod_int2ascii_highestPow], eax
mov eax, [nc_mod_int2ascii_highestExp]
dec eax
mov [nc_mod_int2ascii_highestExp], eax ; highestExp -= 1
xor eax, eax
mov [nc_mod_int2ascii_subs], eax; set subs = 0
nc_mod_int2ascii_fnc_convertLoop: ; while True
mov eax, [nc_mod_int2ascii_num]
mov ebx, [nc_mod_int2ascii_highestPow]
nc_mod_int2ascii_fnc_convertBuild:
cmp eax, ebx; if number < 10**highestExp
jge nc_mod_int2ascii_fnc_convertRoot
mov eax, [nc_mod_int2ascii_subs]
mov ebx, [nc_mod_int2ascii_strLen]
mov edx, [nc_mod_int2ascii_chars+eax]
mov [nc_mod_int2ascii_buf+ebx], edx ; finalStr = finalStr + chars[subs]
inc ebx
mov [nc_mod_int2ascii_strLen], ebx
xor eax, eax
mov [nc_mod_int2ascii_steps], eax ; steps = 0
nc_mod_int2ascii_fnc_convertBuildLoop1:
mov ebx, 10
xor eax, eax
xor edx, edx
mov eax, [nc_mod_int2ascii_highestPow]
nc_mod_int2ascii_fnc_cbl1Div:
cdq
idiv ebx
mov ebx, [nc_mod_int2ascii_num]
cmp ebx, eax ; while number < 10**highestPow-1
jge nc_mod_int2ascii_fnc_convertBuildLoop2Pre
nc_mod_int2ascii_fnc_cbl1Inc:
mov eax, [nc_mod_int2ascii_steps]
inc eax
mov [nc_mod_int2ascii_steps], eax
mov eax, [nc_mod_int2ascii_highestExp]
nc_mod_int2ascii_fnc_cbl1Dec:
dec eax
mov [nc_mod_int2ascii_highestExp], eax
mov eax, [nc_mod_int2ascii_highestPow]
mov ebx, 10
cdq
idiv ebx
mov [nc_mod_int2ascii_highestPow], eax
jmp nc_mod_int2ascii_fnc_convertBuildLoop1
nc_mod_int2ascii_fnc_convertBuildLoop2Pre:
xor ecx, ecx
nc_mod_int2ascii_fnc_convertBuildLoop2:
mov eax, [nc_mod_int2ascii_steps]
dec eax
cmp ecx, eax ; check 1 <= s < steps-1
jg nc_mod_int2ascii_fnc_convertLoopExit
mov eax, '0'
mov edx, [nc_mod_int2ascii_strLen]
mov [nc_mod_int2ascii_buf+edx], eax
inc edx
mov [nc_mod_int2ascii_strLen], edx
mov edx, [nc_mod_int2ascii_steps]
dec edx
dec edx
cmp ecx, edx; if s >= steps - 2
jl nc_mod_int2ascii_fnc_convertBuildLoop2Post
nc_mod_int2ascii_fnc_convertBuildLoop2Post:
inc ecx ; s += 1
jmp nc_mod_int2ascii_fnc_convertBuildLoop2
nc_mod_int2ascii_fnc_convertLoopExit:
jmp nc_mod_int2ascii_fnc_mainLoop
nc_mod_int2ascii_fnc_convertRoot: ; number -= 10**highestExp
mov eax, [nc_mod_int2ascii_num]
mov ebx, [nc_mod_int2ascii_highestPow]
sub eax, ebx
mov [nc_mod_int2ascii_num], eax
mov eax, [nc_mod_int2ascii_subs] ; subs += 1
inc eax
mov [nc_mod_int2ascii_subs], eax
jmp nc_mod_int2ascii_fnc_convertLoop
nc_mod_int2ascii_fnc_result:
mov ecx, nc_mod_int2ascii_buf
mov edx, [nc_mod_int2ascii_strLen]
ret