基于Keil a51汇编 —— 程序模板文件以及规则

程序模板文件

下面的代码模板包含有关如何编写自己的程序集模块的指南和提示。此模板文件模板。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?programCODE可执行程序代码代码
?CO?codeCODE程序存储区的常数数据
?BI?bitBIT内部数据区的位寻址数据
?BA?bdataBDATA内部数据区的可位寻址数据
?DT?dataDATA内部数据区 (SMALL存储模式)
?FD?farfar存储区(RAM空间)
?FC?const farFAR存储区(ROM空间)
?ID?idaraIDATA间接寻址内部数据区
?PD?pdataXDATA INPAGE外部数据区的分页数据 (COMPACT存储模式)
?XD?xdataXDATAXDATA存储区(ram空间,LARGE存储模式)
?XC?const xdataCODEXDATA存储区(rom空间)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值