C++ function not called directly?

Viewed 113

Having such a simple c++ program

#include <iostream>

void my_int_func(int x) {
    std::cout << "Hello World: " << x << std::endl;
}

int main() {
    my_int_func(54);
}

I'm getting the following code in the IDA (PRO 7.5 SP3) while disassembled (and also similar results in the "Assembly Output" in the MSVC)

the main function:

_main           proc near               ; CODE XREF: _main_0↑j
                push    ebp
                mov     ebp, esp
                sub     esp, 0C0h
                push    ebx
                push    esi
                push    edi

__$EncStackInitStart_7:
                mov     edi, ebp
                xor     ecx, ecx
                mov     eax, 0CCCCCCCCh
                rep stosd

__$EncStackInitEnd_7:                   ; x
                push    36h ; '6'
                call    j_?my_int_func@@YAXH@Z ; my_int_func(int)
                add     esp, 4
                xor     eax, eax
                pop     edi
                pop     esi
                pop     ebx
                add     esp, 0C0h
                cmp     ebp, esp
                call    j___RTC_CheckEsp
                mov     esp, ebp
                pop     ebp
                retn
_main           endp

the code "under" the call j_?my_int_func@@YAXH@Z line above:

j_?my_int_func@@YAXH@Z proc near        ; CODE XREF: _main+19↓p

x               = dword ptr  4

                jmp     ?my_int_func@@YAXH@Z ; my_int_func(int)
j_?my_int_func@@YAXH@Z endp

the code of the my_int_func function itself:

x               = dword ptr  8

                push    ebp
                mov     ebp, esp
                sub     esp, 0C0h
                push    ebx
                push    esi
                push    edi

__$EncStackInitStart_6:
                mov     edi, ebp
                xor     ecx, ecx
                mov     eax, 0CCCCCCCCh
                rep stosd

__$EncStackInitEnd_6:
                mov     esi, esp
                push    offset j_??$endl@DU?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@@Z ; std::endl<char,std::char_traits<char>>(std::ostream &)
                mov     edi, esp
                mov     eax, [ebp+x]
                push    eax
                push    offset _Val     ; "Hello World: "
                mov     ecx, ds:__imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A ; std::ostream std::cout
                push    ecx             ; _Ostr
                call    j_??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z ; std::operator<<<std::char_traits<char>>(std::ostream &,char const *)
                add     esp, 8
                mov     ecx, eax
                call    ds:__imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z ; std::ostream::operator<<(int)
                cmp     edi, esp
                call    j___RTC_CheckEsp
                mov     ecx, eax
                call    ds:__imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z ; std::ostream::operator<<(std::ostream & (*)(std::ostream &))
                cmp     esi, esp
                call    j___RTC_CheckEsp
                pop     edi
                pop     esi
                pop     ebx
                add     esp, 0C0h
                cmp     ebp, esp
                call    j___RTC_CheckEsp
                mov     esp, ebp
                pop     ebp
                retn
?my_int_func@@YAXH@Z endp

My question is why there is an extra code to call the my_int_func function? Why does the my_int_func function is called indirectly by making a jmp instruction, not just directly by call'ing the my_int_func function addres?

P.S.
I'm working on the MSVC Community 2019 on Win 10 if it matters.

0 Answers
Related