新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 關于在 KEIL C51 中嵌入匯編以及C51與A51間的相互調用

        關于在 KEIL C51 中嵌入匯編以及C51與A51間的相互調用

        作者: 時間:2012-06-29 來源:網絡 收藏


        參考文獻:
        1.徐愛鈞,彭秀華。單片機高級語言windows環境編程與應用,電子工業出版社

        .................................................................................................................
        keil中函數調用c51函數 [ycong_kuang]


        第一步在工程里多了一個被調用的c51的函數文件(c51func.c),至于函數還是先用c51編寫出主體
        (a51func.c),這樣匯編程序接口和段都交給編譯器處理,你只管在編譯成匯編代碼后按你的要求改寫匯編代碼就行了。

        例程如下:
        //main.c
        #include reg51.h >

        #define uchar unsigned char
        #define uint unsigned int

        extern uint AFUNC(uchar v_achr,bit v_bflag);

        void main()
        {
        bit BFLAG;
        uchar mav_chr;
        uint mvintrslt;

        mav_chr=0xd4; BFLAG=1;
        mvintrslt=AFUNC(mav_chr,BFLAG);
        }

        //a51FUNC.c

        #define uchar unsigned char
        #define uint unsigned int

        extern uint CFUNC(uint);

        uint AFUNC(uchar v_achr,bit v_bflag) //c51寫的匯編函數,最終要變成匯編代碼
        {
        uchar tmp_vchr;
        uint tp_vint;

        tmp_vchr=v_achr;
        tp_vint=(uint)v_bflag;

        return CFUNC(tp_vint); //這里調用一個c51函數
        }

        //c51FUNC.c

        #define uchar unsigned char
        #define uint unsigned int

        uint CFUNC(uint v_int) //被匯編函數調用c51函數
        {
        return v_int2;
        }

        第二步是按89852帖子的step2,3,4把用c51寫的(匯編)函數變成a51文件(今天我試了一下step3可以不要)例程編譯結果如
        下:
        ; .a51func.SRC generated from: a51func.c
        NAME A51FUNC

        ?PR?_AFUNC?A51FUNC SEGMENT CODE
        ?DT?_AFUNC?A51FUNC SEGMENT DATA OVERLAYABLE
        ?BI?_AFUNC?A51FUNC SEGMENT BIT OVERLAYABLE
        EXTRN CODE (_CFUNC)
        PUBLIC ?_AFUNC?BIT
        PUBLIC _AFUNC

        RSEG ?DT?_AFUNC?A51FUNC
        ?_AFUNC?BYTE:
        tmp_vchr?042: DS 1

        RSEG ?BI?_AFUNC?A51FUNC
        ?_AFUNC?BIT:
        v_bflag?041: DBIT 1
        ; //a51FUNC.c
        ;
        ; #define uchar unsigned char
        ; #define uint unsigned int
        ;
        ; extern uint CFUNC(uint);
        ;
        ; uint AFUNC(uchar v_achr,bit v_bflag)

        RSEG ?PR?_AFUNC?A51FUNC
        _AFUNC: ;c51所寫的函數產生的匯編代碼從這里開始
        USING 0
        ; SOURCE LINE # 8
        ;---- Variable 'v_achr?040' assigned to Register 'R7' ----
        ; {
        ; SOURCE LINE # 9
        ; uchar tmp_vchr;
        ; uint tp_vint;
        ;
        ; tmp_vchr=v_achr;
        ; SOURCE LINE # 13
        MOV tmp_vchr?042,R7
        ; tp_vint=(uint)v_bflag;
        ; SOURCE LINE # 14
        MOV C,v_bflag?041
        CLR A
        MOV R6,A
        RLC A
        MOV R7,A
        ;---- Variable 'tp_vint?043' assigned to Register 'R6/R7' ----
        ; 這里說明R6,R7內容就是tp_vint
        ; return CFUNC(tp_vint);
        ; SOURCE LINE # 16
        LCALL _CFUNC ;這里調用了用c51寫的函數
        ; }
        ; SOURCE LINE # 17
        ?C0001:
        RET
        ; END OF _AFUNC

        END

        這個文件就是你的匯編函數所在文件,把函數里面的匯編代碼修改成你所需的匯編函數就ok了。

        建議參考 徐愛鈞,彭秀華所寫的《單片機高級語言windows環境編程與應用》或馬忠梅所寫的
        《單片機的c語言應用程序設計》有關混合語言編程有關章節

        .................................................................................................................
        關于在 中直接嵌入匯編。。。 [Youth]
        有時在C51程序中需要嵌入一些匯編代碼,這時當然可以用通常的作法:
        按照 C51 與匯編的接口寫一個匯編函數,然后在 C51 程序中調用該函數。(此種方法可在論壇里搜索,以前有很多帖子講到,不再
        重復)

        下面介紹直接嵌入匯編代碼的方法:

        1、在 C 文件中要嵌入匯編代碼片以如下方式加入匯編代碼:
        #pragma ASM
        ; Assembler Code Here
        #pragma ENDASM

        2、在 Project 窗口中包含匯編代碼的 C 文件上右鍵,選擇“Options for ...”,點擊右邊的“Generate Assembler SRC File”
        和“Assemble SRC File”,使檢查框由灰色變成黑色(有效)狀態;

        3、根據選擇的編譯模式,把相應的庫文件(如 Small 模式時,是 KeilC51LibC51S.Lib)加入工程中, 該文件必須作為工程的最
        后文件;

        4、編譯,即可生成目標代碼。

        上拉電阻相關文章:上拉電阻原理

        上一頁 1 2 下一頁

        關鍵詞: KEIL C51 匯編

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 六盘水市| 三原县| 莱州市| 英德市| 泸溪县| 康保县| 息烽县| 博湖县| 儋州市| 凤庆县| 香港| 姚安县| 孝义市| 西华县| 冷水江市| 兴安县| 辰溪县| 同仁县| 禄丰县| 县级市| 麻栗坡县| 新津县| 会东县| 垦利县| 肥乡县| 乐都县| 江陵县| 喀喇沁旗| 临泽县| 大田县| 双江| 沂源县| 威信县| 涞源县| 平度市| 六盘水市| 耿马| 虎林市| 十堰市| 昆明市| 南华县|