Я пишу небольшую операционную систему - для практики. Я начал с загрузчика.
Я хочу создать небольшую систему команд, которая работает в реальном режиме 16 бит (на данный момент).
Я создал загрузчик, который сбрасывает диск, а затем загружает сектор после загрузчика.
Проблема в том, что после jmp
ничего не происходит.
Я пытаюсь загрузить следующий сектор на 0x7E00 (я не совсем уверен, как указать адрес с помощью es: bx, так что это может быть проблемой, я считаю, что его адрес: смещение) сразу после загрузчика.
Это код:
;
; SECTOR 0x0
;
;dl is number of harddrive where is bootloader
org 0x7C00
bits 16
;reset hard drive
xor ah,ah
int 0x13
;read sectors
clc
mov bx,0x7E00
mov es,bx
xor bx,bx
mov ah,0x02 ;function
mov al,0x1 ;sectors to read
mov ch,0x0 ;tracks
mov cl,0x1 ;sector
mov dh,0x0 ;head
int 0x13
;if not readed jmp to error
jc error
;jump to 0x7E00 - executed only if loaded
jmp 0x7E00
error:
mov si,MSGError
.loop:
lodsb
or al,al
jz .end
mov ah,0x0E
int 0x10
jmp .loop
.end:
hlt
MSGError db "Error while booting", 0x0
times 0x1FE - ($ - $$) db 0x0
db 0x55
db 0xAA
;
; SECTOR 0x1
;
jmp printtest
;definitions
MSGLoaded db "Execution successful", 0x0
;
; Print function
; si - message to pring (NEED TO BE FINISHED WITH 0x0)
printtest:
mov si,MSGLoaded
.loop:
lodsb
or al,al
jz .end
mov ah,0x0E
int 0x10
jmp .loop
.end:
hlt
times 0x400 - ($-$$) db 0x0
Я тестировал этот код с помощью VirtualBox, но ничего не происходит, ошибка чтения не отображается, а также сообщение, которое должно быть напечатано.