Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.01.2023, 15:41   #11
Окоза-Окоза
Пользователь
 
Регистрация: 09.01.2023
Сообщений: 19
По умолчанию

это старый проект. Написанный на nasm.

Последний раз редактировалось Окоза-Окоза; 10.01.2023 в 15:43.
Окоза-Окоза вне форума Ответить с цитированием
Старый 10.01.2023, 15:59   #12
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Так написали бы на fasm или на nasm сразу генератор образа вместе с fat. Так было бы проще. откомпилировал и сразу получаешь рабочий образ с fat12 и внедренным в него загружаемым ядром.

Т.е. asm проект для fasm будет на выходе давать не 512 байт загрузочный сектор, а сразу 1,4 Мб образ дискеты или 4 Мб образ жесткого диска. А внутри этого образа можно сразу расположить и загружаемые файлы (директива file для fasm или incbin для nasm позволяет внедрять файлы). Останется только вычислить его размер и исправить таблицы fat и rootDir.

Последний раз редактировалось macomics; 10.01.2023 в 16:02.
macomics вне форума Ответить с цитированием
Старый 10.01.2023, 21:33   #13
Окоза-Окоза
Пользователь
 
Регистрация: 09.01.2023
Сообщений: 19
По умолчанию

на nasme я лет 5 назад писал, забыл его
Окоза-Окоза вне форума Ответить с цитированием
Старый 10.01.2023, 21:37   #14
Окоза-Окоза
Пользователь
 
Регистрация: 09.01.2023
Сообщений: 19
По умолчанию

А если так, то как сделать бутлоадер и то чему посвящена тема?
Окоза-Окоза вне форума Ответить с цитированием
Старый 10.01.2023, 22:25   #15
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Для начала прикидывайте что такое образ диска. Это просто файл длинной
Код:
; на fasm
BytesPerSector = 512
TotalSectors = 2880
rb BytesPerSector * TotalSectors - 1
db 0 ; Иначе не сгенерирует необходимое количество байт, а разработчик не рекомендует использовать times и dup
Это сгенерирует файл необходимой длины

Далее мы можем сгенерировать в том же файле загрузочный сектор
Код:
virtual at 0x7C00 ; Это создаст загрузочный сектор в виртуальном пространстве
  boot_sector_code:: include 'boot_sector.asm' ; директива org 0x7C00 в начале исходника не нужна
end virtual
repeat BytesPerSector ; А это скопирует его из виртуального пространства в начало образа диска
  load a byte from boot_sector_code:(0x7C00+%-1)
  store byte a at (%-1)
end repeat
Но скажем с fat и RootDirectory удобнее поступить по другому. Сейчас файл просто заполняется 0 и поверх них записывается загрузочный сектор. А можно загрузочный сектор, fat и RootDirectory создать сразу, а кластеры заполнять внедряемыми файлами. Внедряя файл RootDirectory и fat таблицы при помощи директивы store заполняются информацией о файлах.

Код:
; Константы определяющие размеры диска
TotalSectors = 2880
BytesPerSector = 512
SectorsInCluster = 1
NumberOfFats = 2
SectorsPerFat = 9
RootDirectoryEntries = 224



virtual at 0x7C00 ; Это создаст загрузочный сектор в виртуальном пространстве
  boot_sector_code:: include 'boot_sector.asm' ; директива org 0x7C00 в начале исходника не нужна
end virtual
repeat BytesPerSector ; А это скопирует его из виртуального пространства в начало образа диска
  load a byte from boot_sector_code:(0x7C00+%-1)
  db a
end repeat
FatStart: repeat NumberOfFats
  db 0xF0, 0xFF, (BytesPerSector - 2) dup (0) ; Первый сектор FAT12
  db (BytesPerSector * (SectorsPerFat - 1)) dup (0) ; Остальные сектора
end repeat
RootDirectory: repeat RootDirectoryEntries
  db 32 dup (0) ; Блок Root
end repeat
rb BytesPerSector - ($ mod BytesPerSector)
BytesPerCluster = BytesPerSector * SectorsInCluster
; Здесь начинаются кластеры. Сюда внедряем файлы.


; Эту часть можно расположить в макросе внедрения файла, чтобы не повторять несколько раз для каждого файла
kernel_start: file 'kernel.com'
kernel_size = $ - kernel_start
rb BytesPerCluster - ($ mod BytesPerCluster)
kernel_clusters = ($ - kernel_start) / BytesPerCluster
store qword 'KERNEL  ' at RootDirectory
store dword 'COM ' at RootDirectory + 8
...
store word 2 at RootDirectory + 26 ; Номер первого кластера в цепочке
store dword kernel_size at RootDirectory + 28
repeat NumberOfFats
  repeat kernel_clusters
    ; Добавляем цепочку кластеров в fat
    ; Первый файл располагается в кластерах: 2, 3, 4, ..., kernel_clusters + 2
  end repeat
end repeat


; И оставшуюся часть заполняем 0 до конца образа диска
ImageSize = BytesPerSector * TotalSectors
rb (ImageSize - $ - 1)
db 0

; The end
P.S. Набирал в браузере. Могут быть очепятки. Надеюсь вы с ними разберетесь и доведете эти примеры до рабочего состояния.

Последний раз редактировалось macomics; 10.01.2023 в 22:33.
macomics вне форума Ответить с цитированием
Старый 10.01.2023, 22:51   #16
Окоза-Окоза
Пользователь
 
Регистрация: 09.01.2023
Сообщений: 19
По умолчанию

Спасибо, всё проверю и запущу.
Окоза-Окоза вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ядро программы С++ kineziz Общие вопросы C/C++ 3 06.06.2012 23:06
Чем отличаеться fasm от fasm editor&? TotKtoNado Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 07.11.2011 17:00
простейшее ядро lem Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 28.09.2011 16:37
Стек и bootloader kuraga1991 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 29.12.2010 22:17
Ядро Adblock PHP 13 22.06.2010 21:16