Translation of an Intel x86 assembly language syntax into operation codes by generating listing file
symtab.hpp :- This file contains the declarations of the main symbol table and class SymbolTable to bind it.
symtab.cpp :- This file contains the implementation of declared functions in symtab.hpp.
errortab.hpp :- This file contains the list of errors and functions in class ErrorTable.
errortab.cpp :- This file contains the implementation of function defined in errortab.hpp
optab.hpp :- This file contains the hashtable for storing the mnemonics and their required parameters with class OPCodeTable.
optab.cpp :- This file contains the function that stores mnemonics and its information in OPCodeTable.
pass_1.cpp :- This file performs the pass 1 of the assembler.
pass_2.cpp :- This file performs the pass 2 of the assembler
Pass 1 is performed by file pass_1.cpp,it reads the source code,validate the declarartions and mnemonics by parsing the assembly language source code,generate addresses and write it to the intermediate file. the intermediate file contains four entries each separated by hash(#) sign.
<linenumber>#<address>#<symbol>#<original_file_content>#
here symbol is the name of label defined in the .data or .bss section
Pass 2 reads this intermediate file,assemble the instructions by looking opcode in OPCodeTable and write it to lst file
The supported instructions are:-
inc, dec, mov, add, je, jmp, ja, jb, jae, jbe, jne, jle, pusha, pushad, popa, popad, push, pop, loop, cmp, global, extern
defined in a file opttab.cpp
More instructions can be added in opttab.cpp source file by adding an entry of mnemnic in table with required parameter such as how many parameters this mnemonic require, its opcode, is it register or memory etc.
Requirements :- GNU/Linux Operating System
G++ - GNU Compiler Collection with C++ Compiler
Compile it using following command:-
make
it will create a minassm executable file.it requires two file names separated by -i and -o command line options.
-i :- Input file name(.asm)
-o :- Ouput lst filename;
e.g.: ./minassm -i <inputfile.asm> -o lstfile.lst
Run shell script file(run_tests.sh) to test the examples given.
it takes an arguments of example file numbers such as 1, 2, 3 and 4.
e.g.:
sh run_tests.sh 4
output
asm file = tests/example_4/example.asm
lst file = tests/example_4/example.lst
1
2 section .bss
3 00000000 <res 00000008> len2:resd 2
5 00000008 <res 00000028> sssss : resd 10
6 aaaa resb 1
7
8 section .data
9 00000000 68656C6C6F20776F72 mystr db "hello world, how are you ?",0
9 00000009 6C642C20686F772061-
9 00000012 726520796F75203F00
10 0000001B 7265733D256400 msg:db "res=%d",0
11 aa2 : db "this is string"
12 0000002B 200000004E00000002 arr dd 32, 78 , 2, 32, 212134562
12 00000034 00000020000000CA4E-
12 00000022 AA20
13 00000036 0C00220005004300 myar dw 12,34,5,67
14 len dd 101
15 00000047 776865726520646F20 aa : db "where do you live ?",0
15 00000050 796F75206C69766520-
15 0000003E 3F00
16 aa34 dw 20
17 0000005B 0C0000002D0000004E str1 dd 12,45,78,00,11
17 00000064 000000000000000B00-
17 00000052 0000
18 abcd dd 2
19
20 section .text
21 global main
22 extern printf
23
24 main :
25
26 00000000 6640 inc eax
27 00000002 6643 inc ebx
28 00000004 FEC0 inc al
29 00000006 FEC3 inc bl
30 00000008 FEC2 inc dl
31 0000000A FEC1 inc cl
32 0000000C FEC5 inc ch
33 0000000E 40 inc ax
34 00000010 43 inc bx
35 00000012 FE06[1B00] inc byte[msg]
36 00000016 FF06[000] inc word[aa34]
37 0000001A 66FF06[000] inc dword[len2]
38 0000001F FEC8 dec al
39 00000020 FECB dec bl
40 00000021 FEC9 dec cl
41 00000023 6648 dec eax
42 00000025 664B dec ebx
43 00000027 48 dec ax
44 00000029 4B dec bx
45 0000002B 49 dec cx
46 0000002C FECB dec bl
47 0000002E FE0E[000] dec byte[len]
48 00000032 FF0E[000] dec word[len]
49 00000036 66FF0E[000] dec dword[len]
50
51 0000003B 66B00A000000 mov eax,10
52 0000003F 66C7060[000]0C000000 mov dword[len],12
53 00000043 66BB0C000000 mov ebx,12
54 00000047 66A1[000] mov eax,dword[len]
55 0000004B 668B1E[000] mov ebx,dword[len]
56 0000004F 66A3[000] mov dword[len2],eax
57 00000053 66891E[000] mov dword[len2],ebx
58 00000057 6689 mov eax,ebx
59 0000005B 6689 mov ecx,eax
60 0000005F 6689 mov eax,ebx
61 00000063 6689 mov edx,ebx
62 00000067 6689 mov eax,ecx
63 0000006B 66B93D000000 mov ecx,61
64 0000006F 668B1E[000] mov ecx,dword[len]
65 00000073 668B1E[000] mov edx,dword[len]
66 00000075 A0[1B00] mov al,byte[msg]
67 00000077 89 mov ax,bx
68 00000079 89 mov cx,ax
69 0000007B 89 mov ah,al
70 0000007D B05A mov al,90
71 0000007F B31E mov bl,30
72 00000081 B80280 mov ax,40
73 00000083 B833C mov bx,60
74 00000085 A2[000] mov byte[mystr],al
75 00000087 8A1E[000] mov bl,byte[mystr]
76 00000089 880E[000] mov byte[mystr],cl
77 0000008D 66C7060[000]14000000 mov dword[len],20
78
79 0000008F 6683C00C000000 add eax,12
80 00000093 6601D8 add eax,ebx
81 00000095 04005 add al,5
82 00000097 01CB add ax,bx
83 00000099 01D8 add bl,cl
84
85 00000099 60 pusha
86 00000099 61 popa
87 00000099 60 pushad
88 00000099 61 popad
89
90 iszero:
91 0000009E 668B1E[000] mov ecx,dword[len]
92 000000A2 66891E[000] mov dword[temp],ecx
93 000000A6 mov ebx,arr
94
95 000000A6 66833E0[000]00000000 cmp dword[len2],0
96 000000A6 74 je exit
97
98 000000AB 66FF0E[000] dec dword[len2]
99
100 checkloop :
101 000000AB 66833E0[000]00000000 cmp dword[temp],0
102 000000AB 74 je iszero
103
104 000000AF 6689 mov eax,ebx
105 000000B1 6681304000000 add ebx,4
106
107 000000B1 cmp eax,edx
108 000000B1 7E jle checkloop2
109
110 checkloop2:
111 000000B5 66FF0E[000] dec dword[temp]
112 000000B5 EB jmp checkloop
113
114 exit:
115 000000BA 66FF06[000] inc dword[temp]
116 000000BF 668B1E[000] mov ecx,dword[temp]
117 000000C3 mov eax,arr
118
119 000000C3 3C000 cmp al,0
120 000000C3 74 je exit
121
122 000000C3 83F8000 cmp ax,0
123 000000C3 74 je exit
124
125 000000C3 6683F8000000000 cmp eax,0
126 000000C3 74 je exit
127
128 000000C3 803E0[1B00]00000000 cmp byte[msg],0
129 000000C3 74 je exit
130
131 000000C3 833E0[000]00000000 cmp word[aa34],0
132 000000C3 74 je exit
133
134 print1:
135 000000C3 60 pusha
136 000000C3 68 push str1
137 000000C3 E8(0000) call printf
138 000000C5 6681408000000 add esp,8
139 000000C5 61 popa
140 000000C9 6683C004000000 add eax,4
141 000000C9 E2 loop print1