Почему мой компилятор (VS2017) выбрал «CALL-JMP» для достижения подпрограммы вместо «CALL»? - PullRequest
1 голос
/ 11 апреля 2019

C код:

#include <stdio.h>

int main(){
    printf("hello word!\n");
    return;
}

Код сборки:

push    offset aHelloWord ; "hello word!\n"
call    sub_41104B
add     esp, 4

Теперь я ожидаю, что sub_41104B приведет непосредственно к printf, но это не так:

sub_41104B proc near
jmp     sub_411870
sub_41104B endp

И, наконец, в sub_411870 запускается функция printf.Может кто-нибудь объяснить, почему компилятор не использовал просто call sub_411870?

1 Ответ

2 голосов
/ 11 апреля 2019

Теперь я ожидаю, что sub_41104B приведет непосредственно к printf ...

... или напрямую к puts().

...но это не тот случай

Разобрали ли вы объектный файл или конечный файл EXE?

Если вы разобрали файл EXE, вероятно, что вызванная вами функция реализована вLIB-файл как функция «переименовывает» другую:

int puts(const char *text) // this is sub_41104B
{
    return __x_puts(text); // __x_puts is sub_411870
}

Это очень часто встречается при вызове функции в DLL-файле.Однако в случае файлов DLL инструкция jmp является косвенным переходом (jmp dword ptr [411870]), а не прямым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...