Assembly 在VirtualBox上测试2阶段引导加载程序
我正在尝试使用visualstudio 1.5开发16位示例2阶段引导加载程序,并希望在虚拟机上进行测试 我的示例代码是Assembly 在VirtualBox上测试2阶段引导加载程序,assembly,virtualbox,masm,bootloader,x86-16,Assembly,Virtualbox,Masm,Bootloader,X86 16,我正在尝试使用visualstudio 1.5开发16位示例2阶段引导加载程序,并希望在虚拟机上进行测试 我的示例代码是 _TEXT SEGMENT WORD USE16 'CODE' ASSUME CS:_TEXT, DS:_TEXT, ES:_TEXT DATAAREA EQU 7A00H ORG 0600H StartFromSecondSector: jmp near ptr SecondSector
_TEXT SEGMENT WORD USE16 'CODE'
ASSUME CS:_TEXT, DS:_TEXT, ES:_TEXT
DATAAREA EQU 7A00H
ORG 0600H
StartFromSecondSector:
jmp near ptr SecondSector
nop
ORG 0600H
SecondSector:
; Boot Code
ORG DATAAREA
is_ext db 0
ORG 7C00H
ASSUME CS:_TEXT, DS:_TEXT, ES:_TEXT
main:
;segment registers and stack Init Code
xor ax, ax
mov ds, ax
mov es, ax
cli
mov ss, ax
mov sp, 4F00H ; Stack Top
sti
; Check Disk Extension
; https://en.wikipedia.org/wiki/INT_13H#INT_13h_AH.3D42h:_Extended_Read_Sectors_From_Drive
mov dl, 80h
mov ah, 41h
mov bx, 55aah
int 13h
setnc is_ext
; Get Disk Detail
; https://en.wikipedia.org/wiki/INT_13H#INT_13h_AH.3D08h:_Read_Drive_Parameters
mov dl, 80h
mov ah, 08h
int 13h
cmp bx, 0aa55h
je LoadBootSector
jmp ErrorMSGPrompt
LoadBootSector:
mov bx, 600h
mov ah, 42
mov dl, 80h
int 13h
jmp StartFromSecondSector
ORG 7C00H+1BEH
DB 64 DUP (0FFH)
DB 055H
DB 0AAH
ErrorMSGPrompt:
; Error mesage int10
_TEXT ends
end main
在组装和生成16位可执行文件后,我删除了EXE签名,并将二进制文件放入2文件中。1 stage0.DAT包含从7c00开始的512字节代码,另一个文件是stage1.DAT,包含从600偏移量开始的下一个512字节代码
在固定大小的virtualbox vdi HDD中,我将stage0.dat的512字节从0200000复制到2001F0,并将stage1.dat的512字节从0200600复制到02007F0
阶段0工作正常,但跳到阶段2失败。我是不是错过了什么简化问题,如果我要测试一个2级引导加载程序,我的0级代码的512字节将被放置在0200000偏移的签名,但应该是代码级2的中断位置int 13h AH=42h,这样我就可以加载这个堆栈和加载内核,我会假设你的意思是Visual C++ 1.5。至于MASM 1.5,也许是MASM 6.x?当你说uu我从0200000复制了stage0.dat的512字节时uu我想你的意思是0200000不是来自你的代码不是一个最小的完整的可验证示例,因此它可能不会得到你希望的注意。是的,它的Visual Studio 1.5带有CL.exe。在这个帮助下,我制作了1个16位二进制文件。在virtualbox标头上,它的偏移量150描述了其他扇区,所以我从0200000复制了第一个512。这是从0200000到2001F0。第一阶段代码从0200600到0200B12。有一点你没有正确使用。第二个扇区位于气缸0、缸盖0、扇区2(扇区从1开始计数)。如果你想读第二个扇区,你需要告诉它。在AL中读取的扇区数(必须至少为1),CH为圆柱体,在这种情况下需要为0;CL是扇区号,在您的情况下需要为2,DH是头号,在您的情况下需要为0。