Top.Mail.Ru
Ответы

Как избавиться от ошибки в assembler

Всем привет, делаю свою ос, и пишу загрузчик. при запуске осы, виртуалбокс выдает критическую ошибку. я подрубил дебаггер, и вот что получил:

1234567891011
 Welcome to the VirtualBox Debugger! 
Current VM is eccd0000, CPU #0 
VBoxDbg>  
dbgf event/0: DBGFSTOP (hyper) 
File:     VINF_EM_TRIPLE_FAULT 
Line:     0 
Function: <NULL> 
eax=00001846 ebx=000000ca ecx=0000b7f3 edx=00000204 esi=00000207 edi=00000f00 
eip=00000225 esp=00000001 ebp=00000000 iopl=0 rf nv up di pl zr na po nc 
cs=0202 ds=0000 es=0f00 fs=0000 gs=0000 ss=576d               eflags=00210046 
0202:00000225 ff ff                   Illegal opcode  

сам код:

boot.asm

12345678910111213141516171819202122232425262728293031323334353637383940
 use16 
 
org 7C00h 
 
jmp boot_entry 
 
nop 
 
msg db "Starting BootLoader", 0Dh, 0Ah, 0x00 
 
log db "Loading second stage...", 0Dh, 0Ah, 0x00 
 
include "os/boot.inc" 
 
boot_entry: 
 
cls 
 
printsz msg 
 
printsz log 
 
mov  ah, 02h 
mov  al, 10h 
mov  cx, 0002h 
mov  bx, 7E00h 
movs es, 0000h 
int 13h 
 
mov sp, 7E0h 
movs ds, 7E00h 
jmp 0000:7E00h 
 
cli 
hlt 
jmp $-2 
 
times 200h-2h-$+$$ db 00h 
 
dw 0AA55h 

os/boot.inc

1234567891011121314151617181920212223242526272829
 __print_stringz__: 
mov ah, 0x0E 
__print_stringz__.__print_loop__: 
lodsb 
test al, al 
jz __print_stringz__.__print_ending__ 
int 10h 
jmp __print_stringz__.__print_loop__ 
__print_stringz__.__print_ending__: 
ret 
macro printsz charptr { 
    push ax si 
    mov si, charptr 
    call __print_stringz__ 
    pop si ax 
} 
macro cls { 
    push ax 
    mov ax, 0003h 
    int 10h 
    pop ax 
} 
 
macro movs reg, src { 
    push ax 
    mov ax, src 
    mov es, ax 
    pop ax 
} 
По дате
По рейтингу
Аватар пользователя
Мастер

иногда виртуальные не могут выдать правильно, проще написать свой мбр и запихнуть его на флэшку и загрузится с нее и проверить

Аватар пользователя
Мастер

Статья 211