 |
ассистент |
Зарегистрирован: Сб янв 30, 2016 4:41 pm Сообщений: 11 Благодарил (а): 1 раз. Поблагодарили: 0 раз. Пункты репутации: 0
|
Добрый день! Не обзывайте некропостером, пишу сюда, чтобы не плодить темы. Проблема такая: есть загрузочный сектор (loader) и маленькая программа (kernel), которые запускаются с флешки. Точнее, запускались, а теперь почему-то не хотят. Для проверки максимально кастрировал код, оставил только вывод 1 сообщения,что все ок. В Bochs все пучком, работает как надо. Пишу образ на флешку, первые 2 сектора, перегружаюсь и полный облом, вместо сообщений "Loader ok." и "Kernel ok." (тестовые сообщения) получаю "Loader ok. Loader ok."... Пожалуйста, помогите разобраться! Вот листинги загрузчика и программы. Загрузчик Код: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| org 7C00H cli ; Запрет прерываний. mov [drive], dl ; Сохраняем номер привода (в DL), с которого грузимся. xor ax, ax ; Обнуление регистра AX. mov ds, ax ; Обнуление сегментного регистра данных DS. mov es, ax ; Обнуление сегментного регистра ES (Extra Segment). mov ss, ax ; Обнуление сегментного регистра стека SS. mov sp, 7C00H ; Установка указателя стека SP на текущий адрес. sti ; Разрешение прерываний. mov bx, 600H ; ES:BX - адрес буфера для чтения секторов (0000:0600H). mov dl, [drive] ; Восстанавливаем номер привода (в DL), с которого грузимся. mov dh, 0 ; Номер головки. mov cl, 2 ; Номер сектора. mov ch, 0 ; Номер дорожки (цилиндра). mov al, 1 ; Число секторов. mov ah, 2 ; Функция 2 - чтение секторов. int 13H ; Вызов прерывания. mov si, msg call printmsg jmp 0000:0600H ; Передаем управление по адресу буфера. drive: db ? msg: db 'Loader ok. ', 0 printmsg: push ax push si mov ah, 0EH cld printmsg1: lodsb cmp al, 0 jz printmsg2 int 10H jmp printmsg1 printmsg2: pop si pop ax ret times(512-2-($-07C00H)) db 0 end_of_sector: db 055H, 0AAH |
А это типа программа... Код: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| org 600H mov si, k_msg call printmsg endless: jmp endless k_msg: db 'Kernel ok.', 0 printmsg: push ax push si mov ah, 0EH cld printmsg1: lodsb cmp al, 0 jz printmsg2 int 10H jmp printmsg1 printmsg2: pop si pop ax ret |
UPD: Указанный ниже код (он не делает ничего, кроме записи в видеопамять всякой фигни) компилирую и пишу образ, с флешки запускает нормально. В чем проблема, никак не пойму. Код: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| use16 ; 16-битный код, realmode. org 7C00H ; Адрес программы в ОЗУ. cli ; Запрет прерываний. xor ax, ax ; Обнуление регистра AX. mov ds, ax ; Обнуление сегментного регистра данных DS. mov es, ax ; Обнуление сегментного регистра ES (Extra Segment). mov ss, ax ; Обнуление сегментного регистра стека SS. mov sp, 7C00H ; Установка указателя стека SP на текущий адрес. sti ; Разрешение прерываний. mov ah, 0 ; Очистка экрана, установка видеорежима. mov al, 2 ; Режим текстовый, 80х25, 16/8 int 10H ; Вызов прерывания. mov ah, 0 ; Задаем начальный цвет символов. mov al, 1 ; Код символа. mov ch, 1 ; Строка. Используем регистр CX, потому что в процессе работы mov cl, 1 ; Колонка. подпрограммы значения BX (BH и BL) изменяются. t1: mov bh, ch mov bl, cl call print_xy inc al inc ah inc cl cmp cl, 80 jle t1 inc ch mov cl, 0 cmp ch, 26 jl t1 mov ch, 1 jmp t1 print_xy: push 0B800H pop es push ax dec bh mov al, 160 mul bh mov di, ax dec bl mov al, 2 mul bl add di, ax pop ax cmp al, 0 jz print_xy_1 stosw ret print_xy_1: lodsb cmp al, 0 jz end_print_xy stosw cmp di, 0F9FH jl print_xy_1 end_print_xy: ret times(512-2-($-07C00H)) db 0 db 055H, 0AAH |
UPD2. Проблема решена. Надо было просто явно указать привод, с которого идет загрузка. Переписал в минималистичном варианте, теперь все нормально. Код: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| org 7C00H cli ; Запрет прерываний. xor ax, ax ; Обнуление регистра AX. mov ds, ax ; Обнуление сегментного регистра данных DS. mov es, ax ; Обнуление сегментного регистра ES (Extra Segment). mov ss, ax ; Обнуление сегментного регистра стека SS. mov sp, 7C00H ; Установка указателя стека SP на текущий адрес. sti ; Разрешение прерываний. mov bx, 500H ; ES:BX - адрес буфера для чтения секторов (0000:0500H). mov dl, 80H ; Номер привода, с которого грузимся. mov dh, 0 ; Номер головки. mov cl, 2 ; Номер сектора. mov ch, 0 ; Номер дорожки (цилиндра). mov al, 2 ; Число секторов. mov ah, 2 ; Функция 2 - чтение секторов. int 13H ; Вызов прерывания. jmp 0000:0500H ; Передаем управление по адресу буфера. times(510-($-07C00H)) db 0 ; Выравниваем занятое пространство до 510 байт. end_of_sector: db 055H, 0AAH ; Последние 2 байта, сигнатура загрузочного сектора. |
Вложения: |
Комментарий к файлу: Скрин Bochs.
screen.jpg [97.34 KiB]
Скачиваний: 0
|
|
|