Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
70
Добавлен:
14.04.2015
Размер:
2.03 Mб
Скачать

102

Chapter 4. Assembler Directives

 

 

Segment Directives

A segment is a block of code or data memory the assembler creates from code or data in an x51 assembly source file. How you use segments in your source modules depends on the complexity of your application. Smaller applications need less memory and are typically less complex than large multi–module applications.

The x51 CPU has several specific memory areas. You use segments to locate program code, constant data, and variables in these areas.

Location Counter

Ax51 maintains a location counter for each segment. The location counter is a pointer to the address space of the active segment. It represents an offset for

4 generic segments or the actual address for absolute segments. When a segment is first activated, the location counter is set to 0. The location counter is changed after each instruction by the length of the instruction. The memory initialization and reservation directives (i.e. DS, DB or DBIT) change the value of the location counter as memory is allocated by these directives. The ORG directive sets a new value for the location counter. If you change the active segment and later return to that segment, the location counter is restored to its previous value. Whenever the assembler encounters a label, it assigns the current value of the location counter and the type of the current segment to that label.

The dollar sign ($) indicates the value of the location counter in the active segment. When you use the $ symbol, keep in mind that its value changes with each instruction, but only after that instruction has been completely evaluated. If you use $ in an operand to an instruction or directive, it represents the address of the first byte of that instruction.

The following sections describe the different types of segments.

Shaded directives and options are available only in AX51 and A251.

Keil Software — A51/AX51/A251 Macro Assembler and Utilities

103

 

 

Generic Segments

Generic segments have a name and a class as well as other attributes. Generic segments with the same name but from different object modules are considered to be parts of the same segment and are called partial segments. These segments are combined at link time by the linker/locator.

Generic segments are created using the SEGMENT directive. You must specify the name of the segment, the segment class, and an optional relocation type and alignment type when you create a relocatable segment.

Example

MYPROG

SEGMENT

CODE

 

 

defines a segment named MYPROG with a memory class of CODE. This means

 

that data in the MYPROG segment will be located in the code or program area of

 

 

the x51. Refer to “SEGMENT” on page 106 for more information on how to

4

declare generic segments.

 

Once you have defined a relocatable segment name, you must select that segment

 

using the RSEG directive. When RSEG is used to select a segment, that

 

segment becomes the active segment that Ax51 uses for subsequent code and

 

data until the segment is changed with RSEG or with an absolute segment

 

directive.

 

 

 

Example

 

 

 

 

 

 

 

 

RSEG

MYPROG

 

 

 

will select the MYPROG segment that is defined above.

Typically, assembly routines are placed in generic segments. If you interface your assembly routines to C, all of your assembly routines must reside in separate generic segments and the segment names must follow the standards used by Cx51. Refer to the Compiler User’s Guide for more information on interfacing assembler programs to C.

Shaded directives and options are available only in AX51 and A251.

104

Chapter 4. Assembler Directives

 

 

Stack Segment

The x51 architecture uses a hardware stack to store return addresses for CALL instructions and also for temporary storage using the PUSH and POP instructions. An 8051 application that uses these instructions must setup the stack pointer to an area of memory that will not be used by other variables.

For the classic 8051 a stack segment must be defined and space must be reserved as follows. This definition also works for the extended 8051 and the 251, however these controllers typically support stack also in other areas.

STACK

SEGMENT

IDATA

 

 

RSEG

STACK

; select the stack segment

 

DS

10h

; reserve 16 bytes of space

Then, you must initialize the stack pointer early in your program.

4

CSEG

AT

0

; RESET Vector

 

JMP

STARTUP

; Jump to startup code

STARTUP:

 

SP,#STACK - 1

; code executed at RESET

 

MOV

; load Stack Pointer

For the Philips 80C51MX or the Intel/Atmel WM 251 a stack segment may be defined and space must be reserved as follows.

STACK

SEGMENT

EDATA

 

 

RSEG

STACK

; select the stack segment

 

DS

100h

; reserve 256 bytes of space

Then, you must initialize the stack pointer early in your program.

CSEG

AT

0

; RESET Vector

 

JMP

STARTUP

; Jump to startup code

STARTUP:

 

 

; code executed at RESET

; Stack setup for Philips 80C51MX

 

 

 

ORL

MXCON,#0x02

; enable extended stack

 

MOV

SPE,#HIGH (STACK

- 1)

; load Stack high

 

MOV

SP,#LOW (STACK -

1)

; load Stack low

; for Intel/Atmel WM 251

DR60,#STACK - 1

 

 

 

MOV

; load Stack Pointer

If you are interfacing assembly routines to C, you probably do not need to setup the stack. This is already done for you in the C startup code.

Shaded directives and options are available only in AX51 and A251.

Keil Software — A51/AX51/A251 Macro Assembler and Utilities

105

 

 

Absolute Segments

Absolute segments reside in a fixed memory location. Absolute segments are created using the CSEG, DSEG, XSEG, ISEG, and BSEG directives. These directives allow you to locate code and data or reserve memory space in a fixed location. You use absolute segments when you need to access a fixed memory location or when you want to place program code or constant data at a fixed memory address. Refer to the CSEG, DSEG, ISEG, XSEG, ISEG directives for more information on how to declare absolute segments.

After reset, the 8051 variants begin program executing at CODE address 0. The Intel/Atmel WM 251 starts execution at address FF0000. Some type of program code must reside at this address. You can use an absolute segment to force program code into this address. The following example is used in the Cx51 startup routines to branch from the reset address to the beginning of the initialization code.

.

 

 

4

.

 

 

.

CSEG

AT 0

 

 

RESET_VEC:

LJMP

STARTUP

 

.

 

 

 

.

 

 

 

.

 

 

 

The program code that we place at address 0000h (for 251 at address FF0000h) with the CSEG AT 0 directive performs a jump to the STARTUP label.

AX51 and A251 supports absolute segment controls for compatibility to A51. AX51 and A251 translates the CSEG, DSEG, XSEG, ISEG and BSEG directives to a generic segment directive.

Default Segment

By default, Ax51 assumes that the CODE segment is selected and initializes the location counter to 0000h (FF0000h) when it begins processing an assembly source module. This allows you to create programs without specifying any relocatable or absolute segment directives.

Shaded directives and options are available only in AX51 and A251.

Соседние файлы в папке HLP