驱动程序是系统很重要的部件,代码效率直接影响着系统的效率,因而书写高效的代码至关重要.
1.代码中量不要使用位操作的结构体,而直接使用位操作,我写了如下的测试代码:
typedef union Test_Reg
{
UINT32 value;
struct
{
unsigned a : 5;
unsigned reserved1 : 3;
unsigned b : 4;
unsigned reserved2 : 4;
unsigned c : 8;
unsigned reserved3 : 8;
};
} TestReg;
static TestReg test_st;
static DWORD g_dwTest;
void test_function( int a, int b, int c )
{
test_st.dayOfMonth=a;
test_st.month=b;
test_st.year=c;
}
void test_ok( int a , int b , int c )
{
g_dwTest= (a)|(b<<8)|(c<<16);
}
其生成的汇编代码如下:
test_function
{
stmdb sp!, {r4, r5, lr}
mov r5, r2
: test_st.dayOfMonth=a;
: test_st.month=b;
ldr r4, [pc, #0x2C]
mov lr, #0
sub lr, lr, #0xF2, 28
ldr r3, [r4]
and r1, r1, #0xF
and r2, r0, #0x1F
and r3, r3, lr
orr r3, r3, r1, lsl #8
orr r3, r3, r2
str r3, [r4]
: test_st.year=c;
strb r5, [r4, #2]
}
ldmia sp!, {r4, r5, lr}
bx lr
ENDP
test_ok
{
str lr, [sp, #-4]!
: g_dwTest= (a)|(b<<8)|(c<<16);
ldr lr, [pc, #0x10]
orr r3, r1, r2, lsl #8
orr r3, r0, r3, lsl #8
str r3, [lr]
}
ldr lr, [sp], #4
bx lr
ENDP
可见前者的效率明显低,效率只有后者的1/3.
后者使用了3行代码,而前者用了12行