Хочу создать загрузочную дискету на masm32 ;кусок проги для чтения с адреса 7e00h дискеты и записи их в оперу ;в регистрах должно быть записано: ;dl номер диска. 00h-диковод А ;dh номер головки ;ch номер цилиндра(дорожки) ;cl номер сектора ;al число секторов для чтения ;es:bx адрес, куда будут считаны данные(es-сектор, bx-смещение) mov dl,00h mov dh,00h mov ch,00h mov cl,02h mov al,01h mov ah,02h mov bx,7e00h xor ax,ax ;обнуляем ax mov es,ax int 13h Будет-ли это работать, надо-ли заполнить 510 и 511 байты ??? Какой файл(ехе,сом,bin) и как записать в нулевой сектор дискеты???
wcools Работать не будет хотя бы потому, что Вы сначала заполняете регистр ax, потом тут же его и обнуляете. Соответственно будет произведена попытка выполнить нулевую функцию 13-го прерывания. Заполнять последние два байта первого сектора дискеты разумеется нужно. На этот вопрос Вы лучше сами себе ответьте. Всё, что нужно знать, - это то, что исполнение кода начнется прямо с первого байта, записанного Вами. А там уже сами смотрите, что Вы туда поназаписали. Сюда же еще один вопрос, на который Вы должны для себя ответить: а что будет исполнять процессор, когда он выполнит последнюю операцию из того кода, который Вы написали? Как записать в нулевой (который на самом деле первый) сектор. Можете для себя сами программку написать (CreateFile в помощь), а можете использовать, например, WinHex.
??? Я заполнил не ax , а ah для выполнения 13 прерывания. Во всех примерах, которые я смотрел ах обнулялся, только в первых строках. Я не силен в этом (блин, в техникуме этому не учат, проходим дурацкий MFC). Помоему для ехе обязательно нужна ОС, для сом не знаю... Прошу обьяснить принципиальные отличия, чтобы я хотябы мог выбрать: чтоже мне записывать на дискету. И вообще знать это необходимо, когда-нибудь да пригодится. В оперативке будет лежать считанная программа (с этим я думаю спралюсь) затем я сделаю jmp на 7e00h.
wcools times (512-2-($-7C00h)) db 0 times переменная К примеру конструкция вида pp (100) db 0 Означает что будет созданная переменная путем дублирования 100 раз db 0 Массив из 100 байт заполненных нулем. $ - текущей адресс Тем самым конструкция times (512-2-($-7C00h)) db 0 заполняет нулями до границе 510 байт. И два последних байта db 055H,0AAH признок конца бут сектора.
wcools ah и al - части регистра ax (по крайней мере логически, о физическом различии сейчас не имеет смысла говорить). Поэтому если Вы обнуляете ax, то ah и al тоже обнуляются. Скорее всего он для того и обнулялся, чтобы загрузить сегментные регистры. В Вашем случае - только es. Почему обнулялся только в первых строках, я думаю, уже понятно. Нужна ОС, не нужна ОС - это спорный вопрос. Нужен загрузчик. Точно так же, как он нужен и для com-файлов (которые по большому счету ничем не отличаются от bin). Разница между exe и com в том, что exe начинается с заголовка, который условно является данными, т.е. не предназначен для исполнения. Если Вы запихнете exe (вместе с заголовком) в первый сектор, то процессор будет пытаться исполнить заголовок, как код. Ничего хорошего из этого не получится. Разница между com и bin - это разница стадии компиляции, а не исполнения. И состоит она в том, что все абсолютные смещения будут вычисляться для com-файла со сдвигом в 100h байт, а для bin Вы можете указать любой сдвиг (т.к. bios загрузит Ваш код по смещению 7С00h, то обычно этот сдвиг и выставляют равным 7C00h). Вывод из этого можно сделать один: нет никакой разницы, возьмете ли Вы com-файл или bin-файл, но для com придется 1) либо скорректировать регистр ds на стадии исполнения (т.к. данные адресуются через него) 2) либо корректировать все смещения на стадии разработки программы 3) либо использовать дельта-смещение 4) либо вообще не обращаться к данным в памяти Я бы предпочел второй вариант, т.к. он не требует затрат на стадии исполнения. Ну сделаете Вы туда jmp (кстати, тут тоже маленький подводный камень есть), исполнится код по этому адресу. А что процессор будет делать дальше? Пойдет исполнять данные? Как я уже говорил, ничего хорошего из этого не выйдет. Это и есть заполнение последних двух байтов первого сектора. Т.е. от конца кода до 509-го байта конечный файл будет содержать нули, а 510-й и 511-й байт будут соответственно 055h и 0AAh, что является признаком загрузочного сектора.
wcools Тут я бы посоветовал на fasm перейти, пока не поздно. Fasm создаёт бинарники по умолчанию. И вообще ИМХО он гораздо проще и удобнее. Если не надумаете, то есть утилитка exe2bin.
По фасму не нашел нужной литературы, поэтому перешол на масм32. PS: Какие изменения в тексте нужно сделать при переходе на фасм? xor ax,ax ;обнуляем ax mov es,ax mov dl,00h mov dh,00h mov ch,00h mov cl,02h mov al,01h mov ah,02h mov bx,7e00h int 13h times (512-2-($-7C00h)) db 0 db 055H,0AAH .......
wcools Предпоследняя строка изменится на такую: db 512-2-($-7C00h) dup 0 Ну и в начале файла стоит для красоты приписать use16. P.S. Насчет литературы: так с фасмом же поставляется pdf-справка. А на русском... я особо не интересовался.
http://www.winasm.net/index.php?ind=downloads&op=entry_view&iden=176 http://www.winasm.net/index.php?ind=downloads&op=entry_view&iden=168
fasm изначально поддерживает times и rb (rw и т.п.), а вот dup появилась позже, так что код должен компилроваться правильно, только вот работать он будет неправильно, потому что аффтар инструкцию перехода так и не добавил. Для чистых бинарников в fasm'е эта директива используется по умолчанию, о чем четко написано в документации. А вообще я бы сделал проще и рациональнее: Code (Text): org 7C00h ... rb 7DFEh-$ ; times 7DFEh-$ db ? db 55h, 0AAh
делал-делал и не работает ;--------BOOT сектор org 7C00h use16 xor ax,ax mov es,ax mov bx,7e00h mov dl,00h mov dh,00h mov ch,00h mov cl,02h mov al,01h mov ah,02h int 13h jmp 7e00h times (512-2-($-7C00h)) db 0 db 055H,0AAH ;--------------------------------- ;---------программа, которая должна распологатся во 2 секторе(изменение курсора) mov ah,1 mov ch,0 mov cl,7 int 10h ;-------------------------------- Где ошибка?? Может 2 программа записывается не во 2 сектор?? PS: Вторую программу записывал в бут сектор (добавляя: org 7e00h use16 ... times (512-2-($-7C00h)) db 0 db 055H,0AAH ) И курсор изменялся.
примеры смотрел? бут-сектор должен содержать параметры диска - BPB boot parameters block. а где он у тебя? такой бут-сектор просто не будет распознан. возьми готовые примеры, попробуй их собрать и запустить, а уже потом начинай экспериментировать. ================= следом за бут-сектором располагаются две таблицы фат, а затем корневой каталог. если писать во второй сектор - фат будет повреждена.
Это какие такие параметры??? Я вот ету программу забисываю в бут сектор и она работает. use16 org 7C00h mov ah,02h mov al,01h mov dh,22 mov dl,30 mov bh,00h int 10h times (512-2-($-7C00h)) db 0 db 055H,0AAH
shoo Кто сказал? BIOS вообще-то безразличен к BPB. Вот последнии два байта он проверяет. http://homepages.tesco.net./~J.deBoynePollard/FGA/bios-parameter-block.html http://en.wikipedia.org/wiki/Booting И вконце концов BIOS Boot Specification в нем про BPB вообще не говориться. wcools Возьми BOCHS и пройдись отладчиком.
Не совсем верно перед таблицей фат идут зарезервированные сектора. И вообще ФАТ и BPB это изобретение Майкрософт. Хорошее или плохое решайте сами. Но от них можно отказаться.
Я также думаю, а меня в заблуждение вводят :| Что делать-то неработает ведь? По умолчаннию через проводник файл в какой сектор записывается???
Phantom_84 Насчет times не знал. Спасибо. Но тем не менее из чисто эстетических соображений dup подходит в данном случае больше. А вот здесь Вы неправы. Или мне ради любителей придраться слова для красоты жирным подчёркнутым шрифтом выделить стоило? И не проще, и не рациональнее. Наглядность как раз в выражении (512-2-($-7C00h)), а не в способности достать калькулятор и высчитать значение выражения. wcools Никак не решу... смеяться или плакать... WinHex используйте. Там настолько всё наглядно, что объяснять, как им пользоваться, прошу прощения, я постыдился.