Напоминает.
0e 94 5f 00 - Opcode инструкции CALL, где
параметр k, загружаемый в счетчик PC равен 00 5f
Flash память программ в AVR организована, как 32K/64K/128K x 16 разрядов (из документации). Так как большинство инструкций 16 разрядные.
icall - 16-разрядная (значение адреса функции находиться в Z-регистре)
call - 32-разрядная (значение адреса функции находиться в самом opcode)
получается, что "железная" адресация идет по 16 разрядов: 0, 1, 2, 3, 4, 5, ...
а в файле *.lss адресация идет по 8 разрядов: 0, 2, 4, 6, 8, 10, ...
но с шагом 2, в итоге получается те же 16 разрядов.
Провел дизассемблирование hex-файла
Для случая:
evaluate()
ассемблерный код
Код
+0000006A: 940E005F CALL 0x0000005F Call subroutine
Для случая:
void (*p)(void) = evaluate;
(*p)();
ассемблерный код
Код
+0000006B: E58F LDI R24,0x5F Load immediate
+0000006C: E090 LDI R25,0x00 Load immediate
+0000006D: 839A STD Y+2,R25 Store indirect with displacement
+0000006E: 8389 STD Y+1,R24 Store indirect with displacement
+0000006F: 81E9 LDD R30,Y+1 Load indirect with displacement
+00000070: 81FA LDD R31,Y+2 Load indirect with displacement
+00000071: 9509 ICALL Indirect call to (Z)
результат идентичен, без неявных делений на 2 в голове программиста...
Спасибо!