Code (ASM): org 0 use16 ;------------------------; mov ah,00h ; mov al,03h ; int 10h ; ;------------------------; ;------------------------; mov ah,05h ; mov al,0 ; int 10h ; ;------------------------; ;------------------------; mov bx,0 ; mov dl,0 ; mov dh,25 ; mov ah,02h ; int 10h ; ;------------------------; cli cld xor ax, ax mov ds, ax mov es, ax mov ss, ax mov sp, 0x8000 sti mov dh,0 ; mov ch,0 ; mov cl,1 ; ;-------------------; mov ax, 0000h ; mov es, ax ; mov bx, .ENDLOADER ; ;-------------------; mov al, 1 ; mov ah, 2h int 13h jmp .ENDLOADER times 0x200 - 2 - ($ - $$) db 0x90 db 055h, 0AAh .ENDLOADER: ;==============================================================================} mov edi,0B8000h mov byte[es:edi],' ' inc edi mov byte[es:edi],01010101b jmp $ Код, размещённый в загрузчике должен загружать в RAM ядро, но почему-то этого не происходит Code (ASM): mov dh,0 ; mov ch,0 ; mov cl,2 ; ;-------------------; mov ax, 0000h ; mov es, ax ; mov bx, 0x8000 ; ;-------------------; mov al, 30 ; mov ah, 2h int 13h jmp far 0:8000h По адресу 0:8000h расположено ядро, если его конечно можно так назвать Code (ASM): org 0x8000 Start: mov ecx,2000 ; mov al,' ' ; mov ah,01010101b ; ;------------------------; mov EDI,0B8000h ; ;------------------------; .CICLE: test ecx,ecx ; jz .ENDCICLE ; MOV [ES:EDI],al ; inc EDI ; MOV [ES:EDI],ah ; inc EDI ; dec ecx ; jmp .CICLE ; .ENDCICLE: ;------------------------; jmp $ Ядро должно заполнить экран розовым, но этого не происходит. И проблема не в этом куске кода (я тестировал - он работал в загрузчике). Просьба тем кто знает сказать, в чём дело Весь код: Code (ASM): org 0 use16 ;------------------------; mov ah,00h ; mov al,03h ; int 10h ; ;------------------------; ;------------------------; mov ah,05h ; mov al,0 ; int 10h ; ;------------------------; ;------------------------; mov bx,0 ; mov dl,0 ; mov dh,25 ; mov ah,02h ; int 10h ; ;------------------------; cli cld xor ax, ax mov ds, ax mov es, ax mov ss, ax mov sp, 0x8000 sti mov dh,0 ; mov ch,0 ; mov cl,2 ; ;-------------------; mov ax, 0000h ; mov es, ax ; mov bx, 0x8000 ; ;-------------------; mov al, 30 ; mov ah, 2h int 13h jmp far 0:8000h times 0x200 - 2 - ($ - $$) db 0x90 db 055h, 0AAh ;==============================================================================} org 0x8000 Start: mov ecx,2000 ; mov al,' ' ; mov ah,01010101b ; ;------------------------; mov EDI,0B8000h ; ;------------------------; .CICLE: test ecx,ecx ; jz .ENDCICLE ; MOV [ES:EDI],al ; inc EDI ; MOV [ES:EDI],ah ; inc EDI ; dec ecx ; jmp .CICLE ; .ENDCICLE: ;------------------------; jmp $ (Обновлено)Работающий код: Code (ASM): org 0 use16 ;------------------------; mov ah,00h ; mov al,03h ; int 10h ; ;------------------------; ;------------------------; mov ah,05h ; mov al,0 ; int 10h ; ;------------------------; ;------------------------; mov bx,0 ; mov dl,0 ; mov dh,25 ; mov ah,02h ; int 10h ; ;------------------------; cli cld xor ax, ax mov ds, ax mov es, ax mov ss, ax mov sp, 0x8000 sti mov dh,0 ; mov ch,0 ; mov cl,1 ; ;-------------------; mov ax, 0000h ; mov es, ax ; mov bx, .ENDLOADER ; ;-------------------; mov al, 1 ; mov ah, 2h int 13h jmp .ENDLOADER times 0x200 - 2 - ($ - $$) db 0x90 db 055h, 0AAh .ENDLOADER: ;==============================================================================} mov edi,0B8000h mov byte[es:edi],' ' inc edi mov byte[es:edi],01010101b jmp $ P.S. Программа не моя, просто пытаюсь понять, как это работает P.S.S. Запускаю из-под VirtualBox
Во первых, для изучения возьмите QEMU + связку IDA (Remote GDB debugger) и вы сможете по шагам отлаживать ваши бут программы. Во вторых, нельзя писать код так, как написали вы. Нельзя ставить Org XXXX после того, как вы уже поставили Org 0h. и вообще по хорошему нужно чтоб загрузчик умел откуда-то загружать файлы. Например с дискетки, читая FAT. Тогда у вас не будет проблем. Отдельно будет бутлоадер, отдельно будет программа.
Вы говорите, что после org 0 нельзя прописать org xxxx. Тогда как поменять смещение, допустим, в середине программы?
beginnerga, вы путаете org директива говорит компилятору сгенерировать программу, которую загрузчик загрузит по смещению внутри сегмента заданому в этой директиве вы должны написать программу, которая будет перемещать часть кода (которую нужно поместить в 8000h) из одного адреса, в другой. Обычное копирование - память-> память. После копирования передаете управление командой Jmp . Код должен быть базонезависимый. Иначе придется вам все смещения перерасчитывать . Но лучше просто сделать два исходника, как я предложил выше Один запишете в загрузчик, второй запишете на дискету в фс как файл, который прочитает загрузчик и передаст туда управление
TermoSINteZ, Не могли бы вы привести пример программы, которую вы описали выше? Если нет, то посоветуйте, где можно найти исходники подобных программ --- Сообщение объединено, Dec 4, 2019 --- TermoSINteZ, Спасибо за подсказку с org! Проблема была решена путём смещения "ядра" с адреса 8000h на адрес 513h (сразу после загрузочного сектора) --- Сообщение объединено, Dec 4, 2019 --- TermoSINteZ, Ещё вы советовали "научить" программу читать с дискеты с ФС FAT, но, думаю, что для мини-"системы", которая весит 532 байта (хотя можно было с лёгкостью уместить её в загрузчике), такой метод загрузки был бы неэффективен
Пример бутлоадера , загружающего exe с названием (KERNEL.EXE) смотрите аттач. Бутлоадер после компиляции - помещаете на образ дискетки. (0 сектор будет содержать бутлоадер) . Сама дискетка примет формат FAT12. В корень кидаете Kernel.exe файл. Код бутлоадера ищет файл по ФС (по имени) и загружает его И того бутлоадер весит 512 байт. Вам много чтоли? Помоему очень даже эффективно
beginnerga, это ошибка бутлоадера MsgErrRead db "RE" Можете почитать исходник, чтоб понять почему не удалось прочитать файл (ошибку вернула функция биос чтения сектора)
Всем доброго времени суток. Помогите разобраться в причине неработоспособности загрузчика и ядра (от TermoSINteZ'а). У меня сложилось впечатление, что дело в коде ядра. Где-то там есть ошибка, а вот где - не могу разобраться. В DOS'е-то я специалист еще тот. Выручайте кто чем может, а то на эту Windows 10 смотреть уже не могу. Вся документация по моему вопросу, в аттаче.
Подниму еще раз свою тему. Возможно, из-за шуток, со стороны показалось, что мне не особо-то и нужен ответ на мой вопрос, но это не так. Проблема в следующем: Пытаюсь запустить из образа дискеты 1,44 - загрузчик и ядро от (от TermoSINteZ'а https://wasm.in/threads/zagruzka-jadra-s-diskety.33518/#post-414039), но у меня все работает "криво". Такое впечатление, что загрузчик код ядра на образе находит и загружает, а сам код ядра работает не корректно и вместо сообщения: "Exit... Please reboot system" - выдает какие-то "крякозябры". Образ дискеты запускал на QEMU. Все файлы и скрины есть в аттаче. Кто в теме - посмотрите пожалуйста. Может я где-то ошибся и поторопился с выводами? Заранее спасибо.
savoyard, никаких ошибок там нет Содержимое бат файла самое дефолтное Code (DOS): REM Start qemu on windows. @ECHO OFF REM SDL_VIDEODRIVER=directx is faster than windib. But keyboard cannot work well. SET SDL_VIDEODRIVER=windib REM SDL_AUDIODRIVER=waveout or dsound can be used. Only if QEMU_AUDIO_DRV=sdl. SET SDL_AUDIODRIVER=dsound REM QEMU_AUDIO_DRV=dsound or fmod or sdl or none can be used. See qemu -audio-help. SET QEMU_AUDIO_DRV=dsound REM QEMU_AUDIO_LOG_TO_MONITOR=1 displays log messages in QEMU monitor. SET QEMU_AUDIO_LOG_TO_MONITOR=0 REM PCI-based PC(default): -M pc qemu-system-x86_64.exe -L . -m 128 -M pc -fda floppy_img.flp -soundhw all -localtime -net nic,model=ne2k_pci pause Образ флешки прикрепил Возможно вы неправильно собрали кернел. Либо неправильно создали образ дискеты.
TermoSINteZ, спасибо за внимание. С вашими файлами у меня прям мистика какая-то. Скачал ваш последний аттач с образом флешки, а он внутри пустой. Может поторопились и забыли вложить или у меня даже на это ума не хватает? Кернел и загрузчик компилировал FASM'ом, а образ дискеты делал с "живой" дискеты. Потом в этом образе подменил первые 512 байт с вашего загрузчика, а в корень скопировал кернел. В моем аттаче все эти файлы есть. Может вы их у себя попробуете запустить? Хочу понять где я ошибся.
savoyard, да мой косяк по флоппику. Почему то вчера не загрузилось до конца. Перезалил. Ок посмотрю ваш аттач
savoyard, добавьте инициализацию DS сегмента. И изучите обязательно 16 битную модель памяти и вообще как кодить простые EXE прогаммы для DOS. Исправленный кусок программы Code (ASM): start: ;Очищаем экран mov ax,3 int 10h ;=======это нужно было добавить=========== mov ax,data16 mov ds,ax ;=======конец добавленного блока=========== Exit_pr: ;Выходим из программы mov si,MsgExitToBIOS call print ;возврат управления в биос ;int 18h cli hlt
@TermoSINteZ, спасибо за помощь по моему вопросу. Теперь все работает "прямо", в том смысле, что не "криво". Уже изучаю. Буквально позавчера поставил себе на виртуалку DOS. Запустил в DOS'е ваше обновленное ядро без загрузчика - все работает корректно. P.S. Кого только среди журналистов нет на WASM'е. Тут тебе и физики-ядерщики и академики с профессорами, но как только дело доходит до какого-нибудь простого вопроса, то получается, что никто кроме TermoSINteZ'а его решить-то и не может. Вот такая вот правда жизни. Но зато по вопросам коронавирусов, самолетиков и прочей Илоно-хрени - желающих высказаться хоть отбавляй. Лучше бы все было с точностью до наоборот.