как загрузить этот код?

#linux #gcc #assembly #boot

#linux #gcc #сборка #загрузка

Вопрос:

я новичок в сборке и программировании на c (использую GCC в Linux)

может кто-нибудь здесь сказать мне, как скомпилировать код c в сборку и загрузиться с него с помощью pen drive

я использую команду (в терминале Linux) :

  gcc -S bootcode.c
  

код выдает мне загрузочный код.S-файл

что мне с этим делать???

я просто хочу скомпилировать следующий код и запустить его непосредственно с USB-накопителя

 #include<stdio.h>
void main()
{
  printf ("hi");
}
  

любая помощь здесь???

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

1. Взгляните на wiki.osdev.org/Main_Page и особенно — wiki.osdev.org/Boot_sequence чтобы увидеть, как загружается компьютер.

2. Если я вас правильно понял, вы хотите загрузить USB-накопитель непосредственно из BIOS? Это огромная задача, требующая много работы, которую обычная программа не может выполнить (например, нет операционной системы для вашего printf для использования). Вам следует выполнить поиск в Google по разработке кода загрузчика и операционных систем.

Ответ №1:

Прежде всего,

Вы должны знать, что когда вы пишете коды загрузчика, вы должны знать, что вы СОЗДАЕТЕ СВОЮ СОБСТВЕННУЮ СРЕДУ КОДА, это означает, что вам не доступна такая готовая библиотека C или что-то подобное, ТОЛЬКО и ТОЛЬКО СЛУЖБЫ BIOS (или ПРОЦЕДУРЫ ПРЕРЫВАНИЯ).

Теперь, если вы получили это, вы, вероятно, поймете, что приведенный выше код не будет загружаться, поскольку у вас нет заголовка «stdio.h», это означает, что процессор при выполнении вашего скомпилированного кода не найдет этот заголовок и, следовательно, не поймет, что такое «printf» (посколькуprintf — это метод stdio.заголовок h). Поэтому, если вы хотите напечатать какую-либо строку, вам нужно написать эту функцию САМОСТОЯТЕЛЬНО либо в отдельный файл в качестве заголовка и связать его объектный файл во время компиляции при создании конечного двоичного файла, либо в том же файле. это зависит от вас. Могут быть и другие способы, я с ними не очень хорошо знаком, просто проведите некоторые исследования.

Еще одна вещь, которую вы должны знать, именно BIOS отвечает за загрузку этого загрузочного кода (вашего кода выше в вашем случае) в ячейку памяти 0x07C00 (0x0000h: 0x7C00 в представлении segment: offset), поэтому вы ДОЛЖНЫ указать в своем коде, что вы пишете этот код в этой ячейке памяти,либо с помощью

1-использование инструкции ORG

2-Или загрузив соответствующие регистры для этого (cs, ds, es)

Кроме того, вы должны ознакомиться со схемой представления памяти segment: offset, просто погуглите или почитайте руководства Intel.

Наконец, чтобы BIOS загрузил ваш код в 0x07C00, загрузочный код не должен превышать 512 байт (ТОЛЬКО НА ПЕРВОМ СЕКТОРЕ ЗАГРУЗОЧНОГО НОСИТЕЛЯ, поскольку размер раздела составляет 512 байт), и он должен найти в последних двух байтах этого первого сектора (байт 510 и байт 511) вашего кодаподпись загрузки 0x55AA, иначе BIOS не будет считать этот код ЗАГРУЗОЧНЫМ. Обычно это кодируется как :

ORG 0x7C00

вашего загрузочного кода и загрузки большего количества кодов, начиная с 512 байт, будет недостаточно.

раз 510 — ($ — $$) db 0x00; Обнуление до 510 байт

                dw 0xAA55 ;Boot Sector signature,written in reverse order since it

                             will be stored as little endian notation
  

Просто чтобы вы знали, я здесь не все описываю, потому что, если это так, я буду писать об этом страницы, вам нужно поискать больше ресурсов в сети, и вот ссылка для начала (кодирование на ассемблере):

http://www.brokenthorn.com/Resources/OSDevIndex.html

Вот и все, надеюсь, это было полезно для вас … ^_^

Khilo — АЛЖИР

Ответ №2:

Загрузка компьютера не так проста. Необходимо написать загрузчик. Загрузчик должен подчиняться определенным правилам и соответствовать оборудованию, такому как ПЗУ. Вам также необходимо отключить прерывания, зарезервировать некоторую память и т. Д. Посмотрите MikeOS, это отличный проект, который может лучше помочь вам понять процесс. Приветствия