Помогите создать загрузочную дискету

Тема в разделе "WASM.BEGINNERS", создана пользователем wcools, 7 сен 2008.

  1. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    Хочу создать загрузочную дискету на 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) и как записать в нулевой сектор дискеты???
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    wcools
    Работать не будет хотя бы потому, что Вы сначала заполняете регистр ax, потом тут же его и обнуляете. Соответственно будет произведена попытка выполнить нулевую функцию 13-го прерывания.
    Заполнять последние два байта первого сектора дискеты разумеется нужно.
    На этот вопрос Вы лучше сами себе ответьте. Всё, что нужно знать, - это то, что исполнение кода начнется прямо с первого байта, записанного Вами. А там уже сами смотрите, что Вы туда поназаписали. Сюда же еще один вопрос, на который Вы должны для себя ответить: а что будет исполнять процессор, когда он выполнит последнюю операцию из того кода, который Вы написали?
    Как записать в нулевой (который на самом деле первый) сектор. Можете для себя сами программку написать (CreateFile в помощь), а можете использовать, например, WinHex.
     
  3. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    ??? Я заполнил не ax , а ah для выполнения 13 прерывания. Во всех примерах, которые я смотрел ах обнулялся, только в первых строках.

    Я не силен в этом (блин, в техникуме этому не учат, проходим дурацкий MFC). Помоему для ехе обязательно нужна ОС, для сом не знаю... Прошу обьяснить принципиальные отличия, чтобы я хотябы мог выбрать: чтоже мне записывать на дискету. И вообще знать это необходимо, когда-нибудь да пригодится.

    В оперативке будет лежать считанная программа (с этим я думаю спралюсь) затем я сделаю jmp на 7e00h.
     
  4. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    Еще вопрос:
    в примере я увидел
    times (512-2-($-7C00h)) db 0
    db 055H,0AAH
    Что это значит???
     
  5. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    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 признок конца бут сектора.
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    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, что является признаком загрузочного сектора.
     
  7. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    Большое спасибо, теперь все гораздо понятнее.
    Остался еще вопрос:
    Как в Masm32 сделать bin файл?
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    wcools
    Тут я бы посоветовал на fasm перейти, пока не поздно. :) Fasm создаёт бинарники по умолчанию. И вообще ИМХО он гораздо проще и удобнее. Если не надумаете, то есть утилитка exe2bin.
     
  9. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    По фасму не нашел нужной литературы, поэтому перешол на масм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
    .......
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    wcools
    Предпоследняя строка изменится на такую:
    db 512-2-($-7C00h) dup 0
    Ну и в начале файла стоит для красоты приписать use16.
    P.S. Насчет литературы: так с фасмом же поставляется pdf-справка. А на русском... я особо не интересовался.
     
  11. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    А можно еще как пользоваться WinHex.
    F1 мне не поможет т.к. по английски читать не умею.
     
  12. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    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
     
  13. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    fasm изначально поддерживает times и rb (rw и т.п.), а вот dup появилась позже, так что код должен компилроваться правильно, только вот работать он будет неправильно, потому что аффтар инструкцию перехода так и не добавил.
    Для чистых бинарников в fasm'е эта директива используется по умолчанию, о чем четко написано в документации.

    А вообще я бы сделал проще и рациональнее:

    Код (Text):
    1. org 7C00h
    2. ...
    3. rb 7DFEh-$ ; times 7DFEh-$ db ?
    4. db 55h, 0AAh
     
  14. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    делал-делал и не работает :dntknw:

    ;--------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 )
    И курсор изменялся.
     
  15. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    примеры смотрел? бут-сектор должен содержать параметры диска - BPB boot parameters block. а где он у тебя? такой бут-сектор просто не будет распознан. возьми готовые примеры, попробуй их собрать и запустить, а уже потом начинай экспериментировать.
    =================
    следом за бут-сектором располагаются две таблицы фат, а затем корневой каталог. если писать во второй сектор - фат будет повреждена.
     
  16. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    Это какие такие параметры???

    Я вот ету программу забисываю в бут сектор и она работает.
    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
     
  17. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    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 и пройдись отладчиком.
     
  18. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Не совсем верно перед таблицей фат идут зарезервированные сектора. И вообще ФАТ и BPB это изобретение Майкрософт. Хорошее или плохое решайте сами. Но от них можно отказаться.
     
  19. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    Я также думаю, а меня в заблуждение вводят :|

    Что делать-то неработает ведь? По умолчаннию через проводник файл в какой сектор записывается???
     
  20. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Phantom_84
    Насчет times не знал. Спасибо. Но тем не менее из чисто эстетических соображений dup подходит в данном случае больше.
    А вот здесь Вы неправы. Или мне ради любителей придраться слова для красоты жирным подчёркнутым шрифтом выделить стоило?
    И не проще, и не рациональнее. Наглядность как раз в выражении (512-2-($-7C00h)), а не в способности достать калькулятор и высчитать значение выражения.
    wcools
    Никак не решу... смеяться или плакать... WinHex используйте. Там настолько всё наглядно, что объяснять, как им пользоваться, прошу прощения, я постыдился.