C与ARM汇编之一

C语言中有单最常见的代码在ARM的汇编中是如何实现的呢?

下面以for循环语句为例,处理器为LPC2368,在Keil μVision4中编译的到的结果:

两个全局数组的赋值操作

BYTE Memory[MSC_MemorySize];    /* MSC Memory in RAM */

const unsigned char DiskImage[MSC_ImageSize] = {

    0xEB,0x3C,0x90,0x4D,0x53,0x44,0x4F,

    0x53,0x35,0x2E,0x30, 0x00,0x02,0x01,

    0x01,0x00,0x01,0x10,0x00,0x20...

}

for (n = 0; n < MSC_ImageSize; n++)      { /* Copy Initial Disk Image */

       Memory[n] = DiskImage[n];                   /* from Flash to RAM */

}

汇编:

0x00001DC8     E3A04000     MOV R4,#0x00000000

0x00001DCC     EA000004     B 0x00001DE4

0x00001DD0     E59F0034     LDR R0,[PC,#0x0034]

0x00001DD4     E7D00004     LDRB R0,[R0,R4]

0x00001DD8     E59F1030     LDR R1,[PC,#0x0030]

0x00001DDC     E7C10004    STRB R0,[R1,R4]

0x00001DE0     E2844001     ADD R4,R4,#0x00000001

0x00001DE4     E3540A01     CMP R4,#0x00001000

0x00001DE8     3AFFFFF8      BCC 0x00001DD0


Memory中的地址:

0x00001E00: 5C FB FF EB 00 00 A0 E1 FE FF FF EA A4 28 00 00

0x00001E10: 74 00 00 40 00 C0 ...

......

0x000028A0: 00 00 00 00 EB 3C 90 4D 53 44 4F 53 35 2E 30 00

0x000028B0: 02 01 01 00 01 10 00 20 00 F8 02 00 01 00 01 00


理解时需要注意ARM7的一些特征:

1. LDR R0,[PC,#0x0034] ;读取PC+0x34地址上的存储单元的内容,放入R0

2. 采用三级流水线,PC=当前执行位置+8;

3. 支持大小端模式,一般默认小端模式。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值