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位网友发表了看法



发表评论