- •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
106 |
Chapter 4. Assembler Directives |
|
|
SEGMENT
The SEGMENT directive is used to declare a generic segment. A relocation type and an allocation type may be specified in the segment declaration. The SEGMENT directive is specified using the following format:
|
|
segment SEGMENT |
class |
reloctype |
alloctype |
|
|
where |
|
|
|
|
|
segment |
is the symbol name to assign to the segment. This symbol |
||
|
|
|
name is referred by the following RSEG directive. The |
||
|
|
|
segment symbol name can be used also in expressions to |
||
|
|
|
represent the base or start address of the combined segment |
||
|
|
|
as calculated by the Linker/Locator. |
||
|
|
class |
is the memory class to use for the specified segment. The |
||
4 |
|
|
class specifies the memory space for the segment. See the |
||
|
|
table below for more information. |
|||
|
reloctype |
is the relocation type for the segment. This determines |
|||
|
|
|
what relocation options may be performed by the |
||
|
|
|
|||
|
|
|
Linker/Locator. Refer to the table below for more |
||
|
|
|
information. |
|
|
|
|
alloctype |
is the allocation type for the segment. This determines what |
||
|
|
|
relocation options may be performed by the Linker/Locator. |
||
|
|
|
Refer to the table below for more information. |
||
Shaded directives and options are available only in AX51 and A251.
Keil Software — A51/AX51/A251 Macro Assembler and Utilities |
107 |
|
|
Class
The name of each segment within a module must be unique. However, the linker will combine segments having the same segment type. This applies to segments declared in other source modules as well.
The class specifies the memory class space for the segment. The A251 differentiates between basic classes and user-defined classes. The class is used by the linker/locator to access all the segments which belong to that class.
The basic classes are listed below:
|
Basic Class |
Description |
|
|
|
BIT |
BIT space (address 20H .. 2FH). |
|
|
|
CODE |
CODE space |
|
|
|
CONST |
CONST space; same as CODE but for constant only; access via MOVC. |
|
|
|
4 |
|||
|
DATA |
DATA space (address 0 to 7FH & SFR registers). |
|
|
|
EBIT |
Extended 251 bit space (address 20H .. 7FH) |
|
|
|
EDATA |
EDATA space |
|
|
|
ECONST |
ECONST space; same as EDATA but for constants |
|
|
|
|
|||
|
IDATA |
IDATA space (address 0 to 0FFH). |
|
|
|
|
|
|
|
|
ECODE |
Entire Intel/Atmel WM 251 and Philips 80C51MX address space for program |
|
|
|
|
code. |
|
|
|
HCONST |
Entire Intel/Atmel WM 251 and Philips 80C51MX address space for constants. |
|
|
|
HDATA |
Entire Intel/Atmel WM 251 and Philips 80C51MX address space for data. |
|
|
|
XDATA |
XDATA space; access via MOVX. |
|
|
User-defined Class Names (AX51 & A251 only)
User-defined class names are composed of a basic class name and an extension and are enclosed in single quotes ('). They let you access the same address space as basic class names. The advantage is that you may declare several segments with a user-defined class and later use the linker to locate that class (and its segments) at a specific physical address. Refer to the “CLASSES” on page 336 for information on how to locate user defined classes.
Examples
seg1 SEGMENT 'NDATA_FLASH' seg2 SEGMENT 'HCONST_BITIMAGE' seg3 SEGMENT 'DATA1'
Shaded directives and options are available only in AX51 and A251.
108 |
Chapter 4. Assembler Directives |
|
|
Relocation Type
The optional relocation type defines the relocation operation that may be performed by the Linker/Locator. The following table lists the valid relocation types:
|
|
Relocation Type |
Description |
|
|
|
AT address |
Specifies an absolute segment. The segment will be placed at the |
|
|
|
|
specified address. |
|
|
|
BITADDRESSABLE |
Specifies a segment which will be located within the bit addressable |
|
|
|
|
memory area (20H to 2FH in DATA space). BITADDRESSABLE is only |
|
|
|
|
allowed for segments with the class DATA that do not exceed 16 bytes in |
|
|
|
|
length. |
|
|
|
INBLOCK |
Specifies a segment which must be contained in a 2048Byte block. This |
|
|
|
|
relocation type is only valid for segments with the class CODE. |
|
|
|
INPAGE |
Specifies a segment which must be contained in a 256Byte page. |
|
|
|
OFFS offset |
Specifies an absolute segment. The segment is placed at the starting |
|
4 |
|
|
address of the memory class plus the specified offset. The advantage |
|
|
|
compared to the AT relocation type is that the start address can be |
|
|
|
|
modified with the Lx51 linker/locater control CLASSES. Refer to the |
|
|
|
|
“CLASSES” on page 336 for more information. |
|
|
|
|
OVERLAYABLE |
Specifies that the segment can share memory with other segments. |
|
|
|
|
Segments declared with this relocation type can be overlaid with other |
|
|
|
|
segments which are also declared with the OVERLAYABLE relocation |
|
|
|
|
type. When using this relocation type, the segment name must be |
|
|
|
|
declared according to the C251, CX51, C51 or PL/M-51 segment naming |
|
|
|
|
rules. Refer to the C Compiler User’s Guide for more information. |
|
|
|
INSEG |
Specifies a segment which must be contained in a 64KByte segment. |
|
Shaded directives and options are available only in AX51 and A251.
Keil Software — A51/AX51/A251 Macro Assembler and Utilities |
109 |
|
|
Allocation Type
The optional allocation type defines the allocation operation that may be performed by the Linker/Locator. The following table lists the valid allocation types:
|
Allocation Type |
Description |
|
|
|
|
BIT |
|
Specify bit alignment for the segment. Default for all segments with the |
|
|
|
|
|
class BIT. |
|
|
|
BYTE |
|
Specify byte alignment for the segment. Default for all segments except of |
|
|
|
|
|
BIT. |
|
|
|
WORD |
|
Specify word alignment for the segment. |
|
|
|
DWORD |
|
Specify dword alignment for the segment. |
|
|
|
PAGE |
|
Specify a segment whose starting address must be on a 256Byte page |
|
|
|
|
|
boundary. |
|
|
|
BLOCK |
|
Specify a segment whose starting address must be on a 2048Byte block |
|
|
|
|
|
boundary. |
|
|
|
|
|
4 |
||
|
SEG |
|
Specify a segment whose starting address must be on a 64KByte segment |
|
|
|
|
|
boundary. |
|
|
|
Examples for Segment Declarations |
|
|||
|
|
||||
|
|
|
|
|
|
|
IDS |
SEGMENT |
IDATA |
|
|
Defines a segment with the name IDS and the memory class IDATA.
MYSEG SEGMENT CODE AT 0FF2000H
Defines a segment with the name MYSEG and the memory class CODE to be located at address 0FF2000H.
HDSEG |
SEGMENT |
HDATA INSEG DWORD |
Defines a segment with the name HDSEG and the memory class HDATA. The segment is located within one 64KByte segment and is DWORD aligned.
XDSEG |
SEGMENT |
XDATA PAGE |
Defines a segment with the name XDSEG and the memory class XDATA. The segment is PAGE aligned, this means it starts on a 256Byte page.
Shaded directives and options are available only in AX51 and A251.
