Страницы

Поиск по вопросам

суббота, 30 ноября 2019 г.

Запуск низкоуровневых программ

#c++ #c #ассемблер #x86 #bios


Пытаюсь разобраться с низкоуровневым программированием. Поставил задачу — написать
"Hello World"-программу, записать её на флешку, перезагрузиться, запустить программу
с флешки (не запуская ОС). 


Можно ли это сделать на С или С++?
Как дать понять биосу, что её надо загрузить в память, выполнить?
Что из себя должна представлять программа? Исполняемый файл .com? .bin файл? Слышал,
это должно быть 16-bit приложение.
Если ли какие-то ограничения в названии программы?
Немного не по теме: Стоит ли пользоваться MASM? Какой Ассемблер сейчас наиболее популярен
для x86?


Заранне Спасибо!
    


Ответы

Ответ 1



Можно и на C/C++, но в очень урезанном виде - практически никаких библиотек. К вашим услугам только функции BIOS (int 13h) (Т.е. ваш "Hello, world" не должен выводиться ни с помощью puts или printf, ни тем более в cout). Никакой main в качестве входной точки (если только не измените соответствующим образом рантайм загрузчик). Т.е. только какие-то базовые вещи (типа арифметики :)), которые компилируются в .obj, и линкуются с начальным загрузчиком на ассемблере. Когда-то интереса ради урезал Turbo C++ до такого состояния - очень даже ничего получалось :) Я в свое время использовал TASM - отлично подходил для таких целей. Работать этот код начинает в реальном режиме, так что только 16 бит, причем (мы же о PC?) грузится он в память по адресу 0000:7С00 и начинает выполняться оттуда. Грузится он из MBR, так что если это что-то более-менее большое - то сразу должен сам считать и загрузить остальное в память. Считайте, что com-файл DOS, только никаких org 100h - что получено, то просто положено в очень конкретную :) память - и на диске, и в RAM, и управление передается первому байту. Соответственно, какое уж тут название программы... Название (файла) - это уже файловая система, а тут ею и не пахнет. Мой совет: виртуальная машина с виртуальным дисководом для дискет :), грузящаяся с такой виртуальной дискеты. Первый сектор - ваш. Это позволит вам делать, что хотите, ничем не рискуя, и очень легко записывать ваше творение в файл, не мучаясь с записью в конкретные сектора на диске/флешке (при этом можно легко натворить неприятностей).

Ответ 2



Да. Записать её в MBR флешки, а в BIOS выбрать загрузку с USB приоритетнее, чем с винчестера. Проще всего получить ассемблерный листинг и ввести код с помощью HexEdit прямо в MBR диска. Старайтесь в названии не использовать чужие торговые марки. Стоит. Отличный ассемблер.

Ответ 3



Если хотите поизучать низкоуровневое программирование - начните с микроконтроллеров там все под это дело заточено. Рекомендую с avr начать - есть много хороших статей по asm и с - очень удобные среды разработки и эмуляторы. Это если Вам x86 не принципиален.

Ответ 4



Да и практической пользы изучив низкоуровневое программирование МК все же поболее будет. Мало чем отличаться будет программирование x86 или МК если писать на C (С++ не очень распространен среди мк) с точки зрения обучения.Если конечно у Вас не стоит каких-то экзотических задач писать для 86 платформы.

Комментариев нет:

Отправить комментарий