新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > A51中段和RSEG用法

        A51中段和RSEG用法

        作者: 時間:2016-11-26 來源:網絡 收藏
        RSEG是段選擇指令,要想明白它的意思就要了解段的意思。

        段是程序代碼或數據對象的存儲單位。程序代碼放到代碼段,數據對象放到數據段。段分兩種,一是絕對段,一是再定位段。絕對段在匯編語言中指定,在用L51聯接的時候,地址不會改變。用于如訪問一個固定存儲器的i/o,或提供中斷向量的入口地址。而再定位段的地址是浮動的。它的地址由L51對程序模塊連接時決定,C51對源程序編譯所產生的段都是再定位段,它都有段名和存儲類型。絕對段沒有段名。

        本文引用地址:http://www.104case.com/article/201611/321759.htm

        說了這么多,大家可能還是不明白段是什么意思。別急,接著往下看。

        例如,你用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:



        關鍵詞: A51中段RSEG用

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 清徐县| 额济纳旗| 揭阳市| 嵊泗县| 元氏县| 剑阁县| 吉安县| 洛扎县| 郎溪县| 锦屏县| 泾川县| 西乡县| 麻栗坡县| 漾濞| 通渭县| 宜良县| 镶黄旗| 阿鲁科尔沁旗| 桑日县| 重庆市| 内江市| 舒城县| 通化县| 壶关县| 延长县| 公安县| 游戏| 北碚区| 万全县| 宜川县| 铜山县| 云梦县| 和田县| 方城县| 西藏| 明溪县| 赤壁市| 亚东县| 称多县| 富锦市| 东阳市|