<>학습노트(一)---후기

책과 NTLDR을 거꾸로 엮어 MBR을 하나 썼는데 사순환에 들어간 것 같다???
나는 컴파일된 파일을 디스크 MBR에 썼는데, 다시 시작하고, 반응이 없고, 각종 디버깅 출력이 틀림없다
아마도 MBR이 MBR을 읽고 0x7C00으로 다시 불러오는 전환 제어권은?
분명히 파티션 테이블의 PBR을 읽었는데?코드 붙여.
bios.inc
include 'macro/struct.inc'
;BIOS      

;       
BIOS_BOOT_FROM_NEXT_DEVICE			=	0x18

;      ,   =AH,    
BIOS_DIRECT_DISK_SERVICE				=	0x13
;     
BIOS_DDS_RESET_DEVICE						=	0x00
;       
;     :DH=  ,DL=    ,CL 6 =  
BIOS_DDS_READ_DEVICE_PARAMETER	=	0x08
;   
;  :AL=   ,CH=  ,CL=  ,DH=  
;DL=   ,00H~7FH:  ;80H~0FFH:  
;ES:BX=      
BIOS_DDS_READ_SECTOR						=	0x02
;    DDS    
;  :DL=   ,0x80=     ,0x81=     ......
BIOS_DDS_CHECK_EXTENSION				=	0x41
;             
struct STRUCT_DDS_EXTENSION_PACK
	;    =0x10
	Size					db	?
	;  
	Resvered1			db	?
	;     
	BlockCount		dw	?
	;      
	BufferOffset	dw	?
	;     
	BufferSegment	dw	?
	;     ,  ( 6 )   ( 10 )
	SC_L					dw	?
	SC_H					dw	?
	;  =0
	Unknown1			dd	?
ends
BIOS_DDS_EXTENSION_READ					=	0x42
BIOS_DDS_EXTENSION_WRITE				=	0x43

fs.inc
include 'macro/struct.inc'
;      

FSID_FAT12				=	0x01
FSID_FAT16				=	0x04
FSID_FAT16_2			=	0x06
FSID_FAT16_3			=	0x0E
FSID_FAT32				=	0x0B
FSID_FAT32_2			=	0x0C
FSID_NTFS					=	0x07
FSID_HPFS					=	FSID_NTFS
FSID_EXTENDED			=	0x05

FS_ACTIVE					=	0x80

;     =16  
struct STRUCT_PARTITION_TABLE
	;    ,0=   ,0x80=  
	State							db	?
	;     
	BeginHead					db	?
	;    ( 6 )    ( 10 )
	BeginSC						dw	?
	;    
	FSID							db	?
	;     
	EndHead						db	?
	;        , BeginHead
	EndSC							dw	?
	;      , 16+ 16=32 
	InfoAreaSectors_L	dw	?
	InfoAreaSectors_H	dw	?
	;    
	Sectors						dd	?
ends

FLAG_BOOT_RECORD	=	0xAA55

;     ,512  
struct STRUCT_MASTER_BOOT_RECORD
	Codes				rb	446
	Partition1	STRUCT_PARTITION_TABLE
	Partition2	STRUCT_PARTITION_TABLE
	Partition3	STRUCT_PARTITION_TABLE
	Partition4	STRUCT_PARTITION_TABLE
	;    =0x55AA
	Flag				dw	?
ends

;FAT     ,25  ,FAT12 FAT16      
struct STRUCT_BIOS_PARAMETER_BLOCK_FAT
	;      
	BytsPerSec	dw	?
	;     
	SecPerClus	db	?
	;Boot        
	RsvdSecCnt	dw	?
	;    FAT 
	NumFATs			db	?
	;         
	RootEntCnt	dw	?
	;    
	TotSec16		dw	?
	;     
	Media				db	?
	; FAT   
	FATSz16			dw	?
	;      
	SecPerTrk		dw	?
	;   (  )
	NumHeads		dw	?
	;     
	HiddSec			dd	?
	;  TotSec16=0         
	TotSec32		dd	?
ends

