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文件將編譯過程中產生的錯誤、警告信息,保存在警告和錯誤段中。這些信息和編譯時屏幕顯示的提示信息相同。