新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ASM5無參數化調用C51函數的實現

        ASM5無參數化調用C51函數的實現

        作者: 時間:2012-03-08 來源:網絡 收藏

        這些小模塊用匯編實現起來不僅容易,而且程序員可以清楚地了解到各個模塊的出入口及其相應的功能,實現對程序空間的充分配置。最后用來實現車速的計算模塊CALL1()。以前用匯編編寫的近400行代碼,一下子被壓縮到20~30行(真正的計算代碼僅9行),不僅簡短易懂,而且幾乎就不需要調試了。

        下面的代碼是計算模塊CALL1()及其需要的絕對地址定義。

        #pragma code small

        #include absacc.h>

        #include math.h>

        #define PI 3.1415926

        #define NCIRCLE DBYTE[0x3A] ;定義放置轉速的絕對地址

        #define DIRECT1 DBYTE[0x70] ;定義放置輪徑千位的絕對地址

        #define DIRECT2 DBYTE[0x71] ;定義放置輪徑百位的絕對地址

        #define DIRECT3 DBYTE[0x72] ;定義放置輪徑十位的絕對地址

        #define DIRECT4 DBYTE[0x73] ;定義放置輪徑個位的絕對地址

        #define VELOCITY1 DBYTE[0x74] ;定義返回車速的千位絕對地址

        #define VELOCITY2 DBYTE[0x75] ;定義返回車速的百位絕對地址

        #define VELOCITY3 DBYTE[0x76] ;定義返回車速的十位絕對地址

        #define VELOCITY4 DBYTE[0x77] ;定義返回車速的個位絕對地址

        void call1()

        {

        float data result;

        int data DIRECT;

        DIRECT=DIRECT1*1000+DIRECT2*100+DIRECT3*10+DIRECT4;

        result=(DIRECT/1000.0)*PI*NCIRCLE*3.6;

        VELOCITY1=result/100;

        Result=result-VELOCITY1*100;

        VELOCITY2=result/10;

        result=result-CELOCITY 2*10;

        VELOCITY3=result;

        result=result-VELOCITY3;

        VELOCITY4=result*10;

        }

        在本例中定義了絕對地址空間70h~77H和3AH。其中3AH存放采樣轉速值輸入模塊輸入的轉速;70H~73H的地址空間中存放鍵盤輸入中斷模塊中鍵盤輸入的輪徑值;而地址為74H~77H的空間中則存放計算模塊中的車速計算返回值。盡管需要傳遞和返回的參數比較多,但通過這些絕對地址的定義,完全解決了原來復雜的匯編與C51之間的調用接口配置。計算模塊中需要使用轉速和輪徑值時,將自動從絕對地址3AH和70H~73H中取值;在循環顯示車速和輪徑值的主程序模塊中則直接讀取絕對地址空間70H~77H的各個數據進行循環顯示。當然,程序員可以根據自己的空間配置另外定義這些絕對地址。

        以上程序代碼均已在Dais-52.196P仿真器上順利調試通過。

        由上面的簡單程序可以看出這種方法的優越性和有效:從程序代碼看,無論是編寫C51子程序還是匯編主程序,都與編寫純C51函數或者純匯編主程序的格式完全一樣,從根本上簡化了C51與匯編函數之間的接口編程,提高了程序調用的效率;充分利用了匯編與高測驗各自的優點,開發、調試快速方便,通用性強,尤其適合于初學者。對于復雜程序,同樣可以利用無參數化方法來幫助實現。這對于提高單片機應用程序的開發效率很有意義。

        實質上在C51函數中定義了幾個全局變量(絕對地址),依靠它們直接完成參數值的傳遞和返回值的調用,相當于一種程序員自定義的傳遞方式,拋棄了傳統C與匯編之間的接口約定。只要程序員安排得當,還可以進一步人工實現C51中的動態覆蓋重用,提高RAM區的利用效率。由上也可看出:方法要在ASM匯編調用C51函數時才分依速無參數化思想,就違背了利用C51編程,過衷,得不償失。當然,如果開發人員已經對C51與匯編函數之間的參數傳遞接口很熟悉,完全可以按接口約定或者由編譯器自動完成參數的傳遞


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 乐都县| 那曲县| 宜良县| 宜阳县| 屏山县| 长垣县| 花垣县| 香港 | 辛集市| 屯留县| 东兴市| 措美县| 普格县| 略阳县| 化德县| 武夷山市| 常熟市| 徐水县| 鹿泉市| 鲜城| 凭祥市| 金溪县| 柏乡县| 石首市| 泽州县| 从化市| 姜堰市| 潼关县| 富裕县| 达州市| 五原县| 枝江市| 呼伦贝尔市| 松原市| 宜城市| 通渭县| 民乐县| 淳安县| 芜湖市| 福州市| 丰城市|