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:
…