2015-02-06 2 views
1

Я пытаюсь сделать простой загрузчик, который будет работать с USB. После нескольких проблем, я попытался с помощью блока следующий код ASM (который я получил от MikeOS):Простой загрузчик USB

BITS 16 

start: 
mov ax, 07C0h  ; Set up 4K stack space after this bootloader 
add ax, 288  ; (4096 + 512)/16 bytes per paragraph 
mov ss, ax 
mov sp, 4096 

mov ax, 07C0h  ; Set data segment to where we're loaded 
mov ds, ax 

mov si, msg 
call move 

jmp $ 

msg db 'Whatever!', 0 

move: 
mov ah, 0Eh 

.print: 
lodsb 
cmp al,0 
je .Done 
int 10h 
jmp .print 

.Done: 
ret 

times 510-($-$$) db 0 
dw 0xAA55  

Это привело к L печатается бесконечное число раз, когда я пытался загрузить его из USB :( Может кто-нибудь, дайте мне знать, что я делаю неправильно

Я копирую его в сектор 0, используя дд

Edit:.. Это как-то не работает на моем компьютере, но работает на моей сестры ноутбук . Кто-нибудь может подумать, почему?

+0

Ваш код работает для меня: http://cl.ly/image/2H0E0Z3I0S3y –

+0

Работает отлично, когда я пытаюсь запустить его из QEmu или Virtual Box, но проблема возникает, когда я перезагружаю компьютер, загружая его непосредственно из USB – Rikh

ответ

0

В коде, который вы опубликовали, нет ошибок, которые объясняли бы симптомы.

Примечание: Есть 2 ошибки. Предполагается, что флаг направления прозрачен и не делает cld до lodsb, но это может привести к тому, что он отобразит «W», за которым последуют странные символы (а не «L»). Он также не устанавливает значение в bh для номера страницы, используемого «int 0x10, ah = 0x0E», но это может не показать ничего (а не повторить «L»).

Учитывая отсутствие причины в самом коде; наиболее вероятной проблемой является либо проблема с копированием полученного двоичного файла на флэш-память USB (скорее), либо проблема с тем, как вы собираете код (менее вероятно).

+0

Спасибо за ответ! Я использую dd if = Simple.bin of =/dev/sdc bs = 512 count = 1 Я уверен, что правильно его копирую, потому что я проверил его в шестнадцатеричном редакторе, и он показывает файл на Сектор 0 Я вносил изменения, исправляя ошибки, и теперь это приводит к тому, что ничего не отображается с курсором во второй строке и мигает (я могу делать изменения неправильно, но опять же, он отлично работает в виртуальном диспетчере и вызывает проблемы при загрузке) – Rikh

+0

@IrLearn: для «отображения ничего», возможно, установка 'bh' перед использованием« int 0x10, ah = 0x0E »может помочь .. ;-) – Brendan

Смежные вопросы