JNH官网

【ARM】解析MDK生成的C Compiler list文件的具体内容

1、 文档目标

用于解析MDK生成的C Compiler list文件的具体内容。


2、 问题场景

在MDK的options窗口中的Listing栏中有生成对应的源文件的编译列表(如图2-1)。但是,对于这个生成的列表中包含什么具体的信息就不太清楚了。



图2-1


3、软硬件环境

1、软件版本:Keil MDK 5.38a

2、电脑环境:Windows 11

3、外设硬件:无


4、解决方法

1)、在Project窗口中,选中对应的文件,右键选择打开list文件(如图4-1)。


图 4-1


2)、在生成的C Compiler List文件中包含以下的内容:

(1)、第一行,显示该文件所使用的编译器型号,第二行显示编译器的所执行的编译参数有哪些。第三行显示所用的指令集。

; generated by Component: ARM Compiler 5.06 update 7 (build 960) Tool: ArmCC [4d365d]
; commandline ArmCC [--c99 --list --split_sections --debug -c --asm --interleave -o..objmain.o --asm_dir=..OBJ --list_dir=..OBJ --depend=..objmain.d --cpu=Cortex-M4.fp.sp --apcs=interwork -O3 --diag_suppress=9931 -I..CORE -I..SYSTEMdelay -I..SYSTEMsys -I..SYSTEMusart -I..USER -I..HARDWARELED -I..FWLIBinc -I.RTE_LED -IC:UsersUSERAppDataLocalArmPacksKeilSTM32F4xx_DFP2.16.0DriversCMSISDeviceSTSTM32F4xxInclude -D__UVISION_VERSION=538 -D_RTE_ -DSTM32F407xx -D_RTE_ -DSTM32F40_41xxx -DUSE_STDPERIPH_DRIVER --omf_browse=..objmain.crf main.c]
THUMB


(2)、第一行表示用AREA中定义了一个名为i.main的内存区域,Code表示这个区域是存储代码的,READOLY表示该区域是只读的,ALIGN=2表示该区域的对齐方式是2字节。

第二行main PROC表示main 函数开始的位置。

然后,后面的就都是对应语句的汇编指令了,到最后的ENDP表示结束位置

                          AREA ||i.main||, CODE, READONLY, ALIGN=2

main PROC
;;;13 }
;;;14 int main(void)
000000 20a8 MOVS r0,#0xa8
;;;15 {
;;;16 //int num = 9;
;;;17 delay_init(168); //³õʼ»¯ÑÓʱº¯Êý
000002 f7fffffe BL delay_init
;;;18 add(3,4);
;;;19 LED_Init(); //³õʼ»¯LED¶Ë¿Ú
000006 f7fffffe BL LED_Init
;;;20
;;;21 /**ÏÂÃæÊÇͨ¹ýÖ±½Ó²Ù×÷¿âº¯ÊýµÄ·½Ê½ÊµÏÖIO¿ØÖÆ**/
;;;22 while(1)
;;;23 {
;;;24 GPIO_ResetBits(GPIOF,GPIO_Pin_9);
00000a f44f7400 MOV r4,#0x200
00000e 4d0f LDR r5,|L2.76|
;;;25 GPIO_SetBits(GPIOF,GPIO_Pin_10); //LED1¶ÔÓ¦Òý½ÅGPIOF.10À­¸ß£¬Ãð µÈͬLED1=1;
000010 0066 LSLS r6,r4,#1
;;;26 delay_ms(500); //ÑÓʱ300ms
000012 f44f77fa MOV r7,#0x1f4
|L2.22|
000016 4621 MOV r1,r4 ;24
000018 4628 MOV r0,r5 ;24
00001a f7fffffe BL GPIO_ResetBits
00001e 4631 MOV r1,r6 ;25
000020 4628 MOV r0,r5 ;25
000022 f7fffffe BL GPIO_SetBits
000026 4638 MOV r0,r7
000028 f7fffffe BL delay_ms
;;;27 GPIO_SetBits(GPIOF,GPIO_Pin_9); //LED0¶ÔÓ¦Òý½ÅGPIOF.0À­¸ß£¬Ãð µÈͬLED0=1;
00002c 4621 MOV r1,r4
00002e 4628 MOV r0,r5
000030 f7fffffe BL GPIO_SetBits
;;;28 GPIO_ResetBits(GPIOF,GPIO_Pin_10); //LED1¶ÔÓ¦Òý½ÅGPIOF.10À­µÍ£¬ÁÁ µÈͬLED1=0;
000034 4631 MOV r1,r6
000036 4628 MOV r0,r5
000038 f7fffffe BL GPIO_ResetBits
;;;29 delay_ms(500); //ÑÓʱ300ms
00003c 4638 MOV r0,r7
00003e f7fffffe BL delay_ms
;;;30
;;;31 printf("hello,worldrn");
000042 a003 ADR r0,|L2.80|
000044 f7fffffe BL __2printf
000048 e7e5 B |L2.22|
;;;32
;;;33 }
;;;34 }
;;;35
ENDP

3)、最后面的Start embedded assembler到End embedded assembler这个部分是表示编译器开始处理内嵌汇编代码(inline assembler)。列出具体的汇编指令和它们如何映射到内存地址的情况。


;*** Start embedded assembler ***

#line 1 "main.c"
AREA ||.rev16_text||, CODE
THUMB
EXPORT |__asm___6_main_c_add____REV16|
#line 129 "..\CORE\core_cmInstr.h"
|__asm___6_main_c_add____REV16| PROC
#line 130

rev16 r0, r0
bx lr
ENDP
AREA ||.revsh_text||, CODE
THUMB
EXPORT |__asm___6_main_c_add____REVSH|
#line 144
|__asm___6_main_c_add____REVSH| PROC
#line 145

revsh r0, r0
bx lr
ENDP

;*** End embedded assembler ***


【更多软件使用问题请站内搜索或关注B站:查看视频教学】

jnh官网 jnh官网 jnh官网 jnh官网 金年会 金年会 金年会 金年会