定位到\stc32_example\example_3_1\Listings目录下,打开main.lst文件:
main.Ist文件
看反汇编,翻译的多好!
也会生成demo.map文件
这里比较难懂是存储器映射:
注意L251选项:
EDATE和HDATA 的位置
我们先确定listing 选项
我们严格和何老师一样:
要读懂编译连接的过程提示信息:
查看生成的文件
目标文件:
C251 COMPILER V5.60.0,main 17/11/2516:06:10PAGE 1
C251 COMPILER V5.60.0, COMPILATION OF MODULE main
OBJECT MODULE PLACED IN .\Objects\main.obj
COMPILER INVOKED BY: C:\Keil_v5\C251\BIN\C251.EXE main.c XSMALL INTR2 BROWSE DEBUG CODE LISTINCLUDE SYMBOLS PRINT(.\List
-ings\main.lst) OBJECT(.\Objects\main.obj)
stmtlevel source
1 sfr P4 = 0xc0; //P4端口地址映射
2 sfr P4M1 = 0xb3; //P4端口配置端口地址映射
3 sfr P4M0 = 0xb4; //P4端口配置端口地址映射
4 sfr P6 = 0xe8; //P6端口地址映射
5 sfr P6M1 = 0xcb; //P6端口配置端口地址映射
6 sfr P6M0 = 0xcc; //P6端口配置端口地址映射
7
8 void main()
9 {
10 1 unsigned volatile long i;
11 1 P4M0 = 0X00;
12 1 P4M1 = 0X00; //设置P4为准双向端口模式
13 1 P6M0 = 0X00;
14 1 P6M1 = 0X00; //设置P6为准双向端口模式
15 1 P4 = 0; //P4端口赋值为0,打开led灯总开关
16 1 while (1)
17 1 {
18 2 P6=0x00; //P6赋值为低,点亮所有led灯
19 2 //for(i=0;i<100000UL;i++);//计数延时,调试时,去掉该行代码。
20 2 P6=0xFF;
21 2 //for(i=0;i<100000UL;i++);//计数延时,调试时,去掉该行代码。
22 2 }
23 1 }
*** WARNING C47 IN LINE 10 OF main.c: 'i': unreferenced local variable
24
C251 COMPILER V5.60.0,main 17/11/2516:06:10PAGE 2
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION main (BEGIN)
; SOURCE LINE # 8
; SOURCE LINE # 9
; SOURCE LINE # 11
000000 75B400 MOV P4M0,#00H
; SOURCE LINE # 12
000003 75B300 MOV P4M1,#00H
; SOURCE LINE # 13
000006 75CC00 MOV P6M0,#00H
; SOURCE LINE # 14
000009 75CB00 MOV P6M1,#00H
; SOURCE LINE # 15
00000C 75C000 MOV P4,#00H
; SOURCE LINE # 16
?C0003:
; SOURCE LINE # 18
00000F 75E800 MOV P6,#00H
; SOURCE LINE # 20
000012 75E8FF MOV P6,#0FFH
; SOURCE LINE # 22
000015 80F8 SJMP ?C0003
; FUNCTION main (END)
C251 COMPILER V5.60.0,main 17/11/2516:06:10PAGE 3
Name Class Space Type Offset Size
---------------------------------------------------------------------------
P6 . . . . . . . . . . . . . . . . . .sfr datauchar0E8H 1
P6M1 . . . . . . . . . . . . . . . . .sfr datauchar0CBH 1
P4 . . . . . . . . . . . . . . . . . .sfr datauchar0C0H 1
P6M0 . . . . . . . . . . . . . . . . .sfr datauchar0CCH 1
P4M1 . . . . . . . . . . . . . . . . .sfr datauchar0B3H 1
P4M0 . . . . . . . . . . . . . . . . .sfr datauchar0B4H 1
main . . . . . . . . . . . . . . . . .public codefunct000000H23
Module Information Static Overlayable
------------------------------------------------
code size = 23 ------
ecode size = ------ ------
data size = ------ ------
idata size = ------ ------
pdata size = ------ ------
xdata size = ------ ------
xdata-const size = ------ ------
edata size = ------ ------
bit size = ------ ------
ebit size = ------ ------
bitaddressable size= ------ ------
ebitaddressable size = ------ ------
far data size = ------ ------
huge data size = ------ ------
const size = ------ ------
hconst size = ------ ------
End of Module Information.
C251 COMPILATION COMPLETE.1 WARNING(S),0 ERROR(S)
我们看看list文件的内容:
每个模块的地址,和最后的可执行文件的地址,是不同的,最终的地址是:
接着看第二个demo.map文件
页面标题
每个列表页面都包含一个标题,其中包含链接器版本号、日期和页码:
demo.map-记事本
L251 LINKER/LOCATER V4.66.93.0 11/17/202516:06:10PAGE 1
L251 LINKER/LOCATER V4.66.93.0, INVOKED BY:
C:\KEIL_V5\C251\BIN\L251.EXE .\Objects\main.obj TO .\Objects\demo PRINT (.\Listings\demo.map) CASE CLASSES (EDATA (0X0-0
>> XFFF), HDATA (0X0-0XFFF))
CPU MODE: 251 SOURCE MODE
MEMORY MODEL: XSMALL
INPUT MODULES INCLUDED:
.\Objects\main.obj (main)
COMMENT TYPE 0: C251 V5.60.0
C:\KEIL_V5\C251\LIB\C2SXS.LIB (?C_START)
COMMENT TYPE 0: A251 V4.69.6.0
ACTIVE MEMORY CLASSES OF MODULE:.\Objects\demo (main)
BASE START END USED MEMORY CLASS
==========================================================
000000H 000000H 000FFFH 000100H EDATA
000000H 000000H 000FFFH HDATA
FF0000H FF0000H FFFFFFH 000030H CODE
000000H 000000H 00007FH 000008H DATA
MEMORY MAP OF MODULE:.\Objects\demo (main)
START STOP LENGTH ALIGNRELOC MEMORY CLASS SEGMENT NAME
=========================================================================
000000H 000007H 000008H --- AT.. DATA "REG BANK 0"
000008H 000107H 000100H BYTE UNIT EDATA ?STACK
000108H FEFFFFH FEFEF8H --- --- **GAP**
FF0000H FF0002H 000003H --- OFFS.. CODE ?CO?start251?4
FF0003H FF0019H 000017H BYTE INSEG CODE ?PR?MAIN?MAIN
FF001AH FF002CH 000013H BYTE UNIT CODE ?C_C51STARTUP
FF002DH FF002FH 000003H BYTE UNIT CODE ?C_C51STARTUP?3
OVERLAY MAP OF MODULE: .\Objects\demo (main)
FUNCTION/MODULE BIT_GROUP DATA_GROUP
--> CALLED FUNCTION/MODULESTARTSTOPSTARTSTOP
====================================================
?C_C51STARTUP ----- ---------- -----
*** NEW ROOT **************
?C_C51STARTUP?3 ----- ---------- -----
+--> main/main
main/main ----- ---------- -----
PUBLIC SYMBOLS OF MODULE:.\Objects\demo (main)
VALUE CLASS TYPE PUBLIC SYMBOL NAME
=================================================
000000FFH NUMBER --- ?C?CODESEG
00FF0000H CODE --- ?C?STARTUP
00000001H NUMBER --- ?C?XDATASEG
L251 LINKER/LOCATER V4.66.93.0 11/17/202516:06:10PAGE 2
00FF0000H CODE --- ?C_STARTUP
00FF0003H CODE --- main
*SFR* 000000C0H DATA BYTE P4
*SFR* 000000B4H DATA BYTE P4M0
*SFR* 000000B3H DATA BYTE P4M1
*SFR* 000000E8H DATA BYTE P6
*SFR* 000000CCH DATA BYTE P6M0
*SFR* 000000CBH DATA BYTE P6M1
SYMBOL TABLE OF MODULE:.\Objects\demo (main)
VALUE REP CLASS TYPE SYMBOL NAME
====================================================
--- MODULE --- --- main
00FF0003H PUBLIC CODE --- main
000000E8H SFRSYM DATA BYTE P6
000000CBH SFRSYM DATA BYTE P6M1
000000C0H SFRSYM DATA BYTE P4
000000CCH SFRSYM DATA BYTE P6M0
000000B3H SFRSYM DATA BYTE P4M1
000000B4H SFRSYM DATA BYTE P4M0
00FF0003H BLOCK CODE --- LVL=0
00FF0003H LINE CODE --- #8
00FF0003H LINE CODE --- #9
00FF0003H LINE CODE --- #11
00FF0006H LINE CODE --- #12
00FF0009H LINE CODE --- #13
00FF000CH LINE CODE --- #14
00FF000FH LINE CODE --- #15
00FF0012H LINE CODE --- #16
00FF0012H LINE CODE --- #18
00FF0015H LINE CODE --- #20
00FF0018H LINE CODE --- #22
--- BLOCKEND--- --- LVL=0
--- MODULE --- --- ?C_START
00FF0000H PUBLIC CODE --- ?C?STARTUP
00FF0000H PUBLIC CODE --- ?C_STARTUP
Program Size: data=8.0 edata+hdata=256 xdata=0 const=0 code=48
L251 RUN COMPLETE.0 WARNING(S),0 ERROR(S)
实际是连接器完成连接后生成的文件