Помогите найти ошибку. пишу под RealMode для загрузки второго загрузчика и ядра с дискеты выше упомянутым(в теме) прерывание с функцией 02h пытаюсь вычитать диск но у меня не получается вот функция которая должна читать цилиндр Код (Text): rcyl: pusha mov si,rcyl_str call puts mov ah,ch call putx mov si,rcylto_str call puts mov si,prefix call puts mov ax,es call putx xchg ah,al call putx mov si,ddprefix call puts mov ax,bx call putx xchg ah,al call putx mov cl,0x01 xor bx,bx xor dx,dx mov ax,0x0212 int 0x13 cmp ah,0x0 je .ok_rcyl mov si,err_rcyl call puts call putx .ok_rcyl: newStr popa ret а это я её использую Код (Text): push 0x0050 pop es xor bx,bx xor ch,ch .rcyls: call rcyl inc ch cmp ch,CTR je .ok_rcyls add bx,0x2400 jmp .rcyls .ok_rcyls: mov si,ok_str call puts jmp far 0x0070:0x0000 Почему то прыгает оно на какой-то мусор.... в чем же дело? проверяю в VMware
Чесное слово розбиратся в твоем исходнике в лень, поетому можеш взять мой. Отлажен он на 100%. Это процедура чтения сектора. Принимаемые значения: АХ = сектор, который нужно загрузить(в твоём случае №1) ES = сегмент куда нада грузить (наприм 0х0050) BX = смещение (тебе вроде 0 нада) Просто поставь в цыкл, если тебе нада загрузить 18 секторов. Код (Text): BOOT_SECTOR_LOAD_SECTOR_DATA: push ax push dx push cx push bx mov bl,18 div bl mov cl,ah inc cl xor ah, ah mov bl,2 div bl mov ch,al mov dh,ah mov dl,0 pop bx pop ax push ax push bx mov ah,0x02 int 0x13 jc BOOT_SECTOR_ERROR_READING pop bx pop cx pop dx pop ax ret
Так ты грузишь сектора по адресу 50:0 а прыганшь на 70:0 И кстати читаешь начиная с первого сектора, а это бут. Надо mov cl, 2
Кстати, у меня вот такой вопрос. Как мне обращаться к дискам после перехода в защищенный режим? Ведь использовть int 13h уже не получиться, даже если для него создать дескриптор в таблице IDT, так как код обработчика 16-битный и должен работать в реальном режиме. Как быть то тогда? Писать свой низкоуровневый драйвер, в котором напрямую обращаться к регистрам контроллеров???
programmist Так я поэтому и прыгаю на 700h(нач. с 500h копи бут) а вообще мне пофиг что я засорю немного кода(200h байт) этим бутом... зато rcyl красиво щас вроде все ок. а вот в fasm jmp 0x0000:0x0700 отличается чем-то от jmp far 0x0000:0x0700 если да то чем... поподробнее(вопрос по этой теме хотя щас почему то VMware одинаково реагирует и на то и на то)
Устанавливает видео режим. Переходит в защищенный режим. И больше не трогает int 10h. Детально можно глянуть в исходных кодах.
Pavia Спасибо. ENRIX Когда в команде указывается и сегмент и смещение, то тогда само собой подразумевается что это будет далекий прыжок.
programmist rudik Ага понятно... я так и думал.. просто меня удивило что как-то когда менял оно вело себя по разному...интересно почему... но уже не важно