Я анализирую простое приложение на C ++:
int add(int a, int b)
{
return a + b;
}
int main()
{
int res = add(5, 8);
return 0;
}
Его разборка, скомпилированная в режиме отладки, выглядит следующим образом:
5:
6: int main()
7: {
00007FF736F42300 push rbp
00007FF736F42302 push rdi
00007FF736F42303 sub rsp,108h
00007FF736F4230A lea rbp,[rsp+20h]
00007FF736F4230F mov rdi,rsp
00007FF736F42312 mov ecx,42h
00007FF736F42317 mov eax,0CCCCCCCCh
00007FF736F4231C rep stos dword ptr [rdi]
8: int res = add(5, 8);
00007FF736F4231E mov edx,8
00007FF736F42323 mov ecx,5
00007FF736F42328 call add (07FF736F4137Ah)
00007FF736F4232D mov dword ptr [res],eax
9:
10: return 0;
00007FF736F42330 xor eax,eax
11: }
00007FF736F42332 lea rsp,[rbp+0E8h]
00007FF736F42339 pop rdi
00007FF736F4233A pop rbp
00007FF736F4233B ret
Что меня заинтересовало, так это то, что вызов функции add на самом деле не вызывает саму функцию add:
00007FF736F42328 call add (07FF736F4137Ah)
Идет к:
add:
00007FF736F4137A jmp add (07FF736F41AA0h)
Который, наконец, перейдет к:
1: int add(int a, int b)
2: {
00007FF736F41AA0 mov dword ptr [rsp+10h],edx
00007FF736F41AA4 mov dword ptr [rsp+8],ecx
00007FF736F41AA8 push rbp
00007FF736F41AA9 push rdi
(...)
Почему этот прыжок в средней точке? Почему вызов не идет, чтобы сразу добавить реализацию функции?