×
单片机 > 单片机程序设计 > 详情

A51中段和RSEG用法

发布时间:2020-05-28 发布时间:
|
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:



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32单片机的复用端口初始化的步骤及方法