<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          A51中段和RSEG用法

          作者: 時(shí)間:2016-11-26 來(lái)源:網(wǎng)絡(luò) 收藏
          RSEG是段選擇指令,要想明白它的意思就要了解段的意思。

          段是程序代碼或數(shù)據(jù)對(duì)象的存儲(chǔ)單位。程序代碼放到代碼段,數(shù)據(jù)對(duì)象放到數(shù)據(jù)段。段分兩種,一是絕對(duì)段,一是再定位段。絕對(duì)段在匯編語(yǔ)言中指定,在用L51聯(lián)接的時(shí)候,地址不會(huì)改變。用于如訪(fǎng)問(wèn)一個(gè)固定存儲(chǔ)器的i/o,或提供中斷向量的入口地址。而再定位段的地址是浮動(dòng)的。它的地址由L51對(duì)程序模塊連接時(shí)決定,C51對(duì)源程序編譯所產(chǎn)生的段都是再定位段,它都有段名和存儲(chǔ)類(lèi)型。絕對(duì)段沒(méi)有段名。

          本文引用地址:http://www.ex-cimer.com/article/201611/321759.htm

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

          例如,你用C寫(xiě)了一個(gè)函數(shù)void test_fun(void) { …} ,存在test.c中,用編譯器編譯以后,在SRC FILE中會(huì)看到:

          ?PR?test_fun?TEST SEGMENT CODE //(函數(shù)放到代碼段中)

          寫(xiě)這個(gè)函數(shù)體的時(shí)候:

          RSEG ?PR?test_fun?TEST //選擇已定位的代碼段為當(dāng)前段

          test_fun:

          ……//代碼

          所以函數(shù)的表達(dá)模式是這樣:?PR?函數(shù)名?文件名

          而函數(shù)名又分:

          1:無(wú)參函數(shù)?PR?函數(shù)名?文件名

          2:有參函數(shù)?PR?_函數(shù)名?文件名

          3:再入函數(shù)?PR?_?函數(shù)名?文件名

          又例如 你定義了全局變量

          unsigned char data temp1,temp2;

          unsigned char xdata temp3;

          在test.c文件中,編譯器會(huì)為每個(gè)文件分0到多個(gè)全局?jǐn)?shù)據(jù)段,相同類(lèi)型的全局變量被存到同一段中。所以上面會(huì)編譯成如下:

          RSEG ?DT? TEST

          . temp1: DS 1

          . temp2: DS 1

          ;

          RSEG ?XD? TEST

          . temp3: DS 1

          //下面是各個(gè)類(lèi)型的數(shù)據(jù)全局段的表示

          ?CO?文件名//常數(shù)段

          ?XD? FILE_NAME//XDATA數(shù)據(jù)段

          ?DT? FILE_NAME//DATA數(shù)據(jù)段

          ?ID? FILE_NAME//IDATA…..

          ?BI? FILE_NAME// BIT …..

          ?BA? FILE_NAME//BDATA….

          ?PD? FILE_NAME//PDATA…..

          看到這里大家應(yīng)該明白段的意思了吧。也許你會(huì)問(wèn),這有什么作用哪?它就是用在當(dāng)你需要用匯編語(yǔ)言寫(xiě)一部份程序的時(shí)候,把匯編寫(xiě)的函數(shù)放在這個(gè)文件中,改名xxx.a51,按上面的規(guī)則寫(xiě)。編譯就好。

          既然知道了段的意思,現(xiàn)在我們回到SEG的用法上來(lái)。

          A51中有兩種段選擇指令:再定位段選擇指令和絕對(duì)段選擇指令.它們用來(lái)選擇當(dāng)前段是再定位段還是絕對(duì)段。使用不同的段選擇指令,將使程序定位在不同的地址空間之內(nèi)。

          1:再定位段的選擇指令是:RSEG段名

          它用來(lái)選擇一個(gè)在前面已經(jīng)定義過(guò)的再定位段作為當(dāng)前段。

          用法就像我們上面的例子,先聲明了一個(gè)函數(shù)段,后面寫(xiě)這個(gè)函數(shù)段。

          2:絕對(duì)段選擇指令

          CSEG [AT絕對(duì)地址表達(dá)式] //絕對(duì)代碼段

          DSEG [AT絕對(duì)地址表達(dá)式] //內(nèi)部絕對(duì)數(shù)據(jù)段

          XSEG [AT絕對(duì)地址表達(dá)式] //外部絕對(duì)數(shù)據(jù)段

          ISEG [AT絕對(duì)地址表達(dá)式] //內(nèi)部間接尋址絕對(duì)數(shù)據(jù)段

          BSEG [AT絕對(duì)地址表達(dá)式] //絕對(duì)位尋址段

          它們的用法我舉一個(gè)例子:

          例如我們寫(xiě)串口中斷程序,起始地址是0x23.就這樣寫(xiě)

          CSEG AT 0X23

          LJMP serialISR

          RSEG ?PR?serialISR?TEST

          . serialISR:



          關(guān)鍵詞: A51中段RSEG用

          評(píng)論


          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();