Skip to content

Commit 7287556

Browse files
committed
code optimization added
1 parent 7b2c0c2 commit 7287556

File tree

5 files changed

+366
-4
lines changed

5 files changed

+366
-4
lines changed

demo.py

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,56 @@
1-
import subprocess
2-
subprocess.check_output(["./a.out", "input.c"])
1+
2+
def optimizeCode():
3+
4+
with open('code.asm', 'r') as readFile:
5+
with open('opt_new.asm', 'w') as writeFile:
6+
line_v = readFile.readlines()
7+
prev_line_token = []
8+
prevLineCmd = ""
9+
10+
for i in range(0, len(line_v)):
11+
# print(line_v[i])
12+
curLine = line_v[i]
13+
curLine = curLine.replace('\n', '')
14+
cur_line_token = []
15+
16+
if len(curLine) == 0:
17+
continue
18+
19+
if curLine[0] == ';':
20+
writeFile.write(curLine+'\n')
21+
continue
22+
23+
token_v = curLine.split(' ')
24+
# print(token_v)
25+
26+
if token_v[0] == "MOV":
27+
if token_v[1] == "WORD":
28+
cur_line_token = token_v[3].split(',')
29+
else:
30+
cur_line_token = token_v[1].split(',')
31+
32+
if prevLineCmd == "MOV":
33+
if i > 0:
34+
if cur_line_token[0] == prev_line_token[1] and cur_line_token[1] == prev_line_token[0]:
35+
# do nothing
36+
continue
37+
else:
38+
writeFile.write(curLine+'\n')
39+
else:
40+
writeFile.write(curLine+'\n')
41+
else:
42+
writeFile.write(curLine+'\n')
43+
44+
prev_line_token = cur_line_token
45+
else:
46+
sz_token_v = len(token_v)
47+
if sz_token_v >= 2:
48+
if token_v[1] == "PROC":
49+
writeFile.write('\n')
50+
51+
writeFile.write(curLine+'\n')
52+
prev_line_token = []
53+
prevLineCmd = token_v[0]
54+
55+
56+
optimizeCode()

images/CI_pass.png

56.8 KB
Loading

