- •Chapter 1. Introduction
- •How to Develop A Program
- •What is an Assembler?
- •Modular Programming
- •Modular Program Development Process
- •Segments, Modules, and Programs
- •Translate and Link Process
- •Filename Extensions
- •Program Template File
- •Chapter 2. Architecture Overview
- •Memory Classes and Memory Layout
- •Classic 8051
- •Extended 8051 Variants
- •Philips 80C51MX
- •Intel/Atmel WM 251
- •CPU Registers
- •CPU Registers of the 8051 Variants
- •CPU Registers of the Intel/Atmel WM 251
- •Program Status Word (PSW)
- •Instruction Sets
- •Opcode Map
- •8051 Instructions
- •Additional 251 Instructions
- •Additional 80C51MX Instructions via Prefix A5
- •Chapter 3. Writing Assembly Programs
- •Assembly Statements
- •Directives
- •Controls
- •Instructions
- •Comments
- •Symbols
- •Symbol Names
- •Labels
- •Operands
- •Special Assembler Symbols
- •Immediate Data
- •Memory Access
- •Program Addresses
- •Expressions and Operators
- •Numbers
- •Characters
- •Character Strings
- •Location Counter
- •Operators
- •Expressions
- •Chapter 4. Assembler Directives
- •Introduction
- •Segment Directives
- •Location Counter
- •Generic Segments
- •Stack Segment
- •Absolute Segments
- •Default Segment
- •SEGMENT
- •RSEG
- •BSEG, CSEG, DSEG, ISEG, XSEG
- •Symbol Definition
- •CODE, DATA, IDATA, XDATA
- •esfr, sfr, sfr16, sbit
- •LIT (AX51 & A251 only)
- •Memory Initialization
- •DD (AX51 & A251 only)
- •Reserving Memory
- •DBIT
- •DSW (AX51 & A251 only)
- •DSD (AX51 & A251 only)
- •Procedure Declaration (AX51 & A251 only)
- •PROC / ENDP (AX51 & A251 only)
- •LABEL (AX51 and A251 only)
- •Program Linkage
- •PUBLIC
- •EXTRN / EXTERN
- •NAME
- •Address Control
- •EVEN (AX51 and A251 only)
- •USING
- •Other Directives
- •_ _ERROR_ _
- •Chapter 5. Assembler Macros
- •Standard Macro Directives
- •Defining a Macro
- •Parameters
- •Labels
- •Repeating Blocks
- •REPT
- •IRPC
- •Nested Definitions
- •Nested Repeating Blocks
- •Recursive Macros
- •Operators
- •NUL Operator
- •& Operator
- •< and > Operators
- •% Operator
- •;; Operator
- •! Operator
- •Invoking a Macro
- •C Macros
- •C Macro Preprocessor Directives
- •Stringize Operator
- •Predefined C Macro Constants
- •Examples with C Macros
- •C Preprocessor Side Effects
- •Chapter 6. Macro Processing Language
- •Overview
- •Creating and Calling MPL Macros
- •Creating Parameterless Macros
- •MPL Macros with Parameters
- •Local Symbols List
- •Macro Processor Language Functions
- •Comment Function
- •Escape Function
- •Bracket Function
- •METACHAR Function
- •Numbers and Expressions
- •Numbers
- •Character Strings
- •SET Function
- •EVAL Function
- •Logical Expressions and String Comparison
- •Conditional MPL Processing
- •IF Function
- •WHILE Function
- •REPEAT Function
- •EXIT Function
- •String Manipulation Functions
- •LEN Function
- •SUBSTR Function
- •MATCH Function
- •Console I/O Functions
- •Advanced Macro Processing
- •Literal Delimiters
- •Blank Delimiters
- •Identifier Delimiters
- •Literal and Normal Mode
- •MACRO Errors
- •Chapter 7. Invocation and Controls
- •Environment Settings
- •Running Ax51
- •ERRORLEVEL
- •Output Files
- •Assembler Controls
- •Controls for Conditional Assembly
- •Conditional Assembly Controls
- •Chapter 8. Error Messages
- •Fatal Errors
- •Non–Fatal Errors
- •Chapter 9. Linker/Locator
- •Overview
- •Combining Program Modules
- •Segment Naming Conventions
- •Combining Segments
- •Locating Segments
- •Overlaying Data Memory
- •Resolving External References
- •Absolute Address Calculation
- •Generating an Absolute Object File
- •Generating a Listing File
- •Bank Switching
- •Using RTX51, RTX251, and RTX51 Tiny
- •Linking Programs
- •Command Line Examples
- •Control Linker Input with µVision2
- •ERRORLEVEL
- •Output File
- •Linker/Locater Controls
- •Locating Programs to Physical Memory
- •Classic 8051
- •Extended 8051 Variants
- •Philips 80C51MX
- •Intel/Atmel WM 251
- •Data Overlaying
- •Program and Data Segments of Functions
- •Using the Overlay Control
- •Tips and Tricks for Program Locating
- •Locate Segments with Wildcards
- •Special ROM Handling (LX51 & L251 only)
- •Bank Switching
- •Common Code Area
- •Code Bank Areas
- •Bank Switching Configuration
- •Configuration Examples
- •Control Summary
- •Listing File Controls
- •Output File Controls
- •Segment and Memory Location Controls
- •High-Level Language Controls
- •Error Messages
- •Warnings
- •Non-Fatal Errors
- •Fatal Errors
- •Exceptions
- •Chapter 10. Library Manager
- •Using LIBx51
- •Interactive Mode
- •Create Library within µVision2
- •Command Summary
- •Creating a Library
- •Adding or Replacing Object Modules
- •Removing Object Modules
- •Extracting Object Modules
- •Listing Library Contents
- •Error Messages
- •Fatal Errors
- •Errors
- •Chapter 11. Object-Hex Converter
- •Using OHx51
- •OHx51 Command Line Examples
- •Creating HEX Files for Banked Applications
- •OHx51 Error Messages
- •Using OC51
- •OC51 Error Messages
- •Intel HEX File Format
- •Record Format
- •Data Record
- •Extended 8086 Segment Record
- •Extended Linear Address Record
- •Example Intel HEX File
- •Appendix A. Application Examples
- •ASM – Assembler Example
- •Using A51 and BL51
- •Using AX51 and LX51
- •Using A251 and L251
- •CSAMPLE – C Compiler Example
- •Using C51 and BL51
- •Using C51 and LX51
- •Using C251 and L251
- •BANK_EX1 – Code Banking with C51
- •Using C51 and BL51
- •Using C51 and LX51
- •BANK_EX2 – Banking with Constants
- •Using C51 and BL51
- •Using C51 and LX51
- •Using BL51
- •Using C51 and LX51
- •Philips 80C51MX – Assembler Example
- •Philips 80C51MX – C Compiler Example
- •Appendix B. Reserved Symbols
- •Appendix C. Listing File Format
- •Assembler Listing File Format
- •Listing File Heading
- •Source Listing
- •Macro / Include File / Save Stack Format
- •Symbol Table
- •Listing File Trailer
- •Appendix D. Assembler Differences
- •Differences Between A51 and A251/AX51
- •Differences between A51 and ASM51
- •Differences between A251/AX51 & ASM51
- •Glossary
- •Index
Keil Software — A51/AX51/A251 Macro Assembler and Utilities |
261 |
|
|
Overlaying Data Memory
The stack addressing of the x51 CPU is slower compared to accessing fixed, |
9 |
absolute memory locations. For this reason, local variables and function |
arguments of C and PL/M-51 routines are stored at fixed memory locations rather than on the stack. By using techniques to overlay the parameters and local variables of C and PL/M-51 functions, the linker/locator attempts to maximize the amount of available space.
NOTE
The Cx51 compiler supports also reentrant functions where the parameters and automatic variables are store on the CPU stack of a simulate stack. For detailed information refer to the Cx51 User’s Guides.
To accomplish overlaying, the linker/locator analyzes all references or calls between the various functions. Using this information, the linker/locator can determine precisely which data and bit segments can be overlaid.
You may use the OVERLAY and NOOVERLAY control to enable or disable data overlaying. The OVERLAY control is the default and allows for very compact data areas. Use the NOOVERLAY control to disable the segment overlay function.
Resolving External References
External symbols reference addresses in other modules. A declared external symbol must be resolved with a public symbol of the same name. Therefore, for each external symbol, a public symbol must exist in another module.
The linker/locator builds a table of all public and external symbols that it encounters. External references are resolved with public references as long as the names match and the symbol attributes correspond.
The linker/locator reports an error if the symbol types of an external and public symbol do not correspond. The linker/locator also reports an error if no public symbol is found for an external reference.
The absolute addresses of the public symbols are resolved after the location of the segments is determined.
262 Chapter 9. Linker/Locator
|
Absolute Address Calculation |
|
9 |
||
After the segments are assigned fixed memory locations and external and public |
||
references are processed, the linker/locator calculates the absolute addresses of |
||
|
the relocatable addresses and external addresses. Symbolic debugging |
|
|
information is also updated to reflect the new addresses. |
Generating an Absolute Object File
The linker/locator generates the executable target program in absolute object module format. The generated object module may contain debugging information if the linker/locator is so directed. This information facilitates symbolic debugging and testing. You may use the linker controls to suppress debugging information in the object file.
The output file generated by the linker/locator may be loaded into the µVision2 debugger, in-circuit emulators, or may be translated into an Intel HEX file for use with an EPROM programmer. The following table provides an overview of the output format and the processing method for the different linker/locater variants.
Linker/Locater Output Format Description
BL51 |
Extended |
Linker/Locater |
Intel OMF51 |
or
Banked OMF51
Intel OMF51 is the standard format for programming the 8051 and supported by virtually all emulator vendors. Extensions in this format provide symbolic information.
For banked applications the BL51 Linker/Locater generates a banked OMF51 file that can be converted with the OC51 Object File Converter into standard OMF51 files. The OC51 step is also required to convert the file into an Intel HEX file.
LX51 Extended |
Keil OMFx51 |
The Keil OMFx51 format supports of up to 16MB code and |
Linker/Locater |
|
xdata memory. This format is required for extended 8051 |
|
|
versions (Philips 80C51MX, Dallas 390, etc.). Check |
|
|
with your emulator vendor if this format is supported. |
L251 |
Intel OMF251 |
Intel OMF251 is the standard format for programming the |
Linker/Locater |
|
251 and supported by all 251 emulator vendors. |
Keil Software — A51/AX51/A251 Macro Assembler and Utilities |
263 |
|
|
Generating a Listing File
The linker/locator generates a listing file that lists information about each step in |
9 |
the link and locate process. This file also contains information about the |
symbols and segments involved in the linkage. In addition, the following information may be found in the listing file:
The filenames and other parameters specified on the command line.
Filenames and module names of all processed modules.
A memory allocation table, which contains the location of the segments, the segment type, the location method, and the segment name. This table may be suppressed by specifying the NOMAP control.
The overlay map which shows the structure of the finished program and lists address information for the local data and bit segments of a function. The overlay map also lists all code segments for which OVERLAYABLE segments exist. You may suppress the overlay map by specifying the NOMAP control.
LX51 and L251 provide a list of all PUBLIC symbols within a program.
A list of all errors in segments and symbols. The error causes are listed at the end of the listing file.
A list of all unresolved external symbols. An external symbol is unresolved if no corresponding public symbol exists in another input file. Each reference to an unresolved external symbol is listed in an error message at the end of the listing file.
A symbol table, which contains the symbol information from the input files. This information consists of the names of the MODULES, SYMBOLS, PUBLICS, and LINES. You may selectively suppress the symbolic information with linker controls.
An alphabetically sorted cross reference report of all PUBLIC and EXTERN symbols in which the memory type and the module names that contain a reference to that symbol are displayed.
Errors detected during the execution of the linker/locator are displayed on the screen as well as at the end of the listing file. Refer to “Error Messages” on page 360 for a summary of the linker/locator errors and causes.
264 Chapter 9. Linker/Locator
|
Bank Switching |
|
|
|
|
|
|
|
|||
9 |
|
|
|
|
|
|
|
||||
The classic 8051 directly supports a maximum of 64 KBytes of code space. The |
|||||||||||
Lx51 linker/locator allows 8051 programs to be created that are larger than 64 |
|||||||||||
|
KBytes by using a technique known as code banking or bank switching. Bank |
||||||||||
|
switching involves using extra hardware to select one of a number of code banks |
||||||||||
|
all of which will reside at a common physical address. |
|
|
|
|||||||
|
For example, your hardware design may include a ROM mapped from address |
||||||||||
|
0000h to 7FFFh (known as the common area) and four 32K ROM blocks |
||||||||||
|
mapped from code address 8000h to 0FFFFh (known as the code bank area). |
||||||||||
|
The following figure shows the memory structure. |
|
|
|
|||||||
|
FFFFh |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ROM |
|
ROM |
|
ROM |
|
ROM |
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
Bank #0 |
|
Bank #1 |
|
Bank #2 |
|
Bank #3 |
|
|
|
|
|
32 KB |
|
32 KB |
|
32 KB |
|
32 KB |
|
|
|
8000h |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7FFFh
ROM
Common
Area
32 KB
0000h
The code banking facility of Lx51 is compatible with the C51 compiler, the CX51 compiler, and the Intel PL/M-51 compiler. Modules written using on of these compilers can be easily used in code banking applications. No modifications to the original source files are required.
Refer to “Bank Switching” on page 293 for detailed information about memory banking and instructions for building code banking programs.