在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的初值是在哪条语句被赋值的?
求大神解答!
|