Translate assembly language programs to object programs or machine
code is called an Assembler.
- One-pass assemblers are used when
- it is necessary or desirable to avoid a second pass over the source program
- the external storage for the intermediate file between two passes is slow or is inconvenient to use
- Main problem: forward references to both data and instructions
- One simple way to eliminate this problem: require that all areas be defined before they are referenced.
- It is possible, although inconvenient, to do so for data items.
- Forward jump to instruction items cannot be easily eliminated.
Data structures for assembler:
Op code table
Looked up for the translation of mnemonic code
- key: mnemonic code
- result: bits
Hashing is usually used
- once prepared, the table is not changed
- efficient lookup is desired
- since mnemonic code is predefined, the hashing function can be tuned a priori
The table may have the instruction format and length
- to decide where to put op code bits, operands bits, offset bits
- for variable instruction size
- used to calculate the address
Symbol table
Stored and looked up to assign address to labels
- efficient insertion and retrieval is needed
- deletion does not occur
Difficulties in hashing
Problem
pass 1: loop until the end of the program
1. Read in a line of assembly code
2. Assign an address to this line
- increment N (word addressing or byte addressing)
3. Save address values assigned to labels
4. Process assembler directives
- constant declaration
- space reservation
Algorithm for Pass 1 assembler:
begin
if starting address is given
LOCCTR = starting address;
else
LOCCTR = 0;
while OPCODE != END do ;; or EOF
begin
read a line from the code
if there is a label
if this label is in SYMTAB, then error
else insert (label, LOCCTR) into SYMTAB
search OPTAB for the op code
if found
LOCCTR += N ;; N is the length of this instruction (4 for MIPS)
else if this is an assembly directive
update LOCCTR as directed
else error
write line to intermediate file
end
program size = LOCCTR - starting address;
end
Load-and-go assembler
- Load-and-go assembler generates their object code in memory for immediate execution.
- No object program is written out, no loader is needed.
- It is useful in a system oriented toward program development and testing such that the efficiency of the assembly process is an important consideration
Forward Reference:
- Omits the operand address if the symbol has not yet been defined
- Enters this undefined symbol into SYMTAB and indicates that it is undefined
- Adds the address of this operand address to a list of forward references associated with the SYMTAB entry
- Scans the reference list and inserts the address when the definition for the symbol is encountered.
- Reports the error if there are still SYMTAB entries indicated undefined symbols at the end of the program
- Search SYMTAB for the symbol named in the END statement and jumps to this location to begin execution if there is no error
|