В даном случае вопрос стоит поставить поконкретнее-чем компилить операционную систему? Boot сектор компилил на TASM, перекидывал в начало винта с помощью WinHex. Щас пишу ядро, которое должно запускатьса уже в готовом PM в модели памяти flat(переход в PM берет на себя загружчик). Если ядро компилить в масме с использованием .model flat, то создаеться ехе, в котором все оффсеты смещены на 00401000h(проверено дизасемблеров W32Dasm v10), а com файл, в котором оффсеты>=100h возможен только с .model tiny Или следует сразу написать свой ассемблер, который будет компилить проги для моей оськи, кинуть его на подопытный винт и заставить загружчик загружать его вместо ядра? А потом с его помощью накодить оську на голом месте? Просто было нечем заняться, вот и решил замутить сначала бут-сектор, а потом меня как затянуло...
FASM рулит давным давно! В нем можно все очень легко заделать и не мутить с какими-то там масм'овскими моделями, и, конечно же, там же можно и оффсет выставить спокойно через org 0 На нем кажется MenuetOS пишется, если не ошибаюсь
Спасибо за советы. Посмотрел я на фасм, вроде просто супер. Особенно радует не привязанность компилируемого файла к какой-то платформе, да еще и исходники вместе с компилером идут...Зашибись. Но ко мне опять подкралась недоверчивость, не поверил что оффсеты там можно выставить любые. Опасения оправдались. Код: format binary use32 org 7c00h mov eax,some_data some_label: jmp some_label some_data db 0h Что выдал W32Dasm v10: :00000000 B8077C0000 mov eax, 00007C07 :00000005 EBFE jmp 00000005 :00000007 0000 add dh, bh Во второй строчке по идее должно было быть записано jmp 00007c05h, а с оффсетом на some_data в первой строке все вроде в порядке. Я так и не могу понять-ето можно как-то исправить, указать компилеру что org должен действовать и на оффсеты на код, или придетьса все время писать в проге строчки типа jmp some_label+7c00h Тестировал етот пример и на фасм 1.58 и на 1.64 Если знаете, как исправить ситуацию помогите pls, а то расставаться с таким прекрасным компилером из-за оффсетов на код не хочеться nasm еще не пробовал. А вещь стоящая?
Вроде я понял в чем проблема... Ето не фасм пишет jmp 00000005h ,а дизасемблер в качестве операнда указывает оффсет в файле Или я не угадал?
zStorm Угадал, дело в том, что дизассемблер не может знать, какая база у кода. Либо берёт из заголовка её, либо нужно указывать вручную. Например, в Hiew - Ctrl+Shift+F5
zStorm не вижу тут особой проблемы. Раз это просто бинарник, ну и откомпили его как .com обыкновенный, а там ужо внутри и настроишь все сегменты и всё что нужно, если к тому же это ядерный модуль. Вообще посмотри как в винде сделано, сначала загрузчик br загружет ntloader, который в свою очередь явлеяется ничем иным, как односегментным бинарником, устанавливает защищённый режим, готовит память, и потом уже загружает ntoskrnl.exe и всё остальное, потому как понимает pe формат. Сделай многоэтапную загрузку, раз так хочется, ну а если нет, то только вариант, который я тебе сказал, с обыкновенным .com файлом.
Не угадал. это именно фасм пишет (как впрочем и другие ассемблеры), так как для near jmp - операндом служит смещение относительно текущего адреса.