| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm: Общие вопросы > Asm с дискеты |
| Автор: Felt 7.5.2005, 05:34 |
| Привет народ. Я хочу поместить программу на асемблере на дискету и выполнить ее при загрузке компа с дискеты. Можно ли написать и проверить такую прогу из под Windows, а потом как-нибудь переписать программу, оставив только двоичый код, необходимый для загрузки компа (ведь в экзешнике хранятся еще и заголовки и другая муть)? Можно ли написать такую прогу на FASM, ну или в крайнем случае на MASM32. Как? Каким образом можно скопировать созданную программу на дискету (желательно код на Delphi, хотя и на C++ тоже сойдет)? Извините за ламерские вопросы, просто я мало что знаю об асме, а мне нужно просто написать некоторую полезную инфу при запуске компьютера с дискеты, т. е. никаких событий, связанных с работой мыши или клавиатуры там не будет. |
| Автор: D0lphin 7.5.2005, 07:48 |
| Гхм, постараюсь ответить... Зачем тебе exe-шник? Можно сделать так: В fasm пишешь что тебе надо, ну пусть для определенности: start: mov ax, 0xb800 mov es, ax mov [es:0x0], dword 0x1F291F3A loop1: jmp loop1 Компилишь, получаешь бинарник. С помощью RawWrite переписываешь на дискету, запускаешь VirtualPC....и улыбаешься Все так? ;) |
| Автор: Guest 7.5.2005, 08:32 |
| но ведь файл, который создает fasm привязан к конкретной ОС (DOS, Windows). А в том случае если я запускаюсь при включении компа, ОС еще не загружена. Получается что моя прога - это аналог ОС. Нужно чтобы там располагались только код без заголовков. И потом, чтобы запустить такую прогу BIOS смотрит на какой то адрес, т. е. прежде чем запускать, он сначала считывает с определенного места диска инфу, а потом запускает. Так вот откуда он ее считывает и что там нужно разместить. |
| Автор: D0lphin 7.5.2005, 09:05 |
| Ты бы сначала попробовал, что-ли... Фасм создает бинарник, т.е. просто двоичные инструкции процессору. Единственное к чему они привязаны это х86 архитектура. Как я написал выше - все работает. Если уж тебе так интересно, то после проверки биосом подключенного оборудования управление передается процедуре начальной загрузки с дисков. Она загружает первый сектор с нулевой дорожки нулевой головки, размещая его в памяти по адресу 7С00h, и передавая управление после загрузки сектора по этому же адресу. Ответственность за дальнейшую загрузку компьютера ложится на код, содержащийся в этом секторе. Вот. Понятно? |
| Автор: Sardar 7.5.2005, 13:08 |
| Только еще нужно учесть что проц не в "защищённом режиме", менеджера памяти(страницы) еще нет, прерывания не обрабатываються, т.е. вообще ничего нет... Зачем такой изврат, не проще ли под DOS'ом загрузиться? |
| Автор: Chingachguk 8.5.2005, 00:39 |
| Как правильно указал D0lphin, при загрузке компа BIOS может смотреть на то, можно ли грузить с дискеты так называемый BOOT-сектор. Это настраивается в BIOS setup, если надо, чтобы BIOS смотрел дисковод, ну или - для извращенцев - руками CMOS править ;) Далее. Когда ты делаешь "sys a:", то записывается прежде всего тот самый boot-сектор, он должен быть в определенном формате: первый код - jmp, обходящий таблицу в конце - маркер dw 55AAh Подробнее - см. любой бут-вирус, статьи по этому поводу, книга Коваля "как написать компьютерный вирус" и проч. Если ты записал в нужный сектор дискеты все в верном формате, то BIOS загрузит твой бут в 0000:7C00 и далее... на твое усмотрение. Например, досовский BOOT далее считывает несколько секторов в область чуть ниже себя и отдает им управление. Те он работает на уровне кусков кода, которые хранятся в некоторых секторах дискеты. Можешь записывать их куда хочешь, например в следующие за бутом сектора или еще куда, только если ты не хочешь порезать оригинальный системный код от команды sys a:, то с выбором секторов надо быть осторожным. Весь такой код должен быть перемещаемым, те он должен уметь работать будучи загруженным с любого адреса. Для этого обычно пишут в формате *.com, те обычный файл, в начале идет вычисление текущего адреса: call GetOfs pop si ; si= offset "pop si" |
| Автор: Chingachguk 8.5.2005, 00:49 |
| Отладка кода под "Windows". Конечно, можно написать смело свой код и засунуть его в BOOT дискеты. Но вот для отладки придется с нее загрузиться, а это долго, особенно если отлаживается сложный алгоритм, который работает после старта boot. Я использовал так называемый "загрузчик", это простая прога, которая читает с файла содержимое сектора (512 байт) по адресу cs:7c00 и передает ему управление. Те она как бы имитирует действия BIOS. Для примера выдерни из системной дискеты boot в такой файл и посмотри в отладчике, как он себя ведет. Старайся написать что-то подобное его действиям, но там много лишнего, так как - уже говорил - его основная задача это загрузка DOS. |