基于Keil a51汇编 —— 程序模板文件

程序模板文件

下面的代码模板包含有关如何编写自己的程序集模块的指南和提示。此模板文件模板。A51 在文件夹 \C51\ASM 中提供。

$NOMOD51                ; 禁用预定义的 8051 寄存器
#include       // 包含头文件

;
;根据需要更改小写名称。
;该汇编模板让你了解如何使用 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个字节数组

;
; 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             ; 文件结束

你可能感兴趣的:(Keil,A51汇编编程,汇编,Keil,A51)