Будет ли правильной работа функции

    mov ax, 16              ;start read at sector
    mov dh, 01h             ;Number of sectors to read
    mov bx, buffer 
    mov [edd_segment], ds
 
    call read_sectors
 
;---------------------------

;SUBROUTINES SECTION
    
read_sectors:
    pusha
    mov [edd_lba], ax       ;start sector 16
    ;shr    bx, 04h         ; Convert buffer addr to seg:0 */
    mov [edd_offset], bx    ;buffer address where to read

;label1:
    mov [edd_nsecs], dh         ;# sectors for read 1
    cmp dh, 32          ;сравниваем число нужных для чтения секторов и 32
    jle label2
    mov word [edd_nsecs], 32    ;т.е. читаем не больше 32 секторов

label2:
    mov dl, [boot_drive]        ;здесь устройство с которого загружаем CD ROM

    mov si, edd_packet          ;в si попадает первый адрес пакета
    mov ah, 042h                ;function 13h read CD ROM
    push dx                     ;bios shouldn't kill dh, but ...
    ;stc
    int 13h

    pop dx                      ;... better safe than sorry!
    jc  read_fail

    ;add    word [edd_segment], 0x1000  ;Advance segment addr by 64k bytes = 32 * 2048
    ;add dword [edd_lba], 32        ;And sector number to match - Add to start read sector
    ;sub    dh, [edd_nsecs]             ;Number of sectors remaining
    ;jnz    label1          

    popa
    ret

read_fail:
    mov si, error_msg   ; Put string position into SI
    call print_string   ; Call our string-printing routine
    ret

Код писал не я, изучаю его. Есть функция на ассемблере, читает сектора CD ROM, я закоментировал некоторые строки этой функции, код работает без ошибок, но я хотел спросить- будет ли это правильно с точки зрения алгоритма если убрать из кода насовсем эти закоментированные строки.

Почему здесь:

    ;add    word [edd_segment], 0x1000  ;Advance segment addr by 64k bytes = 32 * 2048
    ;add dword [edd_lba], 32        ;And sector number to match - Add to start read sector
    ;sub    dh, [edd_nsecs]             ;Number of sectors remaining
    ;jnz    label1          

От dh отнимается количество секторов и проверка и переход на label1? В dh и так понятно перед вызовом функции количество нужных секторов для чтения. Или после вызова int 13h чтения [edd_nsecs] содержит количество фактически прочитанных секторов? Добавлю что это код boot сектора ОС, в 16 битном режиме может прочитаться не больше 32 секторов или 65536 байт (64 Килобайт).


Ответы (0 шт):