input.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
int main(){
1+
int main(){
22

33
int i,j,k,l,m,n,o,p;
44

opt_new.asm

Lines changed: 248 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,248 @@
1+
.MODEL SMALL
2+
.STACK 100H
3+
.DATA
4+
IS_NEG DB ?
5+
FOR_PRINT DW ?
6+
CR EQU 0DH
7+
LF EQU 0AH
8+
NEWLINE DB CR, LF , '$'
9+
.CODE
10+
11+
OUTPUT PROC
12+
13+
MOV CX , 0FH
14+
PUSH CX ; marker
15+
16+
MOV IS_NEG, 0H
17+
MOV AX , FOR_PRINT
18+
TEST AX , 8000H
19+
JE OUTPUT_LOOP
20+
21+
MOV IS_NEG, 1H
22+
MOV AX , 0FFFFH
23+
SUB AX , FOR_PRINT
24+
ADD AX , 1H
25+
MOV FOR_PRINT , AX
26+
OUTPUT_LOOP:
27+
28+
;MOV AH, 1
29+
;INT 21H
30+
31+
MOV AX , FOR_PRINT
32+
XOR DX,DX
33+
MOV BX , 10D
34+
DIV BX ; QUOTIENT : AX , REMAINDER : DX
35+
36+
MOV FOR_PRINT , AX
37+
38+
PUSH DX
39+
40+
CMP AX , 0H
41+
JNE OUTPUT_LOOP
42+
43+
;LEA DX, NEWLINE ; DX : USED IN IO and MUL,DIV
44+
;MOV AH, 9 ; AH,9 used for character string output
45+
;INT 21H;
46+
MOV AL , IS_NEG
47+
CMP AL , 1H
48+
JNE OP_STACK_PRINT
49+
50+
MOV AH, 2
51+
MOV DX, '-' ; stored in DL for display
52+
INT 21H
53+
54+
55+
OP_STACK_PRINT:
56+
57+
;MOV AH, 1
58+
;INT 21H
59+
60+
POP BX
61+
62+
CMP BX , 0FH
63+
JE EXIT_OUTPUT
64+
65+
66+
MOV AH, 2
67+
MOV DX, BX ; stored in DL for display
68+
ADD DX , 30H
69+
INT 21H
70+
71+
JMP OP_STACK_PRINT
72+
EXIT_OUTPUT:
73+
74+
;POP CX
75+
LEA DX, NEWLINE
76+
MOV AH, 9
77+
INT 21H
78+
79+
RET
80+
81+
OUTPUT ENDP
82+
83+
main PROC
84+
MOV AX, @DATA
85+
MOV DS, AX
86+
PUSH BP
87+
MOV BP,SP
88+
SUB SP,60
89+
; i=1;
90+
MOV WORD PTR [bp-18],1
91+
MOV CX,[bp-18]
92+
MOV WORD PTR [bp-2],CX
93+
; printf(i);
94+
MOV AX,[bp-2]
95+
MOV FOR_PRINT,AX
96+
CALL OUTPUT
97+
; j=5+8;
98+
MOV WORD PTR [bp-20],5
99+
MOV AX,[bp-20]
100+
MOV WORD PTR [bp-24],AX
101+
MOV WORD PTR [bp-22],8
102+
MOV AX,[bp-24]
103+
ADD AX,[bp-22]
104+
MOV WORD PTR [bp-26],AX
105+
MOV CX,[bp-26]
106+
MOV WORD PTR [bp-4],CX
107+
; printf(j);
108+
MOV AX,[bp-4]
109+
MOV FOR_PRINT,AX
110+
CALL OUTPUT
111+
; k=i+2*j;
112+
MOV AX,[bp-2]
113+
MOV WORD PTR [bp-34],AX
114+
MOV WORD PTR [bp-28],2
115+
MOV CX,[bp-28]
116+
MOV WORD PTR [bp-30],CX
117+
MOV AX,CX
118+
IMUL WORD PTR [bp-4]
119+
MOV WORD PTR [bp-32],AX
120+
MOV AX,[bp-34]
121+
ADD AX,[bp-32]
122+
MOV WORD PTR [bp-36],AX
123+
MOV CX,[bp-36]
124+
MOV WORD PTR [bp-6],CX
125+
; printf(k);
126+
MOV AX,[bp-6]
127+
MOV FOR_PRINT,AX
128+
CALL OUTPUT
129+
; l=k/3;
130+
MOV CX,[bp-6]
131+
CWD
132+
MOV WORD PTR [bp-40],CX
133+
MOV WORD PTR [bp-38],3
134+
MOV CX,[bp-40]
135+
MOV AX,CX
136+
IDIV WORD PTR [bp-38]
137+
MOV WORD PTR [bp-42],AX
138+
MOV CX,[bp-42]
139+
MOV WORD PTR [bp-8],CX
140+
; printf(l);
141+
MOV AX,[bp-8]
142+
MOV FOR_PRINT,AX
143+
CALL OUTPUT
144+
; m=k%9;
145+
MOV CX,[bp-6]
146+
CWD
147+
MOV WORD PTR [bp-46],CX
148+
MOV WORD PTR [bp-44],9
149+
MOV CX,[bp-46]
150+
MOV AX,CX
151+
IDIV WORD PTR [bp-44]
152+
MOV WORD PTR [bp-48],DX
153+
MOV CX,[bp-48]
154+
MOV WORD PTR [bp-10],CX
155+
; printf(m);
156+
MOV AX,[bp-10]
157+
MOV FOR_PRINT,AX
158+
CALL OUTPUT
159+
; n=m<=l;
160+
MOV AX,[bp-10]
161+
CMP AX,[bp-8]
162+
jle L0
163+
MOV WORD PTR [bp-50],0
164+
JMP L1
165+
L0:
166+
MOV WORD PTR [bp-50],1
167+
L1:
168+
MOV CX,[bp-50]
169+
MOV WORD PTR [bp-12],CX
170+
; printf(n);
171+
MOV AX,[bp-12]
172+
MOV FOR_PRINT,AX
173+
CALL OUTPUT
174+
; o=i!=j;
175+
MOV AX,[bp-2]
176+
CMP AX,[bp-4]
177+
jne L2
178+
MOV WORD PTR [bp-52],0
179+
JMP L3
180+
L2:
181+
MOV WORD PTR [bp-52],1
182+
L3:
183+
MOV CX,[bp-52]
184+
MOV WORD PTR [bp-14],CX
185+
; printf(o);
186+
MOV AX,[bp-14]
187+
MOV FOR_PRINT,AX
188+
CALL OUTPUT
189+
; p=n||o;
190+
CMP [bp-12],0
191+
JNE L4
192+
CMP [bp-14],0
193+
JNE L4
194+
MOV WORD PTR [bp-54],0
195+
JMP L5
196+
L4:
197+
MOV WORD PTR [bp-54],1
198+
L5:
199+
MOV CX,[bp-54]
200+
MOV WORD PTR [bp-16],CX
201+
; printf(p);
202+
MOV AX,[bp-16]
203+
MOV FOR_PRINT,AX
204+
CALL OUTPUT
205+
; p=n&&o;
206+
CMP [bp-12],0
207+
JE L6
208+
CMP [bp-14],0
209+
JE L6
210+
MOV WORD PTR [bp-56],1
211+
JMP L7
212+
L6:
213+
MOV WORD PTR [bp-56],0
214+
L7:
215+
MOV CX,[bp-56]
216+
MOV WORD PTR [bp-16],CX
217+
; printf(p);
218+
MOV AX,[bp-16]
219+
MOV FOR_PRINT,AX
220+
CALL OUTPUT
221+
; p++;
222+
MOV AX,[bp-16]
223+
MOV WORD PTR [bp-58],AX
224+
INC WORD PTR [bp-16]
225+
; printf(p);
226+
MOV AX,[bp-16]
227+
MOV FOR_PRINT,AX
228+
CALL OUTPUT
229+
; k=-p;
230+
NEG WORD PTR [bp-16]
231+
MOV CX,[bp-16]
232+
MOV WORD PTR [bp-6],CX
233+
; printf(k);
234+
MOV AX,[bp-6]
235+
MOV FOR_PRINT,AX
236+
CALL OUTPUT
237+
; return 0;
238+
MOV WORD PTR [bp-60],0
239+
MOV AX,[bp-60]
240+
JMP L_main
241+
L_main:
242+
ADD SP,60
243+
POP BP
244+
;DOS EXIT
245+
MOV AH,4ch
246+
INT 21h
247+
main ENDP
248+
END MAIN

optimizer/views.py

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ def index(request):
1111
in_code = request.POST.get('in_code')
1212
writeOutputNormal(in_code)
1313

14-
with open('code.asm', 'r') as file:
14+
optimizeCodeFromFile('code.asm')
15+
16+
with open('opt_new.asm', 'r') as file:
1517
data = file.read().replace('\n', '\n')
1618
out_code = data
1719
# print("Here : ",in_code)
@@ -27,3 +29,61 @@ def writeOutputNormal(in_code):
2729
f.write(in_code)
2830

2931
subprocess.check_output(["./a.out", "input.c"])
32+
33+
34+
def optimizeCodeFromFile(fileName):
35+
with open(fileName, 'r') as readFile:
36+
line_v = readFile.readlines()
37+
optimizeCode(line_v)
38+
39+
40+
def optimizeCode(line_v):
41+
with open('opt_new.asm', 'w') as writeFile:
42+
# line_v = readFile.readlines()
43+
prev_line_token = []
44+
prevLineCmd = ""
45+
46+
for i in range(0, len(line_v)):
47+
# print(line_v[i])
48+
curLine = line_v[i]
49+
curLine = curLine.replace('\n', '')
50+
cur_line_token = []
51+
52+
if len(curLine) == 0:
53+
continue
54+
55+
if curLine[0] == ';':
56+
writeFile.write(curLine+'\n')
57+
continue
58+
59+
token_v = curLine.split(' ')
60+
# print(token_v)
61+
62+
if token_v[0] == "MOV":
63+
if token_v[1] == "WORD":
64+
cur_line_token = token_v[3].split(',')
65+
else:
66+
cur_line_token = token_v[1].split(',')
67+
68+
if prevLineCmd == "MOV":
69+
if i > 0:
70+
if cur_line_token[0] == prev_line_token[1] and cur_line_token[1] == prev_line_token[0]:
71+
# do nothing
72+
continue
73+
else:
74+
writeFile.write(curLine+'\n')
75+
else:
76+
writeFile.write(curLine+'\n')
77+
else:
78+
writeFile.write(curLine+'\n')
79+
80+
prev_line_token = cur_line_token
81+
else:
82+
sz_token_v = len(token_v)
83+
if sz_token_v >= 2:
84+
if token_v[1] == "PROC":
85+
writeFile.write('\n')
86+
87+
writeFile.write(curLine+'\n')
88+
prev_line_token = []
89+
prevLineCmd = token_v[0]

0 commit comments

Comments
 (0)