Keil C51 之LST文件
原创昵称90天可改 最后发布于2014-01-11 12:30:21 阅读数 5559 收藏
展开
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文件将编译过程中产生的错误、警告信息,保存在警告和错误段中。这些信息和编译时屏幕显示的提示信息相同。