Пишу простейший загрузчик. Хочу, чтобы при вводе команды он переключался на загрузку другой операциооной системы, например винды.Для этого копирую код в какую-нить область памяти следующей процедурой:
NASM:
Затем считываю информацию с первого сектора диска с помощью портов в сегмент 0x07c0Copy:
push 0x07c0 ;нынешний сегмент
pop ds
push 0x9000 ;будущий сегмент
pop es
xor si, si
xor di, di
mov cx, 128 ;копирнуть 512 байт
rep movsd
jmp 0x9000:loadwin ;прыгнуть на нужную метку в коде
ret
NASM:
В итоге ничего не происходит и виртуальная машина нагружает винт.loadwin:
mov dx,1f6h
mov al,0a0h ;нужный диск
out dx,al
mov dx,1f2h
mov al,1 ;считать один сектор
out dx,al
mov dx,1f3h
mov al,1 ;Считать первый сектор
out dx,al
mov dx,1f4h
mov al,0 ;Цилиндр 0
out dx,al
mov dx,1f5h
mov al,0 ;Тоже 0
out dx,al
mov dx,1f7h
mov al,20h ;Чтение.
out dx,al
still_going:
in al,dx
test al,8
jz still_going ;Продолжать пока диск не освободится
mov cx,512
push 0x7c00
pop es ;считываем в нужный сегмент
mov di,0
mov dx,1f0h
rep insw
jmp 0x7C00:0 ;Ну и прыгаем на загруженный код