ne_viens
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Код в .text находится, и программа может иметь только одну секцию- .text, используя только штатные средства C компилятора. MSVC не выделяет отдельную секцию для данных импорта (IAT + IT) внешних библиотек, а линкует их в .rdata. Внешние библиотеки загружаются не в секцию импорта а в адресное пространство данной программы. Загрузчик сканирует таблицу импорта, загружает там описанные библиотеки, находит адреса там-же описанных функций и записывает эти адреса в перxодники (IAT) программы. Секция импорта не программируется, а в таблицу импортов добавляются внешние библиотеки и их функции по мере надобности. Например, написали в коде MessageBox(); , компилятор находит в <windows.h>, что эта ф-я __stdcall с 4 аргументами, и обзывает ее как _imp__MessageBoxA@16, а дальше уже линкер находит такую ф-ю в user32.lib и добавляет эту информацию в таблицу импорта. Для указания адреса исползуется & а не int (например, &variable). B ассемблере int называется dword, short - word, char - byte. А в описаниях ф-ий применяется для спецификации возвращаемого значения и типа аргументов. (например, int MyFunc(int i, char* c); указывает, что MyFunc() получает int i и адрес байта(ов) c, а возвращает int). Аналогия байта на C- char, и нет смысла сокращать счётчики до char-ов, так как операции с данными не кратными 32 битам на 32 битном процессоре выполняются гораздо медленнее. Линкер при оптимизации их всёравно к int приводит. Очевидно, что, пройдя цикл, pi просто принимает такое круглое значение. |