Будет ли правильной работа функции
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 Килобайт).