SII писал(а):
Это зависит от используемого транслятора и читается в документации на него. Ваш код вроде как для MASM и заполняет, похоже, до 509-го байта включительно (т.е. до полных 512-и байтов остаётся ещё три байта). Этот код работоспособен только в том случае, если стоит ORG 7C00h, т.е. при "переезде" на другой адрес он начнёт давать неверные результаты.
Использую FASM. Смещение 7С00h поставил , поскольку это загрузочный сектор.
Станислав писал(а):
Если вы говорите о МБР загрузчике, то там идёт код в начале 512 байт а в конце два байта, без них не загрузится
db 55h, 0aah
но перед ними идут записи о 4х партишенах и без них мбр может не загрузиться (зависит от биоса)
разделить код и зиписи в конце можно командой times 440 - ($-$$) db 0 она сама отступит нужный объём, или times 510 - ($-$$) db 0 если записи о партишенах делаются програмой например dmde-free при копировании его на диск.
Если это не МБР то в начале идёт прыжок jmp Start (3байта) потом запись о файловой системе партишена, код и в конце после кода:
times 510 - ($-$$) db 0
db 55h, 0aah
Такой загрузчик копируют на первый сектор логического диска (партишен который описан в МБР и активирован 80h), он загрузится если есть правильный МБР на физическом диске в первом секторе.
О МБР есть статьи, наберите МБР в любом поисковике
Да, это МБР. Кстати, использую эмулятор emu8086 , может оно еще налаживает ограничения. Выбираю в нем Фасм.
Вот как я сделал:
Код:
jmp 0000h:7DFFh ; прыгает на адрес в оперативке, который идет сразу за МБР (7c00h + 512d)
msg DB 'For laoding OS press any key ...',0
jmp @1
db 512-($-7c00h)-2 dup (0)
@1:
db 55h, 0aah
buf rb 512 ; сюда загружается мое ядро. Эта переменная,по идее,смещена в оперативке на 512 от начала - после МБР
Оно работает , но вот непонятность - оно делает jmp 0000h:7DFFh (т. е. прыгает на мою переменную buf в которую загрузилось ядро ) ... и вот мне непонятно - если оно перепрыгивает db 512-($-7c00h)-2 dup (0) , то точно ли оно заполнит нулями пространство на дискете между 7С00h и buf (ведь на дискету буду записывать) ? ведь перепрыгивает это. Но видимо работает, поскольку эмулировал загрузку с дискеты ... работает, ну и ладно.
Кстати , если вместо "db 512-($-7c00h)-2 dup (0)" поставить "times 510 - ($-$$) db 0" точно также работает.
Проблема в другом. Я хочу мою дискету разметить: вот тут у меня МБР(и я заполняю все это пространство до 512 байта) , вот тут у меня код ядра до 1024, вот тут (начиная с 1024) следующий сектор, у меня начинается мой жесткий диск(как я говорил сразу будет ОЧЕНЬ примитивно . но не факт что ЖД именно здесь будет, скорее всего не здесь). Так вот, написал я кусочек ядра и хочу остальное пространство(до 1024) заполнить чем-нибудь , нулями например ... хочу точно знать что все ,что я пишу после заполнения нулями, что оно ляжет на дискету по адресу 3-го сектора (то бишь начиная с 1024). И вот я после своего кода делаю вот так:
Код:
jmp 0000:8200h
jmp @2
db 1024-($-7c00h) dup (0)
; times 1024 - ($-$$) db 0 ;это тоже не помогает(((
@2:
Дальше идут переменные которые используются в коде ядра. Ведь правильно же - чтобы заполняли оперативку после ядра.
Вобщем суть такова что , вроде , все делаю аналогично как в МБР, но там оно работает (заполняет нужное пространство) , а здесь ругается :
Цитата:
invalid value : db 1024-($-7c00h) dup (0)
.
Потому не понимаю как этим пользоваться.
phantom-84 писал(а):
Шо-то я "третьего" байта вообще не увидел перед загрузочной сигнатурой. Да и передача управления на нее тоже выглядит как-то странно, несмотря на то, что коды 55h и 0AAh кодируют две законченные команды, - такое возможно в случае загрузки/записи продолжения программного кода поверх сигнатуры, но обычно ее не трогают и догружают код в позицию после сигнатуры. Т.е. на лицо действительно полное непонимание автором данного фрагмента кода. Хотелось бы узнать, понимает ли он, что означает "?", "dup" и т.п.
Станислав в принципе все сказал. Однако следует учитывать, что не все ассемблеры поддерживают "$$". Я вообще часто использую (совместно с "org") самую простую для меня форму записи этой конструкции, хотя и не самую универсальную:
Код:
org 7C00h
...
db 7DFEh-$ dup 0 ; если дальше кодогенерация продолжается, т.е. присутствует сигнатура, то достаточно использовать "rb 7DFEh-$" (если поддерживается "rb")
dw 0AA55h
То я химичил там кое-что ... сам байт убрал, а что для него место учитывал, то забыл исправить "3" на "2". Его там нету.
Я понимаю "?" и "dup" - первое просто резервирует место (кстати, интересно было бы узнать какое там значение находится, если ничем его не заполнить, а просто зарезервировать) , а второе присваивает значение.
Такие вот дела.