2013-07-09 6 views
3

Итак, я решил изучить язык Ассамблеи для 80х86 этим летом. Я собрал четыре книги по сборке. До сих пор я читал первые два, и я на полпути, хотя третий, и я думаю, что понимаю все, что было представлено. Я написал несколько программ Hello World, а также другие маленькие упражнения из книги, и мне очень нравится этот язык. Однако есть одна вещь, о которой никто из книг не обращался до сих пор, и это то, что меня больше всего интересует. То есть, как вы обращаетесь к аппаратным средствам непосредственно со языка ассемблера? До сих пор в книгах автор использовал системные вызовы, переходы на определенные функции в памяти и прерывания, но эти методы полагаются на уже существующее в системе программное обеспечение.Как вы напрямую взаимодействуете с оборудованием с языка Assembly?

Я пишу свои программы, используя NASM, и загружаю их в старый компьютер Pentium I. Сейчас я не использую никаких ОС, просто BIOS. Я предполагаю, что я пытаюсь написать свою маленькую ОС, которая автономна и не полагается на BIOS (кроме начальной загрузки). Может кто-нибудь мне помочь?

+3

Вы можете начать с [OSDev] (http://wiki.osdev.org/Main_Page). –

ответ

6

Как вы загружаете и запускаете свой код только с помощью BIOS?

Предполагая, что вы действительно используете только BIOS, или даже если вы используете DOS, все будет в порядке. Вы просто обращаетесь к аппаратной части, указываете адрес какого-либо аппаратного регистра прямо в инструкции или помещаете этот адрес в регистр и выполняете непрямое чтение или запись в регистре.

Доступ к оборудованию затруднен только при наличии операционной системы, что делает аппаратное обеспечение чем-то полезным, конечно, намного проще с операционной системой.

К счастью, BIOS перечислил аппаратное обеспечение pci (e), то есть способ делать что-то на ПК, поэтому вы можете использовать некоторые утилиты DOS, которые, как я думаю, могут узнать, как аппаратное обеспечение было перечислено. Другим «способом ПК» для PCI (e) адреса для аппаратного обеспечения является также адрес x86, два адресных пространства перекрываются, поэтому, как только вы получите адрес PCI (e) для некоторых периферийных устройств, вы можете использовать этот адрес в своем код. естественно, поскольку окно pcie относительно невелико для таких вещей, как видео, вам все равно приходится просматривать через периферийную память, но это периферийное устройство, а не ПК или x86.

Если ваша материнская плата имеет последовательный порт/UART, это будет лучшее место для прямого доступа к аппаратным средствам.

Еще лучше было бы использовать симулятор pcemu или другой, вместо того, чтобы запускаться на аппаратном обеспечении, в зависимости от вашего выбора симулятора, у вас может быть намного лучшая видимость того, что происходит, и периферия, такая как uart, может быть даже такой проще, поскольку вам может не потребоваться инициализировать его, просто начните бросать в него байты (пока вы не узнаете больше).

+0

Если вы хотите написать свою собственную маленькую ОС, сборка - это плохой выбор, сделайте это, как и все остальные, в основном C с небольшой сборкой, где это абсолютно необходимо. Тот же ответ, не имеет значения на языке, вы хотите получить доступ к оборудованию напрямую, просто сделайте это, прочитайте/напишите на адрес. DOS является хорошим выбором в качестве операционной системы разработки, так как достаточно операционной системы для вас, но и тривиальным, чтобы уйти с пути, если вы хотите обойти его. В течение долгого времени Windows была просто программой DOS, которая в какой-то момент перестала делать вызовы dos. (linux может/может быть запущен так же) –

+0

После прочтения ответа Риенхарда я настоятельно рекомендую, что, поскольку вы уже не знаете ответа на свой вопрос (вы его просили публично), вам следует искать что-то вроде pcemu, open source , Симулятор набора инструкций 80x86 с возможностями BIOS и DOS, что-то, на чем вы можете построить, но в то же время имеете шанс на отладку, когда вы проходите этот образовательный этап и прокладываете себе путь вверх. Видео, жесткий диск, USB-накопители - это основные месяцы обучения, которые помогут вам делать то, что вы пытаетесь сделать. начать так просто, как вы можете уйти без серьезного провала. –

+0

Для загрузки я просто пишу свой собранный код в первый сектор гибкого диска с помощью программы под названием HxD. Биос загружает его автоматически. Теперь, как вы определяете адрес аппаратного обеспечения, с которым хотите взаимодействовать? Это написано в руководстве? Это то же самое для всех ПК или отличается от машины к машине? И можете ли вы дать мне пример небольшого кода или ссылку на пример того, как это делается? Большое спасибо! – Marcos

4

dwelch полностью прав, но я хочу ответить на ваш вопрос на более базовом уровне:
В большинстве случаев вы получаете доступ к оборудованию через регистры управления и состояния. В самом простом случае, например, вы хотите прочитать из последовательной строки, и вы ожидаете прибытия нового персонажа. Регистр состояния может установить бит «готов», а затем вы читаете символ из другого регистра.
Это означает, что вам необходимо адресовать регистры, такие как адреса памяти. Опять же, в большинстве случаев это делается путем отображения регистров в адресное пространство, то есть регистры имеют адреса памяти в диапазоне адресов, где нет памяти, например. самые верхние адреса. Затем вы можете использовать большинство инструкций, которые обращаются к памяти, например. загружать и хранить.
В реальном мире ситуация сложнее, потому что процессор использует виртуальные адреса, которые сопоставляются с физическим адресным пространством (где расположены регистры) с помощью блока управления программируемой памятью.

+0

после включения mmu да, что добавляет еще большую сложность ... –