Assignment: Macro Pre-Processor for CS4800 Assembler
Write a program that will process the macros in a CS4800 Assembly Language program. The macro format is described below.
Input: A CS4800 Assembly Language Program with or without Macros.
Output: A CS4800 Assembly Language Program with any Macros expanded.
A listing of the macro name table (pointers may be ignored)
A listing of the macro table (pointers may be ignored)
Macro Format:
.MACRO MacroName [Parameter List]
Macro Body
.ENDM [MacroName]
The MacroName is a label.
The Parameter List is a list of no more that 12 labels separated by commas.
The Macro Body is a sequence of CS4800 Assembly Language instructions including directives.
Labels used on lines in the Macro Body will be designated in the parameter list prefixed by a $. The macro processor will generate a label to replace the label in the Macro expansion.
Parameters may be used anywhere in the Macro Body. But, if the parameter is to be concatenated to other objects in the body, the parameter and the object must be separated by a tic (‘) . Two parameters concatenated are separated by two tics(‘'). Otherwise, the parameter must stand alone as a part of an instruction.
There will be these additional assembler directives
.IF
.ENDIF
used for conditional assembly of macros. The operand for .IF will contain one of these binary operators
.EQ. is textually equal
.LS. is textually less than
.GT. is textually greater than
or this unary operator
.EMPTY. is the null string
.ENDIF marks the end of the instructions that will be conditionally expanded.
The operands for these operators may be a formal parameter or a literal. A literal is delimited by slashes (/).
There will be no forward references to macros.
Macro calls may be nested but macro definitions may not.
If you wish, you may implement recursive macros for 20% extra credit.
Example Macros:
.MACRO TESTCASE THIS, IS, PARAMETER, REG, $MYLABLE
.BYTE 10
.WORD 100,200,300
THIS MYLABLE
ADD IS
ST'REG PARAMETER
MYLABLE: INC'REG
.ENDM TESTCASE
If invoked with
TESTCASE LDA, SOME, LABEL,, MINE
The expansion would look like this:
.BYTE 10
.WORD 100,200,300
LDA L30000
ADD SOME
ST L30000
L30000: INC
Invoked a second time this way:
TESTCASE ADD, A, Y, X
.BYTE 10
.WORD 100,200,300
ADD L30001
ADD A
STX Y
L30001: INCX
Thoroughly test your program. You may assemble the output from your macro
processor to show that the generated code is correct if you wish.
Turn in: A complete design document
Your macro processor code .
An executable version. Your test programs.
Your test output (include object code if you generate it).