在keil上运行一段GPIO的程序,查看C语言及对应的汇编程序如下:
0x0800028A 2120 MOVS r1,#0x20
0x0800028C 4811 LDR r0,[pc,#68] ; @0x080002D4
0x0800028E F000F935 BL.W GPIO_ResetBits (0x080004FC)
17: GPIO_SetBits(GPIOD,GPIO_Pin_3);
0x08000292 2108 MOVS r1,#0x08
0x08000294 480E LDR r0,[pc,#56] ; @0x080002D0
0x08000296 F000F92F BL.W GPIO_SetBits (0x080004F8)
18: delay(6000000);//0.5s
0x0800029A 480F LDR r0,[pc,#60] ; @0x080002D8
0x0800029C F000F81E BL.W delay (0x080002DC)
19: GPIO_ResetBits(GPIOD,GPIO_Pin_6);
0x080002A0 2140 MOVS r1,#0x40
0x080002A2 480B LDR r0,[pc,#44] ; @0x080002D0
0x080002A4 F000F92A BL.W GPIO_ResetBits (0x080004FC)
20: GPIO_SetBits(GPIOB,GPIO_Pin_5);
0x080002A8 2120 MOVS r1,#0x20
0x080002AA 480A LDR r0,[pc,#40] ; @0x080002D4
0x080002AC F000F924 BL.W GPIO_SetBits (0x080004F8)
21: delay(6000000);
0x080002B0 4809 LDR r0,[pc,#36] ; @0x080002D8
0x080002B2 F000F813 BL.W delay (0x080002DC)
22: GPIO_ResetBits(GPIOD,GPIO_Pin_3);
0x080002B6 2108 MOVS r1,#0x08
0x080002B8 4805 LDR r0,[pc,#20] ; @0x080002D0
0x080002BA F000F91F BL.W GPIO_ResetBits (0x080004FC)
23: GPIO_SetBits(GPIOD,GPIO_Pin_6);
0x080002BE 2140 MOVS r1,#0x40
0x080002C0 4803 LDR r0,[pc,#12] ; @0x080002D0
0x080002C2 F000F919 BL.W GPIO_SetBits (0x080004F8)
24: delay(6000000);//0.5s
0x080002C6 4804 LDR r0,[pc,#16] ; @0x080002D8
0x080002C8 F000F808 BL.W delay (0x080002DC)
0x080002CC E7DD B 0x0800028A
0x080002CE 0000 MOVS r0,r0
0x080002D0 1400 ASRS r0,r0,#16
0x080002D2 4001 ANDS r1,r1,r0
0x080002D4 0C00 LSRS r0,r0,#16
0x080002D6 4001 ANDS r1,r1,r0
0x080002D8 8D80 LDRH r0,[r0,#0x2C]
0x080002DA 005B LSLS r3,r3,#1
7: for(;nCount!=0;nCount--);
0x080002DC E000 B 0x080002E0
0x080002DE 1E40 SUBS r0,r0,#1
0x080002E0 2800 CMP r0,#0x00
0x080002E2 D1FC BNE 0x080002DE
8: }
0x080002E4 4770 BX lr
0x080002E6 0000 MOVS r0,r0
71: {
72: /* Check the parameters */
73: assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
74:
0x080002E8 B510 PUSH {r4,lr}
0x080002EA 4604 MOV r4,r0
75: if (GPIOx == GPIOA)
76: {
0x080002EC 48C7 LDR r0,[pc,#796] ; @0x0800060C
0x080002EE 4284 CMP r4,r0
0x080002F0 D108 BNE 0x08000304
77: RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);
0x080002F2 2101 MOVS r1,#0x01
0x080002F4 2004 MOVS r0,#0x04
0x080002F6 F000FB1B BL.W RCC_APB2PeriphResetCmd (0x08000930)
78: RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE);
79: }
0x080002FA 2100 MOVS r1,#0x00
0x080002FC 2004 MOVS r0,#0x04
0x080002FE F000FB17 BL.W RCC_APB2PeriphResetCmd (0x08000930)
0x08000302 E046 B 0x08000392
80: else if (GPIOx == GPIOB)
81: {
0x08000304 48C2 LDR r0,[pc,#776] ; @0x08000610
0x08000306 4284 CMP r4,r0
0x08000308 D108 BNE 0x0800031C
82: RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE);
0x0800030A 2101 MOVS r1,#0x01
0x0800030C 2008 MOVS r0,#0x08
0x0800030E F000FB0F BL.W RCC_APB2PeriphResetCmd (0x08000930)
83: RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, DISABLE);
84: }
0x08000312 2100 MOVS r1,#0x00
0x08000314 2008 MOVS r0,#0x08
0x08000316 F000FB0B BL.W RCC_APB2PeriphResetCmd (0x08000930)
0x0800031A E03A B 0x08000392
有几个问题还请大神解答
1. 汇编格式问题:每条汇编语句均由0x08000XXX XXXX(XXXX)构成,前面的8位16进制地址是否就是指令的存储位置?后面的4位(有时是8位)16进制是不是机器码?
2.比如
17: GPIO_SetBits(GPIOD,GPIO_Pin_3);
0x08000292 2108 MOVS r1,#0x08
0x08000294 480E LDR r0,[pc,#56] ; @0x080002D0
0x08000296 F000F92F BL.W GPIO_SetBits (0x080004F8)
执行LDR r0,[pc,#56] 时,pc的值是否为0x08000294?之后的注释@0x080002D0这个地址代表什么含义?0x080002D0+(#56)=0x080002CC,相差了4个地址。R0执行完这条语句后其中的值是多少呢?
3. 凡是执行delay(6000000);汇编代码对应会跳到delay (0x080002DC),是否跳到0x080002DC执行相应语句?
0x080002DC E000 B 0x080002E0
0x080002E0 2800 CMP r0,#0x00 执行delay函数时,R0的初值是在哪条语句被赋值的?
求大神解答!