;      =512  
struct STRUCT_PARTITION_BOOT_RECORD
	;     
	CodeJmp			rb	3
	;   (   )
	OEMName			rb	8
	;BIOS_PARAMETER_BLOCK
	BPB					STRUCT_BIOS_PARAMETER_BLOCK_FAT
	;  13     
	DrvNum			db	?
	;   (           )
	Head				db	?
	;      =0x29
	BootSig			db	?
	;    
	VolID				dd	?
	;  (   )
	VolLab			rb	11
	;      (   )
	FileSysType	rb	8
	;  ,   
	Others			rb	448
	;  =0x55AA
	Flag				dw	?
ends

;     ,32  
struct STRUCT_ROOT_DIRECTORY_FAT
	;   8  ,   3  
	Name				rb	11
	;    
	Attr				db	?
	;  
	Reserved1		rb	10
	;      
	WrtTime			dw	?
	;      
	WrtDate			dw	?
	;    
	FstClus			dw	?
	;    
	FileSize		dd	?
ends

mbr.asm
include 'bios.inc'
include 'fs.inc'
MASTER_BOOT_RECORD_BASE			=	0x7C00
MASTER_BOOT_RECORD_NEW_BASE	=	0x0600

use16
ORG MASTER_BOOT_RECORD_BASE
Main:;  ,   ,    ,     
	;       
	xor  ax, ax
	mov  ss, ax
	mov  es, ax
	mov  ds, ax
	;     
	mov  sp, MASTER_BOOT_RECORD_BASE
	;    ,     
	mov  si, MbrEntry
	mov  di, (MASTER_BOOT_RECORD_NEW_BASE + MbrEntry - $$)
	push ax
	push di
	mov  cx, (MbrEnd - MbrEntry)
	rep  movsb
	retf;ax:di
;Main  

MbrEntry:
	mov  bp, (MASTER_BOOT_RECORD_NEW_BASE + par1 - $$)
	mov  cx, 4
.Loop_FindActivePartition:
	cmp  [bp + STRUCT_PARTITION_TABLE.State], 0
	jl   .ToLoadPbr
	jne  .InvalidMbr
	add  bp, sizeof.STRUCT_PARTITION_TABLE
	loop .Loop_FindActivePartition
	;       
	int  BIOS_BOOT_FROM_NEXT_DEVICE
.InvalidMbr:
	mov  bp, (MASTER_BOOT_RECORD_NEW_BASE + szMbrError - $$)
	mov  cx, 31
	call DisplayMessage
	jmp  $
.ToLoadPbr:;bp=     
	call LoadPbr
	jb  .LoadPbrFail
	cmp  word [flag], FLAG_BOOT_RECORD
	jne  .PbrError
	push ax;ax=0
	push MASTER_BOOT_RECORD_BASE
	retf;      PBR
.LoadPbrFail:
	mov  bp, (MASTER_BOOT_RECORD_NEW_BASE + szLoadPbrFail - $$)
	mov  cx, 33
	call DisplayMessage
	jmp  $
.PbrError:
	mov  bp, (MASTER_BOOT_RECORD_NEW_BASE + szPbrError - $$)
	mov  cx, 30
	call DisplayMessage
	jmp  $
;MbrEntry  

LoadPbr:;bp=     
	mov  di, 5;  5 ReadPBR
	mov  dl, [bp + STRUCT_PARTITION_TABLE.State]
	mov  ah, BIOS_DDS_READ_DEVICE_PARAMETER
	int  BIOS_DIRECT_DISK_SERVICE
	jb   .ReadPBR;  ,      PBR
	mov  al, cl;AX=0
	and  al, 00111111B;  6 
	cbw; AL      AH
	mov  bl, dh;   
	mov  bh, ah;AH=0
	inc  bx;      
	mul  bx;  *  =ax*bx,  =dx:ax
	mov  dx, cx
	xchg dh, dl
	shr  dh, 6;  2 
	inc  dx
	;     *     *     =    
	mul  dx
	cmp  [bp + STRUCT_PARTITION_TABLE.InfoAreaSectors_H], dx
	ja   .ReadPBREx;     ,    
	jb   .ReadPBR;     ,    
	cmp  [bp + STRUCT_PARTITION_TABLE.InfoAreaSectors_L], ax
	jnb  .ReadPBREx;     ,      
