Помогите с загрузочным сектором

Тема в разделе "WASM.ASSEMBLER", создана пользователем Loginanton, 17 июн 2008.

  1. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    А я тоже WinHex'ом вставляю .bin в образ диска. Братья по разуму...

    Что-то стрёмно!
    Так работает, но я ж ему явно говорю, что следующий код 32-х разрядный! Почему надо ещё префиксы какие-то писать???
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Meatcoins
    Я не про это. Я режу винхексом скомпилённую тасмом прогу, так как не знаю как сразу им собрать mbr. Или для тасма это нереально? А вставляю в сектор совсем другим способом (DiskEditor-ом на вмваре).
     
  3. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Meatcoins
    потому что ни перфикс ни use32 не нужны. И код у тебя 16битный. И дебугер тебе подсовывает код для 16 бит.
     
  4. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    Ну, не знаю... в TASM просто может не быть таких средств, которые бы позволяли так легко это сделать.
    А нафига резать?
    Напиши небольшую прогу под Win32, если у тебя Windows, конечно. Которая бы резала твой файл. В этой проге будет пара команд, которые работаю с файлами: CreateFile, ReadFile, WriteFile и CloseHandle - всё!
    Ну, а запускать её можно вместе с компилятором - bat'ником, например.
    А мне изначально показалось, что VMware не лучший способ для отладки подобных вещёй - лучше всего Bochs! Это отладчик ОС! Позволяет отлаживать по шагам, ну почти как Olly!
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Meatcoins
    в смысле db 0FFh,0D7h? без 66h? так это и есть call edi в 32 разрядном сегменте ;)
    А вообще-то насколько я понимаю сам код bios не может просто так заработать в защищённом режиме даже если ты сможешь сделать call - нужно либо возвращаться в реал, либо v86, либо, например в vesa есть специальная точка входа для использования vesa bios в защищённом режиме, которая есно не совпадает с адресом из вектора для реального режима.
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Meatcoins
    Спасибо, может быть так и сделаю.

    Да конечно, но я ничего особо сложного не пишу, чтобы был необходим отладчик. А варя всё-таки побыстрее.
     
  7. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Y_Mur
    Он в 16 битном режиме. У Фроловых есть пример вызова прерываний из 16 битного защищенного режима. Теоретически таой код может работать.
     
  8. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    Так что получается от сегмента зависит?
    То есть если я в 32 -х разрядном сегмете с 4Гб лимитами (дескриптор: db 0FFh,0FFh,0h,0h,0h,10011010b,0CFh,0h), то 0FFh,0D7h будет call edi, а если я в 16-ти разрядном сегменте (дескриптор: db 0FFh,0FFh,0h,0h,0h,10011010b,08Fh,0h), то 0FFh,0D7h будет call di???
    И что use32 и use16 никак не влияют что ли?
    А я тут как раз трассирую BIOS:
    Взял простенькую очистку экрана:
    mov ax,3h
    int 10h
    А для PM пишу так:
    Код (Text):
    1. macro PM_int10
    2. {
    3. push esi
    4. push edi
    5. xor esi,esi
    6. xor edi,edi
    7. mov si,[10h*4]
    8. mov di,[10h*4+2h]
    9. db 66h
    10. shl edi,4h
    11. db 66h
    12. add edi,esi
    13. db 66h
    14. call edi
    15. pop edi
    16. pop esi
    17. }
    18. ...
    19. ...
    20. mov  ax,3
    21. PM_int10
    Трассируется в RM так:
    Код (Text):
    1. [0x0c012c]pushf
    2. [0x0c012d]cmp ah,0Fh
    3. [0x0c0130]jnz .+0x0006
    4. [0x0c0138]cmp ah,1Ah
    Трассируется в PM так:
    Код (Text):
    1. [0x0c012c]pushf
    2. [0x0c012d]cmp ah,0Fh
    3. [0x0c0130]jnz .+0x0006
    4. [0x000138]push bx
    То есть, в PM почему-то я попадаю после jnz не туда, куда нужно - не в [0x0c0138], а [0x000138]!!!
    Странно!
    Может быть это из-за дескриптора кода?
    Может быть ему базу сменить на 0x0c0000 надо?
    Хотя по идее не должно от этого быть, ведь jnz - это относительный прыжок!
    Как это он прыгает так на несколько сотен кбайт???
     
  9. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Да.
    Влияют. Мы указываем компилятору код для какого дескриптора сгенерировать для 32 или 16.

    Зачем так извращаться? Это анологично shl di,4 Права код у тебя не правельный.Тут db 66h вовсе ненужны.
    И вызываешь ты неправельно. Нельзя делать call edi нужно call es:di причем в базе es должен быть сегмент, а в di смещение.
     
  10. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Элементарно в 16коде идет обрезка на 16бит по ip, а в cs у тебя база 0000. А должно быть не ноль. Поэтому и вызывать надо как call es:di причем в базе es должен быть сегмент, а в di смещение.
     
  11. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    Какой ещё сегмент? Я же в PM! Селектор! И почему в es, а не в cs?
    Мне кажется надо так сделать:
    Если идёт обрезка по 16 бит,то тогда мне надо сделать дескриптор с базой 0x0c0000 16-ти разрядного сегмента и сделать, например, так:
    call 20h:di
    20h - это селектор на дескриптор с базой 0x0c0000.
    А в di - адрес функции BIOS.
    Ну, как правильно?
    Пока вот такая идея у меня...
    Ладно, завтра попробую...

    Надо над этим подумать...
     
  12. Argogo

    Argogo New Member

    Публикаций:
    0
    Регистрация:
    15 сен 2008
    Сообщения:
    5
    Адрес:
    Республика Крым
    Я компилил + линковал как экзешник, в начале исходника которого стояло "ORG 7c00h".
    Затем "отрезал" хвост с кодом при помощи "один раз написаной программы".
    Поскольку длина заголовка всегда получается одной и той-же, если не использовать команды вроде "mov ax, @data", то и компиляция, и линковка, и "обрезание" замечательно автоматизируются при помощи .BAT-файла.
     
  13. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    есть exe2bin и еще какая-то утилита - посмотри исходники SolOS (Богдан Онтану) - она на тасме написана
     
  14. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Можно использовать fasm. Он по умолчанию генерирует чистые бинарники.

    Код (Text):
    1. org 7C00h
    2. ...
    3. rb 7DFEh-$
    4. dw 0AA55h
     
  15. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Это понятно, только вопрос был про то, может ли тасм сразу генерить чистый бинарник. Ну нет так нет.
     
  16. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    Booster
    С какой стати ТАСМ не может ? Тут все зависит от тебя - как код напишешь. Пиши вначале ORG 100h, компилируй как COM-модуль, но в тексте, где есть обращение к ОЗУ, надо учитывать адрес загрузки твоего бинарника. Так понятно или пример привести ?
     
  17. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Чего это нет?

    Код (Text):
    1. _code segment para public 'code' use16
    2.       assume cs:_code,ds:_code
    3.       org 7C00h
    4. start:
    5.       mov ax,offset start
    6.       ret
    7. _code ends
    8.       end start
    tasm /m /ml test.asm
    tlink /t test.obj, test.bin

    И посмотри в дизассемблере что будет в AX заноситься.
    Отлично tasm собирает чистые бинарники, и ничего не надо контролировать при обращении к данным.
     
  18. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    cppasm
    Спасибо, тупанул малость.
     
  19. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    Мда!
    Пока не получается!
    Создал новый дескриптор с базой 0C0000h. Его селектор 20h.
    Делаю call 20h:12Ch - это адрес 10h прерывания BIOS.
    Работает вот так:
    Код (Text):
    1. [0x0c012c]pushf
    2. [0x0c012d]cmp ah,0Fh
    3. [0x0c0130]jnz .+0x0006
    4. [0x0c0138]cmp ah,1Ah
    5. [0x0c013b]jnz .+0x0006
    6. [0x0c0143]cmp ah,0x0b
    Но как только доходит до этого места:
    Код (Text):
    1. mov bx,0xc000
    2. mov ds,bx
    То всё РУХАЕТ!
    Это всё понятно! В сегментный регистр код BIOS'а пытается загрузить несуществующий селектор!
    Что с этим можно сделать???
    Я не очень понимаю что делать вообще в защищённом режиме!
    Как выводить на экран пиксели?
    Как задавать видеорежим?
    Как читать с жёсткого диска сектора?
    Ведь всё это делает BIOS! А как вызвать функции BIOS из защищённого режима, не переключаясь в реальный?
    Можно ли как-то обойти эту проблему?
    |
    |
    |
    \/
    Код (Text):
    1. mov bx,0xc000
    2. mov ds,bx
     
  20. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    Полазил по Internet и пока сделал такой вывод:
    Видимо, просто так нельзя выполнить 16-ти разрядный код, в частности код BIOS'а в защищённом режиме!
    Если это надо, то следует использовать режим виртуального V86, но ему требуется монитор режима (VMM) — модуль, который выполняется с CPL = 0 и обрабатывает прерывания, исключения и обращения к портам ввода-вывода из задачи V86, выполняя фактически эмуляцию всего компьютера! Сложнова-то!
    Есть ещё DPMI, но доступен ли он, когда нет ничего (никаких ОС), когда пишешь свой загрузчик и грузишь свой код? Пока не знаю. И стоит ли его вообще применять?
    Мне кажется, что если очень сильно нужен BIOS, то проще переключиться в нереальный режим, чем что-то ваять в защищённом.
    Если нужна графика в PM, то надо использовать VESA - самому всё писать.
    http://www.theworld.com/obi/Standards/VGA/vesa.txt
    Но похоже, что его функции реализуются через прерывания! Тогда опять непонятно - а как это всё реализовать в защищённом режиме?
    И опять-таки если недоступен BIOS в PM, то вопрос - а как осуществить доступ к жёсткому диску?
    Дилема в том, что я знаю как читать с диска и выводить на экран в RM, но я делаю это с помощью BIOS'а, а так как я не знаю как использовать BIOS в PM, то соответственно я и не знаю как читать с диска и выводить на экран в PM! Вот у меня и возникает вопрос - а нафига тогда нужен PM? В PM можно реализовать нормально многозадачность, страничную организацию памяти и т.д. и т.п. Но в PM не удаётся реализовать базовое - чтение с диска и вывод на экран.
    Я пока в тупике. Не знаю что делать дальше. Даже о чём думать не знаю.