Всем привет!
Не могу понять работу компилятора WINAVR. Есть самый простейший код на С. В функции main() создается указатель на функцию evaluate(). Далее происходит вызов функции используя этот указатель.
Код
void evaluate(void)
{
}
int main(void)
{
void (*p)(void) = evaluate;
(*p)();
return 0;
}
Однако, просмотрев сгенерированный ассемблерный код, получаю следующее (оптимизация отключена, не относящиеся к делу строки удалены):
Код
[b]000000be[/b] <evaluate>:
void evaluate(void)
{
be: df 93 push r29
c0: cf 93 push r28
c2: cd b7 in r28, 0x3d; 61
c4: de b7 in r29, 0x3e; 62
}
c6: cf 91 pop r28
c8: df 91 pop r29
ca: 08 95 ret
000000cc <main>:
int main(void)
{
cc: df 93 push r29
ce: cf 93 push r28
d0: 00 d0 rcall .+0 ; 0xd2 <main+0x6>
d2: cd b7 in r28, 0x3d; 61
d4: de b7 in r29, 0x3e; 62
void (*p)(void) = evaluate;
d6: 8f e5 [b]ldi r24, 0x5F[/b]; 95
d8: 90 e0 [b]ldi r25, 0x00[/b]; 0
da: 9a 83 std Y+2, r25; 0x02
dc: 89 83 std Y+1, r24; 0x01
(*p)();
de: e9 81 ldd r30, Y+1; 0x01
e0: fa 81 ldd r31, Y+2; 0x02
e2: 09 95 [b]icall[/b]
return 0;
e4: 80 e0 ldi r24, 0x00; 0
e6: 90 e0 ldi r25, 0x00; 0
}
e8: 0f 90 pop r0
ea: 0f 90 pop r0
ec: cf 91 pop r28
ee: df 91 pop r29
f0: 08 95 ret
Как видно, указатель на функцию evaluate() инициализируется значением r24:r25 = 5F00. Но почему? Ведь адрес функции evaluate() равен 000000be.
Сообщение отредактировал Giekelberri - Feb 16 2011, 12:21