c语言只有编译没有汇编,keil中查看C语言对应汇编语言问题

在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的初值是在哪条语句被赋值的?

求大神解答!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值