.ReadPBR:
	mov  ah, BIOS_DDS_READ_SECTOR
	mov  al, 1
	mov  bx, MASTER_BOOT_RECORD_BASE
	mov  cx, [bp + STRUCT_PARTITION_TABLE.BeginSC]
	xor  dx, dx
	mov  dl, [bp + STRUCT_PARTITION_TABLE.State];dx=FS_ACTIVE=0x80=    
	int  BIOS_DIRECT_DISK_SERVICE
	jnb  .Ret;  
	dec  di
	je   .Ret;   5 ,    
	;     ,    
	xor  ah, ah
	mov  dl, [bp + STRUCT_PARTITION_TABLE.State]
	int  BIOS_DIRECT_DISK_SERVICE
	jmp  .ReadPBR
.ReadPBREx:
	mov  dl, [bp + STRUCT_PARTITION_TABLE.State]
	pusha
	mov  bx, 0x55AA;       ?
	mov  ah, BIOS_DDS_CHECK_EXTENSION
	int  BIOS_DIRECT_DISK_SERVICE
	jb   .Failure;   
	;    
	cmp  bx, FLAG_BOOT_RECORD
	jne  .Failure
	test cl, 1;        ,    ?
	je   .Failure
	popa
.Loop_ReadPBREx:
	pusha
	;            
	;     .       ,          
	mov  si, MASTER_BOOT_RECORD_NEW_BASE + Pack_Extend - MASTER_BOOT_RECORD_BASE
	mov  [si + STRUCT_DDS_EXTENSION_PACK.BufferOffset], MASTER_BOOT_RECORD_BASE
	mov  [si + STRUCT_DDS_EXTENSION_PACK.BufferSegment], 0
	push ax
	mov  ax, [bp + STRUCT_PARTITION_TABLE.InfoAreaSectors_L]
	mov  [si + STRUCT_DDS_EXTENSION_PACK.SC_L], ax
	mov  ax, [bp + STRUCT_PARTITION_TABLE.InfoAreaSectors_H]
	mov  [si + STRUCT_DDS_EXTENSION_PACK.SC_H], ax
	pop  ax
	mov  ah, BIOS_DDS_EXTENSION_READ
	int  BIOS_DIRECT_DISK_SERVICE
	popa
	dec  di
	je   .Ret;   5 ,    
	;  ,    
	xor  ah, ah
	mov  dl, [bp + STRUCT_PARTITION_TABLE.State]
	int  BIOS_DIRECT_DISK_SERVICE
	jmp  .Loop_ReadPBREx
.Failure:
	popa
	stc;  CF=1
.Ret:
	retn
;LoadPBR  

DisplayMessage:
	mov  ax, 0x1301
	mov  bx, 0xC
	xor  dl, dl
	int  0x10
	ret
;DisplayMessage  

szMbrError		db	"Invalid Master Partition Table."
szLoadPbrFail	db	"Can't Load Partition Boot Record."
szPbrError		db	"Invalid Partition Boot Record."

Pack_Extend 			STRUCT_DDS_EXTENSION_PACK 0x10, 0, 1, 0xFF, 0xFF, 0xFF, 0xFF, 0
CodeEnd:;    ,       +    
times	sizeof.STRUCT_MASTER_BOOT_RECORD.Codes - ($-$$)	db	0
par1 STRUCT_PARTITION_TABLE 0x80, 0x01, 0x0001, 0x07, 0xFE, 0xBFBF, 0x003F, 0, 0x00AC9281
par2 STRUCT_PARTITION_TABLE
par3 STRUCT_PARTITION_TABLE
par4 STRUCT_PARTITION_TABLE
flag							dw	FLAG_BOOT_RECORD
MbrEnd:

누군가가 나를 도와 해결해 줬으면 좋겠어, 고마워.

좋은 웹페이지 즐겨찾기