Прошу прощения, что повторяюсь, но вот маленький пример: Исходный текст стандартной функции
char *strcpy(char *dst, char *src)
{
char *ptr = dst;
while (*ptr++ = *src++);
return dst;
}
Результат трансляции для AVR
1 char *strcpy(char *dst, char *src)
2 {
\ __nearfunc char *strcpy(char *, char *);
\ strcpy:
\ 00000000 2F5B MOV R21,R27
\ 00000002 2F4A MOV R20,R26
\ 00000004 01D9 MOVW R27 : R26,R19 : R18
3 char *ptr = dst;
\ 00000006 01F8 MOVW R31 : R30,R17 : R16
4
5 while (*ptr++ = *src++);
\ ??strcpy_0:
\ 00000008 912D LD R18,X+
\ 0000000A 9321 ST Z+,R18
\ 0000000C 2322 TST R18
\ 0000000E F7E1 BRNE ??strcpy_0
6
7 return dst;
\ 00000010 2FA4 MOV R26,R20
\ 00000012 2FB5 MOV R27,R21
\ 00000014 9508 RET
8 }
Maximum stack usage in bytes:
Function CSTACK RSTACK
-------- ------ ------
strcpy 0 0
22 bytes in segment CODE
То же самое для MSP-430
1 char *strcpy(char *dst, char *src)
\ strcpy:
2 {
3 char *ptr = dst;
\ 000000 0F4C MOV.W R12, R15
4
5 while (*ptr++ = *src++);
\ ??strcpy_0:
\ 000002 6D4E MOV.B @R14, R13
\ 000004 1E53 ADD.W #0x1, R14
\ 000006 CF4D0000 MOV.B R13, 0(R15)
\ 00000A 1F53 ADD.W #0x1, R15
\ 00000C 4D93 CMP.B #0x0, R13
\ 00000E F923 JNE ??strcpy_0
6
7 return dst;
\ 000010 3041 RET
8 }
Maximum stack usage in bytes:
Function CSTACK
-------- ------
strcpy 2
Segment part sizes:
Function/Label Bytes
-------------- -----
strcpy 18
Вопросы:
Насколько оптимально откомпилированы функции? Нельзя ли их модифицировать с целью увеличения их эффективности? Кто может посчитать их быстродействие, хотя бы время выполнения одного цикла?
Если я знаю AVR в достаточной степени я могу ответить относительно AVR, а относительно MSP должен сказать тот, кто знает его лучше.
И, специально для борцов за "чистоту" Си. Подобные стандартные библиотечные функции пишут чаще всего на ассемблере. А они иногда играют решающую роль в работе всей программы в целом.