Assembly 在VirtualBox上测试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

我正在尝试使用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
    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。