Você está na página 1de 13

Assembler Algorithm and Data

Structures
Assembler Functions
• Convert Mnemonic Operation Codes to Machine Level
Equivalents
• Convert Symbolic Operands to their equivalent machine
addresses. (Requires Two passes)
• Build the machine instructions in the proper format
• Convert data constants specified in source program into
their internal machine representations.
• Write Object Program and assembly listing.
Data Structures
• Operation Code Table (OPTAB)
– Used to look up mnemonic operation codes and
translate them into machine language
equivalents
– Contains the mnemonic operation code and its
machine language equivalent
– In more complex assemblers, contains
information like instruction format and length
Data Structures
• Symbol Table
– Used to store values (addresses) assigned to
labels
– Includes the name and value for each label
– Flags to indicate error conditions, e.g. duplicate
definition of labels
– May contain other info like type or length about
the data area or instruction labeled
Data Structures
• LOCCTR
– Used to help in the assignment of addresses
– Initialized to the beginning address specified in
the START statement
– After each source statement is processed, the
length of the assembled instruction or data area
to be generated is added
– Gives the address of a label
Assembler Algorithm – Pass 1
• Assign addresses to all statements in the program
• Save the values (addresses) assigned to all labels
for use in Pass 2
• Perform some processing of assembler directives.
(This includes processing that affects address
assignment, such as determining the length of
data areas defined by BYTE, RESW, etc.
Assembler Algorithm – Pass 2
• Assemble instructions (translating operation
codes and looking up addresses).
• Generate data values defined by BYTE,
WORD, etc.
• Perform processing of assembler directives not
done during Pass 1
• Write the object program and the assembly
listing
Loc Source Statement
1000 COPY START 1000 COPY FILE FROM INPUT TO OUTPUT

PASS -1 1000 FIRST


1003 CLOOP
1006
STL
JSUB
LDA
RETADR
RDREC
LENGTH
SAVE RETURN ADDRESS
READ INPUT RECORD
TEST FOR EOF (LENGTH = 0)
1009 COMP ZERO
100C JEQ ENDFIL EXIT IF EOF FOUND
1000F JSUB WRREC WRITE OUTPUT RECORD
begin 1012 J CLOOP LOOP
read first input line 1015 ENDFIL LDA EOF INSERT END OF FILE MARKER
if OPCODE = 'START' then 1018 STA BUFFER
begin 101B LDA THREE SET LENGTH = 3
save #[OPERAND] as starting address 101E STA LENGTH
initialized LOCCTR to starting address 1021 JSUB WRREC WRITE EOF
write line to intermediate file 1024 LDL RETADR GET RETURN ADDRESS
read next input line 1027 RSUB RETURN TO CALLER
end {if START} 102A EOF BYTE C’EOF’
else 102D THREE WORD 3
initialized LOCCTR to 0 1030 ZERO WORD 0
1033 RETADR RESW 1
1036 LENGTH RESW 1 LENGTH OF RECORD
1039 BUFFER RESB 4096 4096-BYTE BUFFER AREA
.
. SUBROUTINE TO READ RECORD INTO BUFFER
.
2039 RDREC LDX ZERO CLEAR LOOP COUNTER

.
. SUBROUTINE TO WRITE RECORD FROM BUFFER
.
2061 WRREC LDX ZERO CLEAR LOOP COUNTER
.
.

END FIRST
while OPCODE != 'END' do 1000 COPY START 1000 COPY FILE FROM INPUT TO OUTPUT
begin 1000 FIRST STL RETADR SAVE RETURN ADDRESS
if this is not a comment line then 1003 CLOOP JSUB RDREC READ INPUT RECORD
begin 1006 LDA LENGTH TEST FOR EOF (LENGTH = 0)
if there is a symbol in the LABEL field then 1009 COMP ZERO
begin 100C JEQ ENDFIL EXIT IF EOF FOUND
search SYMTAB for LABEL 1000F JSUB WRREC WRITE OUTPUT RECORD
if found then 1012 J CLOOP LOOP
set error flag (duplicate symbol) 1015 ENDFIL LDA EOF INSERT END OF FILE MARKER
else 1018 STA BUFFER
insert (LABEL, LOCCTR) into SYMTAB 101B LDA THREE SET LENGTH = 3
end {if symbol} 101E STA LENGTH
search OPTAB for OPCODE
1021 JSUB WRREC WRITE EOF
if found then
1024 LDL RETADR GET RETURN ADDRESS
add 3 {instruction lengh} to LOCCTR
1027 RSUB RETURN TO CALLER
else if OPCODE = 'WORD' then
102A EOF BYTE C’EOF’
add 3 to LOCCTR
102D THREE WORD 3
else if OPCODE = 'RESW' then
1030 ZERO WORD 0
add 3 * #[OPERAND] to LOCCTR
1033 RETADR RESW 1
else if OPCODE = 'RESB' then
1036 LENGTH RESW 1 LENGTH OF RECORD
add #[OPERAND] to LOCCTR
1039 BUFFER RESB 4096 4096-BYTE BUFFER AREA
else if OPCODE = 'BYTE' then
.
begin
find length of constant in bytes
. SUBROUTINE TO READ RECORD INTO BUFFER
add length to LOCCTR .
end {if BYTE} 2039 RDREC LDX ZERO CLEAR LOOP COUNTER
else …
set error flag (invalid operation code) .
end {if not a comment} . SUBROUTINE TO WRITE RECORD FROM BUFFER
write line to intermediate file .
read next input line 2061 WRREC LDX ZERO CLEAR LOOP COUNTER
end {while not END} .
write last line to intermediate file .
save (LOCCTR - starting address) as program length
end END FIRST
Loc Source Statement Object Code
PASS -2 1000 COPY
1000 FIRST
START
STL
1000
RETADR
COPY FILE FROM INPUT TO OUTPUT
SAVE RETURN ADDRESS 141033
1003 CLOOP JSUB RDREC READ INPUT RECORD 482039
1006 LDA LENGTH TEST FOR EOF (LENGTH = 0) 001036
1009 COMP ZERO 281030
100C JEQ ENDFIL EXIT IF EOF FOUND 301015
1000F JSUB WRREC WRITE OUTPUT RECORD 482061
1012 J CLOOP LOOP 3C1003
begin 1015 ENDFIL LDA EOF INSERT END OF FILE MARKER 00102A
read first input file {from intermediate file} 1018 STA BUFFER 0C1039
if OPCODE = 'START' then 101B LDA THREE SET LENGTH = 3 00102D
begin 101E STA LENGTH 0C1036
write listing line 1021 JSUB WRREC WRITE EOF 482061
read next input line 1024 LDL RETADR GET RETURN ADDRESS 081033
end {if START} 1027 RSUB RETURN TO CALLER 4C000
write header record to object program 102A EOF BYTE C’EOF’ 454F46
initialized first Text record 102D THREE WORD 3 000003
1030 ZERO WORD 0 000000
1033 RETADR RESW 1
1036 LENGTH RESW 1 LENGTH OF RECORD
1039 BUFFER RESB 4096 4096-BYTE BUFFER AREA
.
. SUBROUTINE TO READ RECORD INTO BUFFER
.
2039 RDREC LDX ZERO CLEAR LOOP COUNTER 041030

.
. SUBROUTINE TO WRITE RECORD FROM BUFFER
.
2061 WRREC LDX ZERO CLEAR LOOP COUNTER 041030
.
.

END FIRST
1000 COPY START 1000 COPY FILE FROM INPUT TO OUTPUT
while OPCODE != 'END' do 1000 FIRST STL RETADR SAVE RETURN ADDRESS 141033
begin 1003 CLOOP JSUB RDREC READ INPUT RECORD 482039
if this is not a comment line then 1006 LDA LENGTH TEST FOR EOF (LENGTH = 0) 001036
begin 1009 COMP ZERO 281030
search OPTAB for OPCODE 100C JEQ ENDFIL EXIT IF EOF FOUND 301015
if found then 1000F JSUB WRREC WRITE OUTPUT RECORD 482061
begin 1012 J CLOOP LOOP 3C1003
if there is a symbol in OPERAND field then 1015 ENDFIL LDA EOF INSERT END OF FILE MARKER 00102A
begin 1018 STA BUFFER 0C1039
search SYMTAB for OPERAND 101B LDA THREE SET LENGTH = 3 00102D
if found then 101E STA LENGTH 0C1036
store symbol value as operand address 1021 JSUB WRREC WRITE EOF 482061
else 1024 LDL RETADR GET RETURN ADDRESS 081033
begin 1027 RSUB RETURN TO CALLER 4C000
store 0 as operand address 102A EOF BYTE C’EOF’ 454F46
set error flag (undefined symbol) 102D THREE WORD 3 000003
end 1030 ZERO WORD 0 000000
end {if symbol} 1033 RETADR RESW 1
else 1036 LENGTH RESW 1 LENGTH OF RECORD
store 0 as operand address 1039 BUFFER RESB 4096 4096-BYTE BUFFER AREA
assemble the object code instruction .
end {if opcode found} . SUBROUTINE TO READ RECORD INTO BUFFER
else if OPCODE = 'BYTE' or 'WORD' then .
convert constant to object code 2039 RDREC LDX ZERO CLEAR LOOP COUNTER 041030
if object code not fit into the current Text record then …
begin .
write Text record to object program . SUBROUTINE TO WRITE RECORD FROM BUFFER
initialized new Text record .
end 2061 WRREC LDX ZERO CLEAR LOOP COUNTER 041030
add object code to Text record .
end {if not comment} .
write listing line
read next input line END FIRST
end {while not END}
1000 COPY START 1000 COPY FILE FROM INPUT TO OUTPUT
write last Text record to object program 1000 FIRST STL RETADR SAVE RETURN ADDRESS 141033
write End record to object program 1003 CLOOP JSUB RDREC READ INPUT RECORD 482039
write last listing line 1006 LDA LENGTH TEST FOR EOF (LENGTH = 0) 001036
end 1009 COMP ZERO 281030
100C JEQ ENDFIL EXIT IF EOF FOUND 301015
1000F JSUB WRREC WRITE OUTPUT RECORD 482061
1012 J CLOOP LOOP 3C1003
1015 ENDFIL LDA EOF INSERT END OF FILE MARKER 00102A
1018 STA BUFFER 0C1039
101B LDA THREE SET LENGTH = 3 00102D
101E STA LENGTH 0C1036
1021 JSUB WRREC WRITE EOF 482061
1024 LDL RETADR GET RETURN ADDRESS 081033
1027 RSUB RETURN TO CALLER 4C000
102A EOF BYTE C’EOF’ 454F46
102D THREE WORD 3 000003
1030 ZERO WORD 0 000000
1033 RETADR RESW 1
1036 LENGTH RESW 1 LENGTH OF RECORD
1039 BUFFER RESB 4096 4096-BYTE BUFFER AREA
.
. SUBROUTINE TO READ RECORD INTO BUFFER
.
2039 RDREC LDX ZERO CLEAR LOOP COUNTER 041030

.
. SUBROUTINE TO WRITE RECORD FROM BUFFER
.
2061 WRREC LDX ZERO CLEAR LOOP COUNTER 041030
.
.

END FIRST
H | COPY | 001000 | 00107A
Header record:
T | 001000 | 1E | 141033 | 482039 | 001036 | …
Col. 1 H
T | 00101E | 15 | 0C1036 | 482061 | 081033 | …
Col. 2-7 Program name

Col. 8-13 Starting address of object program (hexadecimal)
T | 002073 | 07 | 382064 | 4C0000 | 05
Col. 14-19 Length of object program in bytes (hexadecimal)
E | 001000

Text record:
Col. 1 T
Col. 2-7 Starting address for object code in this record (hexadecimal)
Col. 8-9 Length of object code in this record in bytes (hexadecimal)
Col. 10 – 69 Object code, represented in hexadecimal. (69-10+1)/6=10 instructions

End record:
Col. 1 E
Col. 2-7 Address of first executable instruction in object program (hexadecimal)

Você também pode gostar