当前位置:首页 >> 技术频道 >> 嵌入式开发

嵌入式中C和汇编的一些技巧

来源:嵌入式在线 作者:洲_仔 发布时间:2009-06-22 09:29:21 发表评论

摘要:嵌入式中C和汇编的一些技巧

关键词:嵌入式

  ARM汇编部分:

  A. 条件执行

  CMP R0,#5

  BEQ BYPASS

  ADD R1,R1,R0

  SUB R1,R1,R2

  BYPASS ......

  可以替代为:

  CMP R0,#5

  ADDNE R1,R1,R0

  SUBNE R1,R1,R2

  ......

  如果被跳过的指令序列并不进行复杂的操作,使用条件执行都要比使用转移好,因为ARM转义指令一般要用3个周期来执行。

  对于以下的条件执行可以这样来写汇编:

  ; if ( (a = = b) && (c = = d) ) e++

  CMP R0,R1

  CMPEQ R2,R3

  ADDEQ R4,R4,#1

  C语言部分:

  A. 很多人认为以下两种变量定义空间效率一样的:

  ① char a;

  short b;

  char c;

  int d;

  ② char a;

  char b;

  short c;

  int d;

  其实不然,定义次序的不同导致最终映像中不同的数据布局,实际中第二种定义方式能够节约更多的存储空间,所以在变量声名时,最好把所有相同类型的变量放在一起定义,这样可以优化存储器布局。

  B. 我们总是设法使用short或者char来定义变量,认为这样能够节省存储空间,但也有例外,我们先来看下这几段C代码及其相应的汇编:

  ① C代码:

  int addition(int a)

  { return a+1; }

  汇编:

  ADD a1,a1,#1

  ② C代码:

  short addition(short a)

  { return a+1; }

  汇编:

  ADD a1,a1,#1

  MOV a1,a1,LSL #16

  MOV a1,a1,ASR #16

  MOV PC,LR

  ③ C代码:

  char addition(char a)

  { return a+1; }

  汇编:

  ADD a1,a1,#1

  AND a1,a1,# &FF

  MOV PC,LR

  因为char 类型、short类型分别是8位、16位,完成加法操作后,需要在32位的寄存器中进行符号扩展,所以使用32位的int以及unsinged int做加法效率最高。

0
顶一下
0
踩一下

发表评论

请自觉遵守互联网相关政策法规,作者管理后台可以删除恶意评论、广告和违禁词语。