jinyuewei的笔记 https://bbs.21ic.com/?773741 [收藏] [复制] [RSS] 记录自己学习嵌入式的点点滴滴!和各大嵌入式爱好者一起交流和进步!

日志

A51 中段和RSEG用法

已有 802 次阅读2012-7-8 13:36 |个人分类:程序设计经验|系统分类:单片机

RSEG是段选择指令,要想明白它的意思就要了解段的意思。


        段是程序代码或数据对象的存储单位。程序代码放到代码段,数据对象放到数据段。段分两种,一是绝对段,一是再定位段。绝对段在汇编语言中指定,在用L51联接的时候,地址不会改变。用于如访问一个固定存储器的i/o,或提供中断向量的入口地址。而再定位段的地址是浮动的。它的地址由L51对程序模块连接时决定,C51对源程序编译所产生的段都是再定位段,它都有段名和存储类型。绝对段没有段名。


        说了这么多,大家可能还是不明白段是什么意思。别急,接着往下看。


        例如,你写用C写了一个函数void test_fun(void) { …} ,存在test.c中,用编译器编译以后,SRC FILE中看到:


?PR?test_fun?TEST SEGMENT CODE                //(函数放到代码段中)


        写这个函数体的时候:


RSEG ?PR?test_fun?TEST                 //选择已定位的代码段为当前段


test_fun:


     ……//代码


        所以函数的表达模式是这样:


        ?PR?函数名?文件名


        而函数名又分:


1:无参函数?PR?函数名?文件名


2:有参函数?PR?_函数名?文件名


3:再入函数?PR?_?函数名?文件名


        又例如 你定义了全局变量


unsigned char data temp1,temp2;


unsigned char xdata temp3;


        在test.c文件中,编译器会为每个文件分0到多个全局数据段,相同类型的全局变量被存到同一段中。所以上面会编译成如下:


RSEG   ?DT? TEST


. temp1: DS 1


. temp2: DS 1


;


RSEG   ?XD? TEST


. temp3: DS 1



        //下面是各个类型的数据全局段的表示


?CO?文件名 //常数段


?XD? FILE_NAME //XDATA数据段


?DT? FILE_NAME //DATA数据段


?ID? FILE_NAME //IDATA…..


?BI? FILE_NAME // BIT …..


?BA? FILE_NAME //BDATA….


?PD? FILE_NAME //PDATA…..


        看到这里大家应该明白段的意思了吧。也许你会问,这有什么作用哪?它就是用在当你需要用汇编语言写一部份程序的时候,把汇编写的函数放在这个文件中,改名xxx.a51,按上面的规则写。编译就好。


        既然知道了段的意思,现在我们回到SEG的用法上来。


        A51中有两种段选择指令: 再定位段选择指令 和 绝对段选择指令.它们用来选择当前段是再定位段还是绝对段。使用不同的段选择指令,将使程序定位在不同的地址空间之内。


1:再定位段的选择指令是:RSEG段名


        它用来选择一个在前面已经定义过的再定位段作为当前段。用法就像我们上面的例子,先申明了一个函数段,后面写这个函数段。


2:绝对段选择指令


CSEG [AT绝对地址表达式] //绝对代码段


DSEG [AT绝对地址表达式] //内部绝对数据段


XSEG [AT绝对地址表达式] //外部绝对数据段


ISEG [AT绝对地址表达式] //内部间接寻址绝对数据段


BSEG [AT绝对地址表达式] //绝对位寻址段


        它们的用法我举一个例子:


        例如我们写串口中断程序,起始地址是0x23.就这样写


CSEG AT 0X23


LJMP serialISR


RSEG ?PR?serialISR?TEST


. serialISR:


            ...


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)