程序模板文件
下面的代码模板包含有关如何编写自己的程序集模块的指南和提示。此模板文件模板。A51 在文件夹 \C51\ASM 中提供。
$NOMOD51 ; 禁用预定义的 8051 寄存器
#include <reg52.h> // 包含头文件
;
;根据需要更改小写名称。
;该汇编模板让你了解如何使用 A251/A51汇编器。 您不必以这种方式构建每个模块,这只是举例说明。
;除了文件末尾的 END 语句外,所有条目都是可选的。
;如果使用此模板,请确保删除任何未使用的段声明、以及未使用的变量空间和汇编指令。
;本文件无法提供 A251/A51 汇编程序的所有可能用途。
;
; Module name (模块名)
;
NAME module_name ;通用汇编文件名
;
; 在这里,您可以导入其他模块的符号。
;
EXTRN CODE (code_symbol) ; 可以是code 段或者带有code指令的函数入口声明
EXTRN DATA (data_symbol) ; data数据声明
EXTRN BIT (bit_symbol) ; Bit 位声明
EXTRN XDATA (xdata_symbol) ; XDATA 数据声明
EXTRN NUMBER (typeless_symbol); 使用EQU or SET定义的声明
;
; 可以一次性定义多个声明
;
EXTRN CODE (sub_routine1, sub_routine2), DATA (variable_1)
;
; 在列表文中强制分页
;
$EJECT
;
; 声明此处的符号可供其他模块使用
;
PUBLIC data_variable
PUBLIC code_entry
PUBLIC typeless_number
PUBLIC xdata_variable
PUBLIC bit_variable
;
; 可以一次性定义多个声明
;
PUBLIC data_variable1, code_table, typeless_num1, xdata_variable1
;
; Put the STACK segment in the main module.
;
?STACK SEGMENT IDATA ; 在IDATA ram中定义Stack
RSEG ?STACK ; 切换到?STACK
DS 5 ; 保留5个STACK空间
$EJECT
;
; 将段落和变量声明放在此处
;
;
; DATA SEGMENT(数据段) DATA RAM 中的预留空间 如果不使用,则删除该数据段。
;
data_seg_name SEGMENT DATA ; 声明在DATA RAM中的全局变量数据.
RSEG data_seg_name ; 切换至该段
data_variable: DS 1 ; 定义变量data_variable并申请1个字节空间
data_variable1: DS 2 ; 定义变量data_variable1并申请2个字节数组
;
; DATA SEGMENT(数据段) DATA RAM 中的预留空间 如果不使用,则删除该数据段。
;
data_seg_name SEGMENT DATA OVERLAYABLE ; 声明在DATA RAM中的局部变量数据.
RSEG data_seg_name ; 切换至该段
data_variable: DS 1 ; 定义变量data_variable并申请1个字节空间
data_variable1: DS 2 ; 定义变量data_variable1并申请2个字节数组
;
; XDATA SEGMENT 在 XDATA RAM 中预留空间 如果不使用,则删除该段。
;
xdata_seg_name SEGMENT XDATA ; 声明XDATA RAM段.
RSEG xdata_seg_name ; 切换至该段
xdata_variable: DS 1 ;
xdata_array: DS 500 ; 定义变量xdata_array并申请500个字节数组
;
; INPAGE XDATA SEGMENT 在 XDATA RAM 页面中保留空间(页面大小:256 字节)
; INPAGE 段适用于 @R0 寻址方法。
; 无用则删除
;
page_xdata_seg SEGMENT XDATA INPAGE
RSEG xdata_seg_name
xdata_variable1:DS 1
;
; ABSOLUTE XDATA SEGMENT 在 XDATA RAM 中保留绝对地址空间。
; ABSOLUTE 段对内存映射 I/O 非常有用。
;
XSEG AT 8000H ; 定位到位于XDATA 中8000H的地址
XIO: DS 1
XCONFIG: DS 1
;
;BIT SEGMENT 保留 BIT RAM 中的空间 如果未使用,则删除该段。
;
bit_seg_name SEGMENT BIT
RSEG bit_seg_name
bit_variable: DBIT 1 ; 申请1Bit的位空间给bit_variable
bit_variable1: DBIT 4
;
; 在此处添加常量(无类型)数字。
;
typeless_number EQU 0DH
typeless_num1 EQU typeless_number(8)
$EJECT
;
;提供一个 LJMP,以主模块中的复位地址(地址 0)为起点
; 您可以将这种样式用于中断服务例程。
;
CSEG AT 0 ; 代码初始0地址
LJMP start
;
; CODE SEGMENT(代码段) 在 CODE ROM 中为汇编指令预留空间。
;
code_seg_name SEGMENT CODE
RSEG code_seg_name
USING 0 ; 使用寄存器bank0
start: MOV SP,#?STACK 1 ; 赋值指针
;
;在此处插入您的汇编程序。 注意,下面的代码是非功能性的。
;
ORL IE,#82H ; enable interrupt system (timer 0)
SETB TR0 ; enable timer 0
repeat_label: MOV A,data_symbol
ADD A,#typeless_symbol
CALL code_symbol
MOV DPTR,#xdata_symbol
MOVX A,@DPTR
MOV R1,A
PUSH AR1
CALL sub_routine1
POP AR1
ADD A,R1
JMP repeat_label
code_entry: CALL code_symbol
RET ;程序结束
code_table: DW repeat_label
DW code_entry
DB typeless_number
DB 0
$EJECT
;
; 要包含中断服务例程,请向 ISR 提供一个 LJMP跳转到中断服务程序
;
CSEG AT 0BH ; 0BH timer0中断入口
LJMP timer0int
;
; 定义中断服务代码段
;
int0_code_seg SEGMENT CODE
RSEG int0_code_seg
USING 1 ; 使用寄存器bank1
timer0int: PUSH PSW
MOV PSW,#08H ; register bank 1
PUSH ACC
MOV R1,data_variable
MOV DPTR,#xdata_variable
MOVX A,@DPTR
ADD A,R1
MOV data_variable1,A
CLR A
ADD A,#0
MOV data_variable1+1,A
POP ACC
POP PSW
RETI
;
; END必须有
;
END ; 文件结束
SEGMENT段名命名规
?存储器类型区分符?<函数名>?模块名 SEGMENT [段类型]
例:
?PR ? FUNCTION_NAME ? MODULE_NAME Segment Code
全局变量与局部变量申明
全局变量
?存储器类型区分符? 模块名 SEGMENT 段类型 , 例:
?DT ? MAIN SEGMENT DATA
局部变量
- 局部数据段的声明形式为:? 储存器类型区符?函数名?模块名 SEGMENT 段类型 OVERLAYABLE
- 其中储存器类型的确定与全局数据段中的规则相同。当汇编程序按照C编译器编译的代码规则编写连接器将能对程序数据段进行覆盖分析。声明中的“OVERLAYABLE”标志就是用来打开段的覆盖属性,允许连接器进行覆盖分析。没有这个属性则段中的变量将一直占用这些空间,这样会降低储存器利用效率。
?DT ? main ? MAIN SEGMENT DATA OVERLAYABLE
类型列表:
段前缀 | C51存储类型 | 汇编语言段类型 | 说明 |
---|---|---|---|
?PR? | program | CODE | 可执行程序代码代码 |
?CO? | code | CODE | 程序存储区的常数数据 |
?BI? | bit | BIT | 内部数据区的位寻址数据 |
?BA? | bdata | BDATA | 内部数据区的可位寻址数据 |
?DT? | data | DATA | 内部数据区 (SMALL存储模式) |
?FD? | far | far存储区(RAM空间) | |
?FC? | const far | FAR存储区(ROM空间) | |
?ID? | idara | IDATA | 间接寻址内部数据区 |
?PD? | pdata | XDATA INPAGE | 外部数据区的分页数据 (COMPACT存储模式) |
?XD? | xdata | XDATA | XDATA存储区(ram空间,LARGE存储模式) |
?XC? | const xdata | CODE | XDATA存储区(rom空间) |