×
嵌入式 > 嵌入式开发 > 详情

A51中段和RSEG用法

发布时间:2020-08-04 发布时间:
|
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:



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

热门文章 更多
mini 2440 test 的Delay函数分析