чтение сектора

Тема в разделе "WASM.ASSEMBLER", создана пользователем dps86, 19 мар 2009.

  1. dps86

    dps86 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    28
    пытаюсь прочитать сектор (любой) через биос-прерывания и вывести на экран, но выводится какая-то белеберда.
    что не так с кодом?

    TITLE BIOREAD (COM)
    CODESG SEGMENT PARA 'Code'
    ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
    ORG 100H
    BEGIN: JMP MAIN
    ; ---------------------------------------------------------
    RECDIN DB 512 DUP(' ') ;область ввода
    CURADR DW 0101H ;начало (дорожка/сектор)
    SIDE DB 00
    ; ---------------------------------------------------------
    MAIN PROC NEAR

    CALL F10READ ;получить дисковую запись
    CALL G10DISP ;вывести сектор на экран

    mov ah,8
    int 21h ;задержка
    RET
    MAIN ENDP




    ; чтение дискового сектора
    ; ------------------------
    F10READ PROC NEAR
    MOV AL,01 ;число секторов
    MOV AH,02 ;ф-ция чтения
    LEA BX,RECDIN ;адрес буфера
    MOV CX,CURADR ;дорожка/сектор
    MOV DH,SIDE ;сторона (для диска А)
    MOV DL,00h ;дисковод А
    INT 13H
    RET
    F10READ ENDP


    ; вывод сектора на экран
    ; ----------------------
    G10DISP PROC NEAR
    MOV AX,1301H ;вывод строки символов(функция 13h подф-ция 1)
    MOV BH,00H ;начало вывода
    MOV BL,0AH ;атрибут знака
    MOV CX,512 ;длина
    MOV DX,00H
    LEA BP,RECDIN ;адрес буфера
    INT 10H
    RET
    G10DISP ENDP


    CODESG ENDS
    END BEGIN
     
  2. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    А что ты хотел увидеть? Greetings from disk sector fly out to dps86?
     
  3. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Товарищ cppasm прав. Можно по-потробнее об этом. Что хотел увидеть и что увидел?
     
  4. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    На первый взгляд - код рабочий.
    "Белиберда" выводится из за того что ты печатаеш asci код символа. Если случайно попадёш на сектор с текстом - увидеш его на экране. А так, переводи его в нужную кодировку.
    P.S.
    Много ещё зависит от загруженого знакогенератора. Этим я хочу сказать, что Русский шрифт так просто не увидиш.
     
  5. dps86

    dps86 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    28
    я хотел увидеть считанную инфу. (а затем хотя бы сравнить с помощью diskedit)
    а получается так что какой бы сектор я ни читал, выводится одно и то же. и даже если не вставлять дискету во флопарь и запустить прогу, то выводится то же самое
     
  6. dps86

    dps86 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    28
    MirrorBlack, "Если случайно попадёш на сектор с текстом - увидеш его на экране".
    вот как раз это и хочется в лучшем случае увидеть. у меня уже был рабочий код, который как раз и выводил текст, но он куда-то потерялся, пришлось заново, и тут такая засада(
     
  7. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    В dos есть класная штука - debug.
    Если ошибок компилятора нет, попробуй int 13h ah=8 dl=номер дисковода. В результате bl должен содержать число от 1 до 4.
     
  8. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Первыми командами сделай:
    push ds
    pop es
    То что стоит assume es:codesg для com файла ничего не значит.
     
  9. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Для *.COM все сегментные регистры и так настроены на один и тот же сегмент.
    Настраиваются загрузчиком при запуске приложения.
     
  10. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    cppasm
    Ежели грузится под DOS то нет.
    Корни идут от поколения 8086 где небыло ни ES ни FS. Не исключено что я ошибаюсь, и в более поздних версиях DOS эти регистры инициализируются.
    Думаю чем спорить - дождёмся ответа автора.
     
  11. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    MirrorBlack
    15 лет с ассемблером и путать es с GS?
     
  12. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Pavia
    Виноват, зарапортовался :)
    Был не прав, бью себя ушами по щекам.
     
  13. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Чтоб реабилитироваться после позорного ES предлагаю попробовать следующее:
    http://www.codenet.ru/progr/dos/int_0027.php
    Под windows к жёсткому диску не обратиться, зато к флопарю - на ура.
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А ты ожидал аски текст в начале сектора?
     
  15. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    Great
    помню смотрел давным-давно игрушку досовскую еще
    там сегмент данных начинался так
    db "Welcome ty my data segment, boy! BTW Barbara Goldstein is very nasty woman, with birthday on april,12 - coming soon!"
    дальше шли рабочие структуры ...
     
  16. dps86

    dps86 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    28
    именно. и его то как раз я и получаю. все работает,MirrorBlack сенкс.

    возник другой вопрос. при чтении сектора надо указывать устройство, с которго читаешь, диск А,В,С и тд.. это в винде.
    как сделать это в линуксе. я запускаю fdisk
    и вижу следующее
    dev/sda1
    dev/sda2
    dev/sda3

    ***********************************************
    MOV AL,01 ;число секторов
    MOV AH,02 ;ф-ция чтения
    LEA BX,RECDIN ;адрес буфера
    MOV CX,CURADR ;дорожка/сектор
    MOV DH,SIDE ;сторона (для диска А)
    MOV DL,00h ;дисковод А
    INT 13H
    RET
    *****************************************
    надо прочитать с dev/sda2. так что писать в DL ??
     
  17. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Линукс, виндоус, али что ещё - для bios разницы нет. Нумерация в bios:
    A B C D и т.д.
    Если в системе 2 фопаря - DL=1, иначе DL = 2.
     
  18. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    В биосе нет такой намирации. Это нумирация майкософт.
    А в биосе 0, 1.. флопи 80, 81 ... жесткии диски.
     
  19. dps86

    dps86 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    28
    пытаюсь читать сектор с винта - ничего не получается. причем читаю при старте компа, когда операционка еще не загружена. вроде не должно быть никаких запретов на чтение . или они все таки есть?
     
  20. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Pavia
    Запамятовал, спасибо.
    dps86
    Попробуй int 13h с AH = 41h (Проверка наличия доп функций) и AH = 42h (расширенное чтение)
    Основная фишка в этом методе - Пакет дискового адреса (Disk Address Packet)
    Также не помешает AH = 48h (получить параметры дисковода)
    Если в инете не найдёш инфы - переборю лень и напишу сам :derisive:

    P.S.
    Есть ещё фишка с AH = 45h (блокировка диска, и не только сменного)