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





















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