新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > C51與匯編語言混合編程之一

        C51與匯編語言混合編程之一

        作者: 時間:2016-11-09 來源:網絡 收藏
        1、函數內部混合編程

        若想在C語言函數內部使用匯編語言,應使用以下Cx51編譯器控制命令:

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

        #pragma asm

        ;;;Assembly code

        #pragma endasm

        功能作用:

        asm和endasm命令用于將其標記的匯編程序合并到.SRC文件中。這個帶有asm和endasm塊標記的源程序可看作是在線嵌入式匯編程序。從這點來說,此命令有些類似于#define命令。

        具體實現:

        (1)編譯器設置及SRC文件的產生

        .SRC文件在命令行編譯模式下是使用SRC編譯器控制命令產生的,在IDE環境中可以為需要產生SRC文件的C源文件設置特定選項:

        l 右鍵單擊Project Workspace下的文件標簽

        l 選擇Options for file … 項,打開Options – Properties 頁。

        l 選中Generate Assembler SRC file 項

        l 選中Assembler SRC file項

        (2)添加庫文件

        根據選擇的編譯模式,把相應的庫文件添加到工程下面,如在”small”模式下,需將”keilc51libc51s.lib”文件加入工程中。在Keil安裝目錄下的C51LIB 目錄的LIB 文件如下:

        C51S.LIB - 沒有浮點運算的 Small model
        C51C.LIB - 沒有浮點運算的 Compact model
        C51L.LIB - 沒有浮點運算的 Large model
        C51FPS.LIB - 帶浮點運算的 Small model
        C51FPC.LIB - 帶浮點運算的 Compact model
        C51FPL.LIB - 帶浮點運算的 Large model

        若未添加此庫文件,則會提示” UNRESOLVED EXTERNAL SYMBOL ”警告。

        如上設置后,編譯,IDE會生成匯編源文件(.SRC)并由匯編器將此文件轉化成目標文件(.OBJ)。

        注意事項:

        (1) 此時在匯編語言中雖可以加標簽,以執行一些跳轉類指令,但要注意不要與編譯器產生的其他標簽相同。

        (2) 在遵循了Cx51參數的調用規則后,如在向該函數傳遞一char數時,編譯器會將其編譯成通過R7傳遞,此時在匯編語言若直接調用R7,會出現定義的變量(形參)未調用警告。

        2、函數外部混合編程

        具體實現:

        若要將一完整的函數編寫為匯編語言,并可被其它函數調用,此時可以遵循如下過程:

        (1) 源文件的建立

        新建一C源文件如test.c,將其加入工程中,并寫出要實現函數的的啞函數(即寫出函數名及形參,不用給出具體實現,但最好寫出簡單調用形參的代碼,使編譯器不提示 ”定義的變量未被調用”的警告)。

        (2) 從上”具體過程”之(1)。

        (3) 從上”具體過程”之(2)。

        (4) 編譯文件,將test.c 從工程中移除,將生成的test.src文件改名,如test.a51。

        (5) 將test.a51加入工程, 并在其內部書寫具體要實現的匯編代碼。

        (6) 重新編譯整體文件即可。

        注意事項:

        (1) 調用前一定要在所調用的文件內部聲明該函數的存在,寫法應同匯編語言的C函數實現一樣,即test.c 中的函數名稱。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 泰州市| 屏南县| 玉溪市| 福州市| 铁岭市| 弥勒县| 兰考县| 丹东市| 济阳县| 尼勒克县| 聂拉木县| 康马县| 弥渡县| 德令哈市| 清徐县| 靖江市| 崇文区| 漠河县| 香港 | 广州市| 新化县| 册亨县| 合作市| 新邵县| 平顶山市| 舒兰市| 三河市| 灵台县| 信宜市| 朝阳县| 台北县| 缙云县| 伊宁县| 佳木斯市| 弥勒县| 黄大仙区| 克什克腾旗| 沐川县| 杭锦旗| 开原市| 怀宁县|