Код загрузчика в bochs строки правильно выводит, а вот в VWWare или при загрузке реального компа строки не выводятся...( Code (Text): format binary use16 SECTOR_SIZE = 200h BIOS_LOAD_ADDR = 7C00h MY_LOAD_ADDR = BIOS_LOAD_ADDR + SECTOR_SIZE BUFFER_ADDR = MY_LOAD_ADDR + SECTOR_SIZE struc ExtDisk number_sector,start_sector { .size DB 10h .reserve0 DB 0 .number_sector DB ? .reserve1 db 0 .buf_seg DW ? .buf_off DW ? .start_sector dq 0 }; ORG MY_LOAD_ADDR macro COPY_MEM from,to,count { cld mov cx,count mov si,from mov di,to rep movsb ; Move byte at address DS:(E)SI to address ES:(E)DI }; COPY_MEM BIOS_LOAD_ADDR,MY_LOAD_ADDR,SECTOR_SIZE jmp @main @main: xor ax,ax mov es,ax mov sp,BIOS_LOAD_ADDR int 10h mov bl,31 mov cx,7 mov bp,STR_ENTER mov dh,10 mov dl,0 mov al,1 mov ah,13h int 10h xor ax,ax int 16h sub al,'0' mov [DEP.size],10h mov [DEP.number_sector],1 mov [DEP.buf_seg],0 mov [DEP.buf_off],BIOS_LOAD_ADDR add al,80h mov ah,42h mov dl,al mov si,DEP int 13h jc @ERROR_READ mov bl,31 mov cx,2 mov bp,STR_OK mov dh,11 mov dl,0 mov al,1 mov ah,13h int 10h jmp @loop_ @ERROR_READ: mov bl,31 mov cx,15 mov bp,STR_ERROR mov dh,11 mov dl,0 mov al,1 mov ah,13h int 10h @loop_: nop jmp @loop_ DEP ExtDisk STR_OK db 'OK' STR_ENTER db 'ENTER: ' STR_ERROR db 'ERROR READ DISK'
хотя нетбук грузиться, образ на флешку сброшен(перезаписаны первые 200байт). А настольный ПК хоть и показывает что из флешки можно загрузиться, но в итоге просто серый екран...
Я к тому, что по приведенному коду трудно понять, в чем проблема. Хотя, возможно, виноват движок форума, обрезающий самое главное. Я с мобильника.
В общем как оказалось проблема в том что я переносил первый сектор на адрес 0х7Е00. Хотя странно bochs нормально это воспринимает..
Если я правильно понимаю, то проблема может быть связана с отсутствием дальнего перехода или инициализации стека.
Phantom_84 стек настроен: mov sp,0x7C00 управление передаю на код jmp far 0000h:@main bochs - это нормально воспринимает, VMWare пишет нет ОС. нетбук перезагружаеться. если сделать так: jmp @main то нетбук грузит, только строки текста не выводит. точнее выводит но так текста не видно(только установленный фон букв видно,по нем и сужу о логике программы)...
Code (Text): mov ax,7c00h mov es,ax Так делать не надо. Я извиняюсь за вчерашнее. Я видел код только до jmp @main включительно. Однако оба мои замечания остаются в силе. Стек нужно инициализировать в самом начале и естественно при этом устанавливать не только sp, но и ss. Вместо jmp @main нужно использовать jmp 0:@main. также не понятен вот этот фрагмент. Code (Text): xor ax,ax ... int 10h Это что установка видеорежима 0? Обычно используют видеорежим 3. Code (Text): mov ax,3 int 10h Дальше пока не смотрел.
Phantom_84 Code (Text): xor ax,ax ... int 10h да это видео режим, мне все равно какой именно, главное чтоб строки выводил. про ss забыл. jmp 0:@main вот это попробую.
А может быть bl настроить на нужную страницу? По идее там 0 ноль должен быть у тебя, но малоли может post не очистил....
Сегментные регистры не помешало бы заполнить, разные системы по-разному заполняют при передаче управления загрузоному сектору. Я про ds/ss Кстати, твоё копирование в 7е00 бесполезно, потому что у тебя в начале стоит org 0x7e00 jmp @main / @main: будет скомпилировано всегда в EB 00, а ты, вероятно, хотел передать управление в @main+200h
+1 Данные-то из копии будут выбираться нормально, но только до того момента, пока он не попытается "поверх себя" загрузить новые данные с диска. jmp 0:@main исправляет ситуацию. Кстати я его предложил не для того, чтобы исправить эту глупую ситуацию, а потому что для актуализации кода в памяти перед передачей управления этому коду необходимо сделать хотя бы один дальний переход.
Нужно сделать как-то так: Code (Text): org 7C00h ... jmp 0:@main org 7E00h+($-$$) @main: ... rb 7FFEh-$ dw 0AA55h Можно даже лишнее не копировать.
Code (Text): org 07C00h ; смещение по которому программа загрузится в память 00000:07C00h jmp Begin ; прыжок на начало кода nop ;================== BPB sector ================ db 'bootsect' SectSize dw 00200h ClustSize db 001h ResSecs dw 00001h FatCnt db 002h RootSz dw 000E0h TotSecs dw 00B40h Media db 0F0h FatSz dw 00009h TrkSecs dw 00012h HeadCnt dw 00002h HidnSec dw 00000h ;====================================================================== Begin: cli xor cx, cx mov ax,cx mov ds,ax mov es,ax mov ss,ax mov sp,07C00h sti call GetCursorPos mov bp, msg ; Loading mov cx, 12 call print call Turn_Off ;===================== Подпрограммы =================================== ;---------------------------------- GetCursorPos: mov ah,3h xor bh,bh int 10h ret ;---------------------------------- print: mov bl,7 mov ax,0x1301 int 10h ret ;---------------------------------- Turn_Off: mov ax,5301h sub bx,bx int 15h jb stop mov ax,530eh sub bx,bx int 15h jb stop mov ax,5307h mov bx,0001h mov cx,0003h int 15h stop: ret ;----------------- data ----------------- msg db 'Loading... ',0x00 times(512-2-($-07C00h)) db 0 ; заполняем остальную часть нулями db 55h,0AAh У меня вот такой код получился. Работаю в VirtualBox. Все работает.