Приведите пример применения команды для BIOS INT, выполняющей чтение одного сектора - Assembler

Узнай цену своей работы

Формулировка задачи:

Добрый день! Помогите, пожалуйста, с задачей в tasm.. Напишите команды для BIOS INT 13H, выполняющие чтение одного сектора, в области памяти INDISK с диска A, головки 0, дорожка 6, сектора 3
товарищи, кто в силах.. очень прошу помочь

Решение задачи: «Приведите пример применения команды для BIOS INT, выполняющей чтение одного сектора»

textual
Листинг программы
.model tiny
.code
.startup
 
Drive       =   0       ; диск A:
Head        =   0
Track       =   6
Sec     =   3
Attempts    =   3       ; кол-во попыток чтения
 
                mov cx,Attempts
    TryAgain:
                push    cx
        mov ah,2        ; ah = 2 (функция)
        mov al,1        ; al = 1 (кол-во секторов для чтения)
        mov ch,Track and 0FFh   ; ch = младшие 8 бит дорожки
        mov cl,Sec or ((Track shr 2) and 0C0h)  ; cl = номер сектора + биты 8 и 9 номера дорожки в старших 2-х битах (6 и 7) cl
        mov dh,Head     ; dh = головка
        mov dl,Drive    ; dl = диск
        lea bx,Buffer   ; es:bx = адрес буфера
        int 13h     ; читаем!
        pop cx
        jnc Ok
        xor ah,ah
        int 13h     ; делаем сброс
        loop    TryAgain
    Error:
        ; ошибка чтения, попытки исчерпаны
    Ok:
        ; всё хорошо, результат в es:bx
        int 20h     ; выход
 
Buffer      db  512 dup (?)
 
end

Объяснение кода листинга программы

Этот код на языке Assembler использует функцию BIOS INT 13h для чтения одного сектора с жёсткого диска на адрес буфера. Если чтение не удалось, происходит сброс и попытка повторяется. Если сектор успешно прочитан, результат сохраняется в буфере и процесс завершается. Номер сектора, с которого начинается чтение, указан в переменной Sec, а номер дорожки — в переменной Track. Головка диска — в переменной Head, а диск, с которого начинается чтение, — в переменной Drive. Список переменных и их значений:

  1. Drive = 0
  2. Head = 0
  3. Track = 6
  4. Sec = 3
  5. Attempts = 3
  6. cx (счётчик попыток чтения)
  7. ah (регистр функции) = 2
  8. al (регистр количества секторов для чтения) = 1
  9. ch (регистр, содержащий номер дорожки)
  10. cl (регистр, содержащий номер сектора)
  11. dh (регистр, содержащий головку диска)
  12. dl (регистр, содержащий номер диска)
  13. bx (регистр, содержащий адрес буфера)
  14. Buffer (буфер для данных)
  15. Error (ошибка чтения, попытки исчерпаны)
  16. Ok (всё хорошо, результат в es:bx)
  17. int 13h (чтение сектора с жёсткого диска)
  18. int 20h (выход)
  19. Loop (цикл повторения попыток чтения)
  20. TryAgain (метка для повторной попытки чтения)

Оцени полезность:

12   голосов , оценка 4.333 из 5