A51中段和RSEG用法
段是程序代码或数据对象的存储单位。程序代码放到代码段,数据对象放到数据段。段分两种,一是绝对段,一是再定位段。绝对段在汇编语言中指定,在用L51联接的时候,地址不会改变。用于如访问一个固定存储器的i/o,或提供中断向量的入口地址。而再定位段的地址是浮动的。它的地址由L51对程序模块连接时决定,C51对源程序编译所产生的段都是再定位段,它都有段名和存储类型。绝对段没有段名。
说了这么多,大家可能还是不明白段是什么意思。别急,接着往下看。
例如,你用C写了一个函数void test_fun(void) { …} ,存在test.c中,用编译器编译以后,在SRC FILE中会看到:
写这个函数体的时候:
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
?DT? FILE_NAME
?ID? FILE_NAME
?BI? FILE_NAME
?BA? FILE_NAME
?PD? FILE_NAME
看到这里大家应该明白段的意思了吧。也许你会问,这有什么作用哪?它就是用在当你需要用汇编语言写一部份程序的时候,把汇编写的函数放在这个文件中,改名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:
…
A51中段RSEG用 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)