Пишу программу, которая переводит процессор в защищенный режим. В таблицу дескрипторов сегментов необходимо добавить дескриптор TSS. Проблема в том, что сам TSS располагается в секции данных и его адрес становится известен только после компиляции, причем в формате сегмент:смещение. Писать дополнительный код для вычисления физического адреса TSS и добавления его в качестве базы в дескриптор нежелательно, можно ли сделать так, чтобы адрес вычислялся и помещался в дескриптор при компиляции кода автоматически и дескриптор сразу жестко прописывался в сегменте данных, например с помощью макроса?
Двух тем? Если создалось две темы подряд извиняюсь, глюк с инетом был, ну а в этом форуме создат, так как это больше вопрос по ассемблеру, как по инструменту, чем конкретно по работе в OS.KERNEL.
Двух тем? Если создалось две темы подряд извиняюсь, глюк с инетом был, ну а в этом форуме создат, так как это больше в%E
flat model чем не устроила? в x86-64 от TSS толку мало, да и тем более модель памяти там только плоская.
Ну еще раз извиняюсь за три темы! Ну а если бы я использовал flat? Хотя нежелательно из-за особенностей проги.
Досовая прога что-ли? Я не мучаюсь и гружусь с дискеты. Если нужна обязательно досовая прога, то можно выкрутится с помощю двойной компиляции. Я пишу макрос show, который выводит на экран адрес, на фасме: macro show [procedure]{ bits = 16 display `procedure,' equ ' repeat bits/4 d = '0' + procedure shr (bits - %*4) and 0Fh if d > '9' d = d + 'A'-'9'-1 end if display d end repeat display 13,10 } TSS_1: .... TSS_2:..... show TSS_1, TSS_2 Потом пишу в конце файла show что_нужно_показать, включаю в файл offsets.inc Собираю как fasm blabla.asm blabla.bin | find "TSS_" > offsets.inc и еще раз fasm blabla.asm blabla.bin , вуаля
Code (Text): TSS_1: .... dd TSS_1 так не проще? предполагается что модель памяти flat, хотя можно вычесть базовый адрес сегмента если надо.
Ответ непосредственно по вопросу топика: не получится, т.к. база TSS хранится в дескрипторе в расщепленном виде. Сам дескриптор можно прописать в исходнике, но базу придется скорректировать во время запуска. Кстати, здесь был упомянут вполне примелемый выход из этой ситуации - загрузка исполняемого образа по фиксированному адресу.
Образ грузится по фиксированному адресу 10000h. Но вот адрес сегмента данных, в котором Tss и расположен известен только после компиляции.
Какой выходной формат используешь, какой компилятор, из какого количества объектных модулей собираешь исполняемый образ? ЗЫ В крайнем случае можно базу в дескрипторе прописать в исполняемом образе уже после компиляции
Ну если com-файл, как это по идее и должно быть, имеет размер, не превышающий 64 кб, то ты можешь старший байт базы прописать равным 0, находящийся перед ним байт базы прописать равным 1, а для младших двух байт использовать 16-разрядный релок, т.к. младшие два байта базы размещены в дескрипторе вплотную друг к другу. Получишь базу вида: 0x0001XXXX.
Хотя нет, ведь у com-файла стартовое смещение 0x100, которое трудно будет отнять от релоцируемого элемента.
Может, перепишешь свой код под какой-нибудь ассемблер, который позволяет формировать чистые бинарники с нулевой внутрисегментной базой, например, насм или фасм?
Тогда в чём проблема вообще не понятно. Раздули топик непонятно из-за чего Если у тебя COM или чистый бинарь - значит сегмент один. Линейный адрес TSS будет равень адресу загрузки плюс смещение в этом сегменте. LinearAddr=ImageLoadBaseAddr + offset TSS Всё. Для заполнения дескриптора (разрезания на куски) можно тоже встроенными командами MASM обойтись. Например первый байт (счёт от нуля) получается так: (LinearAddr SHR 8) AND 0FFh Аналогично можно выделить любые другие нужные биты адреса.