открыл листинг этой функции и возникло несколько вопросов
Код
\ In section .text, align 4, keep-with-next
26 u32_t crc32_update(void *data, u32_t crc, u32_t len)
27 {
\ crc32_update:
\ 00000000 00502DE9 PUSH {R12,LR}
28 u32_t i,z;
29 u8_t *buf = data;
30 for (i = 0; i < len; i++)
\ 00000004 000052E3 CMP R2,#+0
\ 00000008 0C00000A BEQ ??crc32_update_0
\ 0000000C 34309FE5 LDR R3,??crc32_update_1 ;; 0xedb88320
31 {
32 crc ^= buf[i];
\ ??crc32_update_2:
\ 00000010 00C0D0E5 LDRB R12,[R0, #+0]
\ 00000014 01102CE0 EOR R1,R12,R1
33 for (z = 0; z < 8; z++ )
\ 00000018 08C0A0E3 MOV R12,#+8
34 crc = crc & 0x01 ? (crc >> 1) ^ poly32 : crc >> 1;
\ ??crc32_update_3:
\ 0000001C A1E0A0E1 LSR LR,R1,#+1
\ 00000020 010011E3 TST R1,#0x1
\ 00000024 0E102310 EORNE R1,R3,LR
\ 00000028 0E10A001 MOVEQ R1,LR
\ 0000002C 01C05CE2 SUBS R12,R12,#+1
\ 00000030 F9FFFF1A BNE ??crc32_update_3
35 }
\ 00000034 010080E2 ADD R0,R0,#+1
\ 00000038 012052E2 SUBS R2,R2,#+1
\ 0000003C F3FFFF1A BNE ??crc32_update_2
36 return (crc);
\ ??crc32_update_0:
\ 00000040 0100A0E1 MOV R0,R1
\ 00000044 0280BDE8 POP {R1,PC} ;; return
\ ??crc32_update_1:
\ 00000048 2083B8ED DC32 0xedb88320
37 }
26 u32_t crc32_update(void *data, u32_t crc, u32_t len)
27 {
\ crc32_update:
\ 00000000 00502DE9 PUSH {R12,LR}
28 u32_t i,z;
29 u8_t *buf = data;
30 for (i = 0; i < len; i++)
\ 00000004 000052E3 CMP R2,#+0
\ 00000008 0C00000A BEQ ??crc32_update_0
\ 0000000C 34309FE5 LDR R3,??crc32_update_1 ;; 0xedb88320
31 {
32 crc ^= buf[i];
\ ??crc32_update_2:
\ 00000010 00C0D0E5 LDRB R12,[R0, #+0]
\ 00000014 01102CE0 EOR R1,R12,R1
33 for (z = 0; z < 8; z++ )
\ 00000018 08C0A0E3 MOV R12,#+8
34 crc = crc & 0x01 ? (crc >> 1) ^ poly32 : crc >> 1;
\ ??crc32_update_3:
\ 0000001C A1E0A0E1 LSR LR,R1,#+1
\ 00000020 010011E3 TST R1,#0x1
\ 00000024 0E102310 EORNE R1,R3,LR
\ 00000028 0E10A001 MOVEQ R1,LR
\ 0000002C 01C05CE2 SUBS R12,R12,#+1
\ 00000030 F9FFFF1A BNE ??crc32_update_3
35 }
\ 00000034 010080E2 ADD R0,R0,#+1
\ 00000038 012052E2 SUBS R2,R2,#+1
\ 0000003C F3FFFF1A BNE ??crc32_update_2
36 return (crc);
\ ??crc32_update_0:
\ 00000040 0100A0E1 MOV R0,R1
\ 00000044 0280BDE8 POP {R1,PC} ;; return
\ ??crc32_update_1:
\ 00000048 2083B8ED DC32 0xedb88320
37 }
В мануале на IAR написано
Цитата
Any of the registers R0 to R3, and R12, can be used as a scratch register by the function.
Далее я не понял о чем речь
Цитата
Note that R12 is a scratch register also when calling between assembler functions only
because of automatically inserted instructions for veneers.
because of automatically inserted instructions for veneers.
Собственно вопрос за чем компилятор при входе в функцию загоняет R12 в стек, а потом его восстанавливает в R1 ?
Если я использую в своей функции R12 его надо сохранять ?
Еще вопрос по строке
Цитата
SECTION .text:CODE(2)
, все понятно кроме 2 в скобках, в мануале не нашел, логика подсказывает что это алигмент, так или не так ?