回覆列表
  • 1 # 使用者5916393697425

    在混合程式設計中,最常用也是最實用的方法是在C語言中加入部分組合語言的程式碼,分為兩種方法。

    方法1)在Keil C51的函式中直接插入彙編語句

    方法2)按照Keil C51介面規則,編寫彙編模組

    方法1是利用編譯控制命令#pragma asm(用來標識所插入的彙編語句的起始位置) 和 #pragma endasm (用來標識所插入的彙編語句的結束位置) ,這兩條命令必須成對出現,並可以多次出現。在Keil C51中不對插入的彙編程式碼做任何的處理。

    方法2編寫彙編模組,需對KEIL編譯器的編譯過程做些瞭解。Keil編譯器的編譯過程是首先將專案中的一個個原始檔編譯為目的碼(obj檔案),然在再透過聯結器產生為最終可執行的hex檔案。

    目的碼將其中的程式碼、資料、常量放在不同的“段”中,儲存程式的段稱為“程式碼段”,儲存資料的段稱為“資料段”,最終目的碼經過Keil的聯結器按照“段”的要求轉換為程式和資料地址固定的可執行檔案。

    在Keil軟體中,“段”按定位屬性分為:“可重定位段”和“絕對段”。

    “可重定位段”:程式和資料在其分別所對應的儲存單元(FLASH和RAM)中的儲存地址是浮動的、可重定義的、相對可變的。

    “絕對段”:其地址在連線前就已確定不變,聯結器據此為它分配地址。

    經Keil編譯器生成的“段”具有如下屬性:

    1)段的儲存屬性(program code data pdata xdata bdata bit等);

    2)段的起始地址;3)段的長度;

    4)段的定位要求:絕對段地址固定,可重定位段定位的要求如要求程式碼段在2K範圍內,資料段定位在可位定址區等;

    5)段名:包括程式和資料(變數和常量)的段的儲存屬性及段所屬的程式模組(檔案)。程式碼段: ?PR? funcname?Filename

    資料段如:?DT? funcname?Filename; ?BI? funcname?Filename

    標準段名字首列表

    段字首 儲存型別 含義

    ?PR? Program 程式儲存區的程式碼

    ?CO? code 程式儲存區的常量

    ?BI? Bit 內部資料儲存區的可位定址的位變數

    ?BA? Bdata 內部資料儲存區的可位定址的位元組變數

    ?DT? Data 內部資料儲存區的變數

    ?ID? Idata 內部資料儲存區可間接定址的變數

    ?PD? Pdata 外部資料儲存區的頁變數

    ?XD? Xdata 外部資料儲存區的變數

  • 中秋節和大豐收的關聯?
  • 那些年你都做過什麼傻事讓你至今難以忘懷?