A51 中段和RSEG用法

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:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章