-
Notifications
You must be signed in to change notification settings - Fork 1
/
compile.sh
executable file
·161 lines (120 loc) · 3.7 KB
/
compile.sh
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
#!/bin/bash
###############################################################################
# Compile
# Compile script for C source files used in ARM Assembly Intro guide
# Each source file is compiled into ARM Assembly, using gcc, with one of
# four possible options
# 1. No optimization
# 2. O1 optimization
# 3. O2 optimization
# 4. O3 optimization
#
#
#
###############################################################################
###############################################################################
# Setup
###############################################################################
NASM=nasm
MASM=masm
FLAGS="-f bin"
ASSEMBLY_EXT=".asm"
OPT_S_EXTS=("$ASSEMBLY_EXT" "$O1_EXTENSION" "$O2_EXTENSION" "$O3_EXTENSION")
EXEC_EXT=".com"
OPT_EXTS=("$EXEC_EXT" "$O1_EXEC_EXTENSION" "$O2_EXEC_EXTENSION" "$O3_EXEC_EXTENSION")
###############################################################################
# Cleanup old COM files before compiling
#
###############################################################################
rm -f *.com
###############################################################################
#
# Compiling from source to ARM Assembly
#
###############################################################################
OPT_RANGE=0
case $# in
0) set *.c ;;
esac
case $1 in
0)
echo "${OPT_EXTS[0]}"
;;
1|2|3)
let OPT_RANGE=$1
echo "Opt range is: $OPT_RANGE"
;;
esac
COMPILATION_PHASE=4
##Compilation Phases enum{PREPROCESSING, COMPILATION, ASSEMBLY, LINKING}
##Default value is 4; unless specified by user
link=all
case $2 in
#2|a|-a|-assemble)
2)
let COMPILATION_PHASE=$2
echo "generating assembly files"
link=none; shift;;
3)
let COMPILATION_PHASE=$2
echo "generating object files"
link=none; shift;;
esac
set *.c
for cfile
do
if [ $COMPILATION_PHASE -eq "2" ]; then
ASSEMBLY_FILE=${cfile%$C_EXT}$ASSEMBLY_EXT
$NASM $FLAGS $O_DEFAULT_FLAG $ASSEMBLY_FLAG $cfile -o $ASSEMBLY_FILE
echo "original filename: $cfile"
echo "output assembly file filename: $ASSEMBLY_FILE"
fi
O0_OBJ_FILE=${cfile%$C_EXT}$OBJ_EXT
$NASM $FLAGS $O_DEFAULT_FLAG -c $cfile -o $O0_OBJ_FILE
echo "original filename: $cfile"
for index in `seq 1 "$OPT_RANGE"`
do
if [ $COMPILATION_PHASE -eq 2 ]; then
ASSEMBLY_FILE=${cfile%$C_EXT}$ASSEMBLY_EXT
$NASM $FLAGS $O_DEFAULT_FLAG $ASSEMBLY_FLAG $cfile -o $ASSEMBLY_FILE
echo "original filename: $cfile"
echo "output assembly file filename: $ASSEMBLY_FILE"
fi
NEW_O_OBJ_FILE=${cfile%$C_EXT}${OPT_OBJ_EXTS[$index]}
$NASM $FLAGS $O_FLAG -c $cfile -o $NEW_O_OBJ_FILE
done
done
###############################################################################
# Linking object files and libraries to create executables
#
###############################################################################
case $compile in
all|sweet)
$NASM $FLAGS $O_DEFAULT_FLAG -o sweet/sweet.com sweet/sweet.asm
linked=yes;;
esac
case $link in
all|sum_and_diff)
for index in `seq 0 "$OPT_RANGE"`
do
NEW_O_EXEC_FILE=${cfile%$C_EXT}${EXEC_EXTS[$index]}
echo "$NEW_O_EXEC_FILE"
O_OBJ_FILE=${cfile%$C_EXT}${OPT_OBJ_EXTS[$index]}
echo "$O_OBJ_FILE"
$NASM $FLAGS $O_DEFAULT_FLAG -o $NEW_O_EXEC_FILE $O_OBJ_FILE $LIBS
linked=yes
done
;;
esac
###############################################################################
# For each COM executable, generate corresponding hex dump using xxd
# save xxd output to appropriately named file
#
###############################################################################
for file in *.com
do
HEXDUMP_FILE="dis_"$file".txt"
echo "HEXDUMP FILE: $HEXDUMP_FILE"
xxd $file > $HEXDUMP_FILE
done
###############################################################################