我正在尝试使用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 offset开始的下一个512字节。
在固定大小的virtualbox vdi HDD中,我将stage0.dat的512字节从0200000复制到2001F0,并将stage1.DAT的512字节从0200600复制到02007F0
stage0工作正常但跳转到第2阶段失败。我错过了一些东西吗?