пытаюсь прочитать сектор (любой) через биос-прерывания и вывести на экран, но выводится какая-то белеберда. что не так с кодом? 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
На первый взгляд - код рабочий. "Белиберда" выводится из за того что ты печатаеш asci код символа. Если случайно попадёш на сектор с текстом - увидеш его на экране. А так, переводи его в нужную кодировку. P.S. Много ещё зависит от загруженого знакогенератора. Этим я хочу сказать, что Русский шрифт так просто не увидиш.
я хотел увидеть считанную инфу. (а затем хотя бы сравнить с помощью diskedit) а получается так что какой бы сектор я ни читал, выводится одно и то же. и даже если не вставлять дискету во флопарь и запустить прогу, то выводится то же самое
MirrorBlack, "Если случайно попадёш на сектор с текстом - увидеш его на экране". вот как раз это и хочется в лучшем случае увидеть. у меня уже был рабочий код, который как раз и выводил текст, но он куда-то потерялся, пришлось заново, и тут такая засада(
В dos есть класная штука - debug. Если ошибок компилятора нет, попробуй int 13h ah=8 dl=номер дисковода. В результате bl должен содержать число от 1 до 4.
Первыми командами сделай: push ds pop es То что стоит assume es:codesg для com файла ничего не значит.
Для *.COM все сегментные регистры и так настроены на один и тот же сегмент. Настраиваются загрузчиком при запуске приложения.
cppasm Ежели грузится под DOS то нет. Корни идут от поколения 8086 где небыло ни ES ни FS. Не исключено что я ошибаюсь, и в более поздних версиях DOS эти регистры инициализируются. Думаю чем спорить - дождёмся ответа автора.
Чтоб реабилитироваться после позорного ES предлагаю попробовать следующее: http://www.codenet.ru/progr/dos/int_0027.php Под windows к жёсткому диску не обратиться, зато к флопарю - на ура.
Great помню смотрел давным-давно игрушку досовскую еще там сегмент данных начинался так db "Welcome ty my data segment, boy! BTW Barbara Goldstein is very nasty woman, with birthday on april,12 - coming soon!" дальше шли рабочие структуры ...
именно. и его то как раз я и получаю. все работает,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 ??
Линукс, виндоус, али что ещё - для bios разницы нет. Нумерация в bios: A B C D и т.д. Если в системе 2 фопаря - DL=1, иначе DL = 2.
В биосе нет такой намирации. Это нумирация майкософт. А в биосе 0, 1.. флопи 80, 81 ... жесткии диски.
пытаюсь читать сектор с винта - ничего не получается. причем читаю при старте компа, когда операционка еще не загружена. вроде не должно быть никаких запретов на чтение . или они все таки есть?
Pavia Запамятовал, спасибо. dps86 Попробуй int 13h с AH = 41h (Проверка наличия доп функций) и AH = 42h (расширенное чтение) Основная фишка в этом методе - Пакет дискового адреса (Disk Address Packet) Также не помешает AH = 48h (получить параметры дисковода) Если в инете не найдёш инфы - переборю лень и напишу сам P.S. Есть ещё фишка с AH = 45h (блокировка диска, и не только сменного)