· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› как создать COM файл ...

Посл.отвђт Сообщенiе


Дата: Окт 10, 2003 14:49:29

Подскажите, плиз, как создать на ТАСМе СОМ файл который содержалбы код под 16 бит и рядом код под 32 бит, вообще возможно ли такое прямым способом или тока создать ЕХЕ файл с 2-я сегментами и затем из него "выдрать" эти сегменты ?


Дата: Окт 10, 2003 16:33:41

group _code code16,code32
assume cs:_code

segment code16 use16
org 256
start:

ends code16

segment code32 use32
ends code32

PS: Уж не ОС ли ты пишешь?


Дата: Окт 10, 2003 16:42:50

ТОЧНО!!!
:-)
Предмет у нас называется Анализ и Моделирование Операционных Систем, вот по нему у нас лабы ...

А с сегментом данных аналогично?
Мне еще надобы рядом с сегментом code16 расположить сегмент с данными data16, а потом за code32 расместить data32 ... (не обязательно, но мне почемуто так хочется ... :-)) или поправь меня.
В общем этот файл должен будет загружаться боотсектором ..., т.е. это микроядрышко.
P.S. Сенкс!!!.


Дата: Окт 10, 2003 17:17:49 · Поправил: Black_mirror

lazari
Просто включаешь все сегменты в одну группу и все. Общие данные для обычного и защищенного режима помещай в 16-битный сегмент. Тогда к нему и из 16-и, и из 32-битного кода можно будет без проблем обращатся. А иначе tasm тебя замучает сообщениями что пытаешься в 16-битный регистр 32-битное смещение заслать.
PS: Завидую я вам. У нас лабы по АрхОС были жутко отстойныли. Писали те же программы что и в двух других курсах: пищание спикером, вывод на принтер, чтение финта и т.д. И все прод ДОС.
Как напишешь кинь мне на мыло, заценить.


Дата: Окт 10, 2003 17:46:40

Ясненько, ща буду пробовать ...
А ТАСМ меня уже замучал, почти неделю ни как не могу с ним договориться на счет этих адресов :-(

PS: Я тебя понимаю, у нас до сих пор (первые 3 курса) тоже отстойные условия задач были (задачки в 3 строчки :-)). Вот тока на 4-ом стало интереснее ...
А на счет кинуть на мыло - без базара, как тока будет чето рабочее - скину, ща пока тока бут сектор сделал, а терь за следующую ступень взялся ...


Дата: Окт 12, 2003 15:40:42

Выручайте снова, плиз, терь вот какая трабла:
сделал я СОМ файл по схеме аналогичной той из поста Black_mirror:
group _code ...
ends _code
все точно как хотел, между секциями кода 16х и 32х есть еще секция данных 16х, и секция данных 32х после сода 32х.
С бута этот COM грузится по адресу 1000h:0100h
т.е. 10100h в защищенном режиме, но все offset-ы ТАСМ выщитывает как для СОМ файла (0000h-FFFFh) а мне ведь надо считать для защищенного режима, т.е. 10000h-1XXXXh
вот реальный пример (вывод строки на экран, DS & ES инициализированы соответственно):
mov esi,offset m_init_pm+KERNELIMAGE
mov edi,0160
mov ecx,l_init_pm
rep movsb
KERNELIMAGE у меня равно 10000h.
Вот вопрос: как обьяснить ТАСМу как правильно считать смещение в данном случае или мне так и придется все делать ручками ... :-(


Дата: Окт 12, 2003 16:25:13

lazari
В GDT объяви два дескириптора: дескриптор кода и дескриптор данных с базой 10000h и лимитом 64K. Тогда никакие смещения пересчитывать не придется. Для доступа ко всей памяти объявляешь дескриптор с базой 0 и лимитом 4Gb. Но если ты хочешь использовать flat модель то просто загрузи этот com-файл по адресу 100h. Главное только прерывания БИОСа не вызывать. Или в файле сделать дыру для его данных, чтобы он чего-нибудь другого не испортил.


Дата: Окт 12, 2003 17:53:45

lazari
Может лучше использовать fasm?
У меня получилось сделать так чтобы в 32х-битном коде правильно вычислялось смещение. Также получилось сделать сегмент с общими данными. При доступе к которому из 16-битного кода смещение считается относительно начала сегмента, а при доступе из 32-битного относительно начала памяти. Правда в этом сегменте не получится сделать переменную типа var2 dd offset var1.
Пример прилагается.

_243481746__pm.zip


Дата: Окт 12, 2003 18:22:47

Да, вариант со вторым дескриптором данных, мно понравился, довольно оригинально и просто. Думаю я на нем и останавлюсь, если все будет работать.
А вот что делать с вызовом процедур? Аналогичный трюк? Не знаю что из этого выйдет, видимо еще долго придется биться головой об препятствия ...
Я использую ТИНИ модель памяти, мне этого должно хватить.
А переходить на другой ассемблер думаю нет смысла, т.к. это еще всеголишь лабораторная работа, а не серьезный проект и нету времени осваивать его, я пока что имею небольшой опыт работы тока с ТАСМ и МАСМ32.


Дата: Окт 12, 2003 19:15:53

lazari
Препятсвия будут только при переходе в защищенный режим и обратно. jmp придется делать руками. Ну и еще будут препятствия если ты вдруг захочешь одни и те же процедуры вызывать в реальном и в защищенном режиме. Хотя можно весь код сделать 16-битным.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.061