Describe pass 1 of the assembler
Example:
ba label1 ... label1:Assembler must generate machine code for "ba label1", but where is label1???
Solution to the forward reference problem:
Assembler performs two passes
Pass 1 creates symbol table defining locations of labels (which section, what offset within the section)
Pass 2 uses symbol table to generate machine code
Consists of bindings -- one binding for each label used in the assembly language program
Better name: label table
Key: a label name (string)
Value: a pointer to an Elf32_Sym structure:
(1) Section (data, bss, text, or undefined)
(2) Offset within section (0 if undefined)
(3) Global/local
(4) Sequence number (unique across all sections)Implemented using Hanson's Table ADT
See the Assembler Assignment: Development Stages summary sheet
Objective: Fill out symbol table
Put one binding into symbol table for each unique label in the assembly language program
[Show conceptual symbol table on board]
| Label | Section | Offset | Local/Global | Seq# |
Must maintain three location counters
One for each section
Initialized to 0
[Show location counters on board]
iDataLc, iBssLc, iTextLc
Must keep track of which section (data, bss, or text) is "active"
[Show star on board next to appropriate location counter]
Example: 01section.s -- with labels added at every possible point
Handouts showing testing program 01section.s and the symbol table that it generates, as printed by print_passes()
.section ".data" Make the data section the current one label0: Add a binding to the symbol table (label0, data, 0, local, 0) .ascii "hello\t", "cs217\n" Increment the data section location counter by 6 (to 6) Increment the data section location counter by 6 (to 12) label1: Add a binding to the symbol table (label1, data, 12, local, 1) .asciz "assignment5\n" Increment the data section location counter by 13 (to 25) label2: Add a binding to the symbol table (label2, data, 25, local, 2) .skip 1 Increment the data section location counter by 1 (to 26) label3: Add a binding to the symbol table (label3, data, 26, local, 3).section ".bss" Make the bss section the current one label4: Add a binding to the symbol table (label4, bss, 0, local, 4) .skip 1 Increment the bss section location counter by 1 label5: Add a binding to the symbol table (label5, bss, 1, local, 5) .section ".text" Make the text section the current one label6: Add a binding to the symbol table (label6, text, 0, local, 6) add %r1, %r2, %r3 Increment the text section location counter by 4 label7: Add a binding to the symbol table (label7, text, 4, local, 7).section ".data" Make the data section the current one (again) label8: Add a binding to the symbol table (label8, data, 26, local, 8) .byte 1, 2, 3 Increment the data section location counter by 1 (27) Increment the data section location counter by 1 (28) Increment the data section location counter by 1 (29) label9: Add a binding to the symbol table (label9, data, 29, local, 9) .align 2 Increment the data section location counter until it is evenly divisible by 2 (30) label10: Add a binding to the symbol table (label10, data, 30, local, 10) .half 4, 5 Increment the data section location counter by 2 (32) Increment the data section location counter by 2 (34) label11: Add a binding to the symbol table (label11, data, 34, local, 11) .align 4 Increment the data section location counter until it is evenly divisible by 4 (36) label12: Add a binding to the symbol table (label12, data, 36, local, 12) .word 6 Increment the data section location counter by 4 (40) label13: Add a binding to the symbol table (label13, data, 40, local, 13) .section ".bss" Make the bss section the current one label14: Add a binding to the symbol table (label14, bss, 1, local, 14) .align 2 Increment the data section location counter until it is evenly divisible by 2 (2) label15: Add a binding to the symbol table (label15, bss, 2, local, 15) .section ".text" Make the text section the current one label16: Add a binding to the symbol table (label16, text, 4, local, 16) add %r1, %r2, %r3 Increment the text section location counter by 4 (8) label17: Add a binding to the symbol table (label17, text, 8, local, 17)Verify using the output of print_passes()
Example: 02symbol.s
Give handouts showing testing program 02symbol.s and the symbol table that it generates, as printed by print_passes()
.section ".data" Make the data section the current one label0: label0 is not in the symbol table, so... Add a binding to the symbol table (label0, data, 0, local, 0) .byte 0 Increment the data section location counter by 1 (1) .align 2 Increment the data section location counter until it is evenly divisible by 2 (2) .global label1 label1 is not in the symbol table, so... Add a binding to the symbol table (label1, unknown, unknown, global, 1) label1: label1 is in the symbol table, so... Edit its binding in the symbol table (label1, data, 2, global, 1) .half 0 Increment the data section location counter by 2 (4) .section ".text" Make the text section the current one label2: Add a binding to the symbol table (label2, text, 0, local, 2) add %r1, %r2, %r3 Increment the text section location counter by 4 (4) .global label2 label2 is in the symbol table, so... Edit its binding in the symbol table (label2, text, 0, global, 2) .global label3 label3 is not in the symbol table, so... Add a binding to the symbol table (label3, unknown, unknown, global, 3)Verify using the output of print_passes()
Copyright © 2002 by Robert M. Dondero, Jr.