как получить размер программы на стадии компиляции компилятор M$VC Код (Text): #define MULTIBOOT_HEADER_MAGIC 0x1BADB002 #define MULTIBOOT_HEADER_FLAGS 0x00010003 #define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002 #define START_ADDRES 0x100000 #define STACK_OFFSET 0x10000 #define IMAGE_SIZE 0x600 #if defined(_M_IX86) void main(); void __declspec(naked) start() { __asm { mov esp,100000h+STACK_OFFSET push 0 popfd call main cli hlt }; } const unsigned mbheader[]= { MULTIBOOT_HEADER_MAGIC, MULTIBOOT_HEADER_FLAGS, -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS), (unsigned)mbheader, START_ADDRES, START_ADDRES+IMAGE_SIZE, START_ADDRES+STACK_OFFSET, (unsigned)start }; #else #error Not defined multiboot entry for this arhitecture #endif void main() { } Мне нужно чтоб на стадии компиляции вместо макроса IMAGE_SIZE подставлялся размер программы автоматически...
вот пример из какого-то ассемблера идущего вместе с GCC Код (Text): multiboot_header: .long MULTIBOOT_HEADER_MAGIC .long MULTIBOOT_HEADER_FLAGS .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) .long multiboot_header .long _start .long _edata .long _end .long multiboot_entry _edata это конец секции данных, после неё идет секция BSS которая заканчивается на _end как мне такое повторить в M$VC?
с макросами никак, препроцессинг идет до компиляции, на стадии препроцессирования размер программы не может быть известен. без макросов - хз, вроде тоже никак в асе не так - длина команды фиксирована и может быть определен размер программы сразу после прохода по листингу. но тоже, естественно, не на стадии препроцессирования
Pushkoff возьми какуюнить переменную глобальную неинициализированную из начала и ее адрес округли вниз до границы секций. Я думаю, что точно попадешь
Great А если в проекте много модулей, как узнать какой из них будет первым? По моим наблюдениям, секция .bss является продолжением секции .data, в данный момент у меня нет переменных которые должны попадать в секцию .data, но есть переменная которая должна попасть в секцию .bss, следовательно raw_data_size секции .data должно быть равно 0 (так как все данные неинициализированы), а оно равно 0х200. При больших размерах секции данных секция .bss не отображается в файле... компилятор из M$VC 9.0 Express
Great по коду который я привел происходит запуск программы при помощи загрузчика GRUB, поэтому значение размера должно быть вкомпилировано в программу...
Откомпилировать с фиктивным значением, после компиляции посмотреть размер и хекс-редактором изменить фиктивное значение на актуальное )
FatMoon Я сейчас так и делаю, только компилирую второй раз со значением размера программы, полученным при первой компиляции... Но это не очень удобно...