<>학습노트(一)---후기
나는 컴파일된 파일을 디스크 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:
누군가가 나를 도와 해결해 줬으면 좋겠어, 고마워.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
9-1. 구조체와 클래스 비교, 구조체 개념(struct)구조체와 클래스는 프로그램 코드의 구성요소가 되는 범용 구조이다. 상수, 변수, 그리고 함수를 정의하는 것과 같은 구문을 사용해서 구조체와 클래스에 프로퍼티와 메서드를 기능적으로 추가할 수 있다. 스위프트에서 클래스...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.