int 0x13; ah 0x02 - Читать floppy

Тема в разделе "WASM.BEGINNERS", создана пользователем ENRIX, 9 июл 2007.

  1. ENRIX

    ENRIX New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2007
    Сообщения:
    10
    Помогите найти ошибку. пишу под RealMode для загрузки второго загрузчика и ядра с дискеты

    выше упомянутым(в теме) прерывание с функцией 02h пытаюсь вычитать диск но у меня не получается

    вот функция которая должна читать цилиндр

    Код (Text):
    1. rcyl:
    2. pusha
    3. mov si,rcyl_str
    4. call puts
    5. mov ah,ch
    6. call putx
    7. mov si,rcylto_str
    8. call puts
    9. mov si,prefix
    10. call puts
    11. mov ax,es
    12. call putx
    13. xchg ah,al
    14. call putx
    15. mov si,ddprefix
    16. call puts
    17. mov ax,bx
    18. call putx
    19. xchg ah,al
    20. call putx
    21.  
    22. mov cl,0x01
    23. xor bx,bx
    24. xor dx,dx
    25. mov ax,0x0212
    26. int 0x13
    27.  
    28. cmp ah,0x0
    29. je .ok_rcyl
    30. mov si,err_rcyl
    31. call puts
    32. call putx
    33.  
    34. .ok_rcyl:
    35. newStr
    36. popa
    37. ret
    а это я её использую

    Код (Text):
    1. push 0x0050
    2. pop es
    3. xor bx,bx
    4. xor ch,ch
    5.  
    6. .rcyls:
    7. call rcyl
    8. inc ch
    9. cmp ch,CTR
    10. je .ok_rcyls
    11.  
    12. add bx,0x2400
    13. jmp .rcyls
    14.  
    15. .ok_rcyls:
    16. mov si,ok_str
    17. call puts
    18.  
    19. jmp far 0x0070:0x0000
    Почему то прыгает оно на какой-то мусор.... в чем же дело? проверяю в VMware
     
  2. rudik

    rudik Руденко Артём

    Публикаций:
    0
    Регистрация:
    6 дек 2006
    Сообщения:
    302
    Адрес:
    г. Харьков
    Чесное слово розбиратся в твоем исходнике в лень, поетому можеш взять мой. Отлажен он на 100%. Это процедура чтения сектора. Принимаемые значения:
    АХ = сектор, который нужно загрузить(в твоём случае №1)
    ES = сегмент куда нада грузить (наприм 0х0050)
    BX = смещение (тебе вроде 0 нада)
    Просто поставь в цыкл, если тебе нада загрузить 18 секторов.
    Код (Text):
    1. BOOT_SECTOR_LOAD_SECTOR_DATA:
    2.    
    3.     push ax
    4.     push dx
    5.     push cx
    6.     push bx
    7.    
    8.     mov bl,18
    9.     div bl
    10.     mov cl,ah
    11.     inc cl
    12.     xor ah, ah
    13.     mov bl,2
    14.     div bl
    15.     mov ch,al
    16.     mov dh,ah
    17.     mov dl,0
    18.    
    19.     pop bx
    20.     pop ax
    21.     push ax
    22.     push bx
    23.    
    24.     mov ah,0x02
    25.     int 0x13
    26.     jc BOOT_SECTOR_ERROR_READING
    27.    
    28.     pop bx
    29.     pop cx
    30.     pop dx
    31.     pop ax
    32.    
    33.     ret
     
  3. programmist

    programmist New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2007
    Сообщения:
    29
    Так ты грузишь сектора по адресу 50:0 а прыганшь на 70:0
    И кстати читаешь начиная с первого сектора, а это бут. Надо mov cl, 2
     
  4. programmist

    programmist New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2007
    Сообщения:
    29
    Кстати, у меня вот такой вопрос. Как мне обращаться к дискам после перехода в защищенный режим? Ведь использовть int 13h уже не получиться, даже если для него создать дескриптор в таблице IDT, так как код обработчика 16-битный и должен работать в реальном режиме. Как быть то тогда? Писать свой низкоуровневый драйвер, в котором напрямую обращаться к регистрам контроллеров???
     
  5. rudik

    rudik Руденко Артём

    Публикаций:
    0
    Регистрация:
    6 дек 2006
    Сообщения:
    302
    Адрес:
    г. Харьков
    Да, это единственный способ. Тут уже биос нам не поможет...
     
  6. programmist

    programmist New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2007
    Сообщения:
    29
    rudik
    Ясно, так и думал :) А вот допустим int 10h для работы с Весой, как его юзает Менует?
     
  7. ENRIX

    ENRIX New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2007
    Сообщения:
    10
    programmist
    Так я поэтому и прыгаю на 700h(нач. с 500h копи бут)
    а вообще мне пофиг что я засорю немного кода(200h байт) этим бутом... зато rcyl красиво

    щас вроде все ок.

    а вот в fasm

    jmp 0x0000:0x0700
    отличается чем-то от
    jmp far 0x0000:0x0700

    если да то чем... поподробнее(вопрос по этой теме хотя щас почему то VMware одинаково реагирует и на то и на то)
     
  8. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Устанавливает видео режим. Переходит в защищенный режим. И больше не трогает int 10h.
    Детально можно глянуть в исходных кодах.
     
  9. programmist

    programmist New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2007
    Сообщения:
    29
    Pavia
    Спасибо.

    ENRIX
    Когда в команде указывается и сегмент и смещение, то тогда само собой подразумевается что это будет далекий прыжок.
     
  10. rudik

    rudik Руденко Артём

    Публикаций:
    0
    Регистрация:
    6 дек 2006
    Сообщения:
    302
    Адрес:
    г. Харьков
    Нет, не отличается.
     
  11. ENRIX

    ENRIX New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2007
    Сообщения:
    10
    programmist
    rudik

    Ага понятно... я так и думал.. просто меня удивило что как-то когда менял оно вело себя по разному...интересно почему... но уже не важно