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文件将编译过程中产生的错误、警告信息,保存在警告和错误段中。这些信息和编译时屏幕显示的提示信息相同。