这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » A51学习笔记

共1条 1/1 1 跳转至

A51学习笔记

助工
2014-11-13 19:36:31     打赏
不用特意写 AJMP LJMP ,直接写 JMP 就行,KEIL 编译器会自动处理

如果使用单文件汇编模式,则基本使用 
ORG 00H
END 
的架构就可以在中间写代码了。

如果采用模块化编程,则可以使用多个编译指示符来控制生成重点还是谈谈模块话编程吧。
因为普通编程实在是没啥好说的,直接一个文件写完所有

CSEG 定义一个 absolute segment,是固定的,具体用法和 ORG 其实没啥区别,混用也没啥压力
CSEG AT 200H
其实跟 ORG 是一个道理的,定位到一个绝对地址。不过既然使用了可从定位的形式,那当然就要
忘记ORG了。

可以通过绝对定位段来指定需要的地址
CSEG AT 00H
DSEG AT 40H 


Relocate segment 是很有好处的,例如将模块的空间分配交给链接器 loader 来处理,
可以多人合作方便程序以模块的形式,不会将地址空间搞重复
方便分配堆栈空间

对于复位向量和中断向量则使用 CSEG 定义的绝对地址定位,格式是
CSEG AT 0003h

SEGMENT 定义一个段,然后 RSEG 选择该段就OK了

PROG    SEGMENT        CODE
    RSEG    PROG

而堆栈则可以这样做

STACK    SEGMENT        IDATA
    RSEG    STACK
    DS    10H ; 预留16个字节

PROG    SEGMENT        CODE
STACK    SEGMENT        IDATA
CONST    SEGMENT        CODE
INTVET    SEGMENT        CODE
VAR    SEGMENT        DATA
BITVAR    SEGMENT        BIT

一般来说需要这些段。因为变量是可以自动分配地址的,所以用可从定位段是有很大优势的
只需要预留位置就行了,不需要关心变量的具体地址。
具体用法:

    ; allocate variable
    RSEG    VAR
DUMMY:    DS    1

    ; allocate vit variable
    RSEG    BITVAR
DPY_SW:        DBIT     1
INT_FLAG:     DBIT     1


宏定义如下,带参数,很简单,例如
LOAD_R0 MACRO R0_Val
        MOV R0, #R0_Val
        ENDM
调用时则
LOAD_R0 20H


基本上新鲜的东西就这么多了,而那些指令集的用法,随便一本C51的书都有说了。

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]