Загрузчик в mbr, real mode

Тема в разделе "WASM.BEGINNERS", создана пользователем deathwisher, 24 ноя 2006.

  1. deathwisher

    deathwisher New Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    36
    Разбираюсь с алгоритмом работы загрузчика, экспериментирую с флоппи-дисководом, непонятны некоторые вещи.
    Во первых - не работает чтение с FDD в реальном режиме, пытаюсь записать код из 1-го сектора:
    mov ah, 0x2
    mov al, 1

    mov dl, 0
    mov dh, 0 ; head

    mov ch, 0
    mov cl, 1

    mov ax, cs
    mov es, ax
    mov bx, 0x7e00

    int 13h

    по адресу 0x7e00 ничего не записалось, т.е. прерывание не работает! в чем может быть дело

    Во-вторых - непонятно, почему при запуске первичного загрузчика он переписывает себя на другой адрес, а потом стартует уже из него. Для чего это нужно?
    Помогите разобраться!
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    1. Неплохо бы проверить, что CF поле int 0x13 сброшен. Если нет -- в ah должен быть код ошибки. Кстати, а в чем выражается, что чтение не происходит? И что содержит cs на момент выполнения кода?

    2. Это нужно чтобы загрузить загрузчик файловой системы -- он тоже должен быть считан по адресу 0x7C00.
     
  3. deathwisher

    deathwisher New Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    36
    Проверяю cf, и JC на сообщение об ошибке, вот только ошибки не происходит. CS содержит 0. После выполнение int 13h в указанной области памяти считанный сектор не появляется.
    А в ah должен быть код ошибки даже если cf сброшен?

    А почему он должен быть только по этому адресу?
    Слышал, что int 13h позволяет считывать данные только в первые 64r - это так?
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Странно, код, вроде бы, верный. А можно его целиком увидеть?
    ah в этом случае устанавливается в 0 -- success.
    Так же как и с MBR -- необходимо было договориться. Договорились на 0x7C00 :).
    В смысле? В первые 64К? Думаю, что это не так, т.к. NTLDR, например, загружается по адресу 0x2000:0x0. Другое дело, что ah = 0x2, ah = 0x42 не могут за раз прочитать более 64К. Но никто не запрещает сменить сегментные регистры и читать дальше.
     
  5. deathwisher

    deathwisher New Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    36
    Вот код полностью, тестирую его под Bochs.
    Пытаюсь считать загрузочный сектор, записать его по адресу 0x7e00, и для проверки смотрю символ - он не отображается, в отличии от 7C00, не могу понять в чем дело.

    [bits 16]
    [ORG 0x7C00]


    mov ah, 0x2 ; read
    mov al, 1

    mov dl, 0
    mov dh, 0 ; head

    mov ch, 0 ; cylinder
    mov cl, 1 ; sector

    mov ax, cs
    mov es, ax
    mov bx, 0x7e00

    int 13h

    jc error_

    mov ah, 0x0E
    mov al, [0x7e00]
    int 10h

    mov ah, 0x0E
    mov al, 'O'
    int 10h
    mov ah, 0x0E
    mov al, 'k'
    int 10h


    jmp 0x0000:0x7e00


    error_

    mov ah, 0x0E
    mov al, 'E'
    int 10h
    mov ah, 0x0E
    mov al, 'r'
    int 10h
    mov ah, 0x0E
    mov al, 'r'
    int 10h

    jmp $

    times 510-($-$$) db 0
    db 0xAA, 0x55
     
  6. deathwisher

    deathwisher New Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    36
    Я решил проблему.
    Ошибка, как это часто бывает при программировании на ассембере, из-за невнимательности:

    mov ah, 0x2
    mov al, 1

    mov dl, 0
    mov dh, 0 ; head

    mov ch, 0
    mov cl, 1

    // ax затирается
    mov ax, cs
    mov es, ax
    mov bx, 0x7e00

    int 13h

    обидно что пару часов с ней возился.
    Спасибо за помощь!