Keil C51 之LST文件

     Keil C51編譯器在編譯程序時,會生成一個擴展名爲LST的列表文件,也被稱爲listing file。

     這個文件包含了有關編譯過程的豐富信息,該文件由多個段組成,其中Symbol Listing 和 Module Information兩個段對於用戶分析調試程序尤其有用,下面按照各個段在             listing file中出現的先後順序加以說明:


    一、頁頭段(Page Header)   

    每個lst文件都有一個包含了編譯器版本號、源文件名稱、日期、時間、頁號的頭部。示例:

    

  C51 COMPILER V7.20   MEASURE       10/01/2004 14:05:05 PAGE 1

   

     二、命令段(Command Line)

    命令段展示了 Keil IDE 調用C51編譯器時傳遞的所有命令, 示例:  

  C51 COMPILER V7.20, COMPILATION OF MODULE MEASURE
  OBJECT MODULE PLACED IN Measure.OBJ
  COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Measure.c HOLD(128,
                     -0,0) OPTIMIZE(9,SPEED) BROWSE DEBUG OBJECT
                     -EXTEND CODE LISTINCLUDE SYMBOLS

    三、源碼段(Source Code)

    源碼段展示了每行源程序及其行號。

    COND指令,可以控制條件編譯代碼(#if 作用範圍內的代碼)被源碼段列出,NOCOND指令,可以控制條件編譯代碼不被源碼段列出。

    用戶可以使用 LISTINCLUDE 指令,讓源碼段顯示 #include 所包含的文件內容,默認情況下,#include包含的文件內容不被顯示。

    源碼段示例:

  53          char code ERROR [] = "\n*** ERROR: %s\n";
  54
  55          #define PERIOD     -250
  56          #define WRONGINDEX 0xffff
  57
  58
  59          /* The following function is called from */
  60          /* the interrupt service routine. */
  61          /* Save current measurements in save_record */
  62
  63
  64          #pragma REGISTERBANK (1)
  65
  66          static void save_current_measurements (void) {
  67   1        save_record[sindex++] = current;
  68   1        if (sindex == SCNT) sindex = 0;
  69   1        if (sindex == savefirst)  {
  70   2          if (++savefirst == SCNT)  savefirst = 0;
  71   2        }
  72   1      }
  73
  74
  75          /* Timer 0 interrupt service function */
  76          /* executes each 250 usec @ 12 MHz Crystal Clock */
  77
  78          void timer0 (void) interrupt 1 using 1 {
  79   1
  80   1        unsigned char i;
  81   1
  82   1        if (measurement_interval)  {
  83   2          save_current_measurements ();
  84   2          measurement_interval = 0;
  85   2        }
    

    四、彙編代碼段(Assembly Listing)

    彙編代碼段包含了由C語言程序編譯產生的彙編代碼,CODE 指令可以控制LST文件產生彙編代碼段。

    彙編代碼段示例:

            ; FUNCTION save_current_measurements (BEGIN)
                                           ; SOURCE LINE # 66
                                           ; SOURCE LINE # 67
0000 0500        R     INC     sindex+01H
0002 E500        R     MOV     A,sindex+01H
0004 AE00        R     MOV     R6,sindex
0006 7002              JNZ     ?C0064
0008 0500        R     INC     sindex
000A         ?C0064:
000A 14                DEC     A
000B FF                MOV     R7,A
000C 120000      R     LCALL   L?0079
000F A809              MOV     R0,AR1
0011 FC                MOV     R4,A
0012 7D01              MOV     R5,#01H
0014 120000      R     LCALL   L?0077
                                           ; SOURCE LINE # 68
0017 E500        R     MOV     A,sindex+01H
0019 B4E80A            CJNE    A,#0E8H,?C0001
001C E500        R     MOV     A,sindex
001E B40205            CJNE    A,#02H,?C0001
0021 E4                CLR     A
0022 F500        R     MOV     sindex,A
0024 F500        R     MOV     sindex+01H,A
0026         ?C0001:
                                           ; SOURCE LINE # 69
0026 E500        R     MOV     A,sindex+01H
0028 B5001B      R     CJNE    A,savefirst+01H,?C0004
002B E500        R     MOV     A,sindex
002D B50016      R     CJNE    A,savefirst,?C0004

    五、符號列表段(Symbol Listing)

    符號列表段包含了源程序文件中定義的變量信息,比如變量名稱、類別(SFR、structure、typedef、static、public、auto、extern)、存儲空間、數據類型、偏移量、佔用       字節數等。SYMBOLS 指令控制LST文件產生符號列表段。

    符號列表段示例:

NAME                        CLASS   MSPACE  TYPE    OFFSET  SIZE
====                        =====   ======  ====    ======  ====
P4 . . . . . . . . . . . .  SFR      DATA   U_CHAR   00E8H  1
P5 . . . . . . . . . . . .  SFR      DATA   U_CHAR   00F8H  1
BD . . . . . . . . . . . .  ABSBIT   -----  BIT      00DFH  1
current. . . . . . . . . .  PUBLIC   DATA   STRUCT   0000H  11
ERROR. . . . . . . . . . .  PUBLIC   CODE   ARRAY    0416H  16
sindex . . . . . . . . . .  PUBLIC   DATA   U_INT    000BH  2
clock. . . . . . . . . . .  * TAG *  -----  STRUCT   -----  5
  hour . . . . . . . . . .  MEMBER   -----  U_CHAR   0000H  1
  min. . . . . . . . . . .  MEMBER   -----  U_CHAR   0001H  1
  sec. . . . . . . . . . .  MEMBER   -----  U_CHAR   0002H  1
  msec . . . . . . . . . .  MEMBER   -----  U_INT    0003H  2
size_t . . . . . . . . . .  TYPEDEF  -----  U_INT    -----  2
menu . . . . . . . . . . .  STATIC   CODE   ARRAY    00C7H  847
ADCON. . . . . . . . . . .  SFR      DATA   U_CHAR   00D8H  1
mdisplay . . . . . . . . .  STATIC   DATA   BIT      0001H  1
interval . . . . . . . . .  PUBLIC   DATA   STRUCT   0014H  4
interval . . . . . . . . .  * TAG *  -----  STRUCT   -----  4
  min. . . . . . . . . . .  MEMBER   -----  U_CHAR   0000H  1
  sec. . . . . . . . . . .  MEMBER   -----  U_CHAR   0001H  1
  msec . . . . . . . . . .  MEMBER   -----  U_INT    0002H  2
wchar_t. . . . . . . . . .  TYPEDEF  -----  CHAR     -----  1
_getkey. . . . . . . . . .  EXTERN   CODE   PROC     -----  -----
BSY. . . . . . . . . . . .  ABSBIT   -----  BIT      00DCH  1
_toupper . . . . . . . . .  EXTERN   CODE   PROC     -----  -----
_printf. . . . . . . . . .  EXTERN   CODE   PROC     -----  -----
_set_interval. . . . . . .  EXTERN   CODE   PROC     -----  -----
_read_index. . . . . . . .  STATIC   CODE   PROC     0000H  -----
  buffer . . . . . . . . .  AUTO     DATA   PTR      0000H  3
  index. . . . . . . . . .  AUTO     DATA   INT      0003H  2
  args . . . . . . . . . .  * REG *  DATA   U_CHAR   0007H  1
measurement_interval . . .  STATIC   DATA   BIT      0002H  1

    六、模塊信息段(Module Infomation)

    模塊信息段提供了源程序文件中使用的各種存儲區的尺寸信息,示例:

MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    902    ----
   CONSTANT SIZE    =   1062    ----
   XDATA SIZE       =   8184    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     24       8
   IDATA SIZE       =   ----      15
   BIT SIZE         =      3    ----
END OF MODULE INFORMATION.

    七、警告和錯誤段(Warnings and Errors)

    

    LST文件將編譯過程中產生的錯誤、警告信息,保存在警告和錯誤段中。這些信息和編譯時屏幕顯示的提示信息相同。





















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章