我想用汇编语言编写一个程序来读取硬盘的主分区。我连续几天用Google搜索了一下,我发现也许int 13h(啊= 42h)对我而言。但我一开始就失败了。调用INT 13H后,CF设置为1,AH为1.从文档中我知道中断失败。
这是我的代码:
ASSUME CS:CodeSeg, DS:DataSeg, SS:StackSeg
DataSeg SEGMENT
BSBuffer: ; Abbr for Boot Sector Buffer.
MBRecord: ; Master Boot Record.
MBR DB 446 DUP (0)
PartitionA:
StatusA DB 0 ;
BeginHeadA DB 0 ;
BeginSeclynA DW 0 ;
FileSystemA DB 0 ;
FinalHeadA DB 0 ;
FinalSeclynA DW 0 ;
BeginSectorA DD 0 ;
SectorCountA DD 0 ;
PartitionB:
StatusB DB 0 ;
BeginHeadB DB 0 ;
BeginSeclynB DW 0 ;
FileSystemB DB 0 ;
FinalHeadB DB 0 ;
FinalSeclynB DW 0 ;
BeginSectorB DD 0 ;
SectorCountB DD 0 ;
PartitionC:
StatusC DB 0 ;
BeginHeadC DB 0 ;
BeginSeclynC DW 0 ;
FileSystemC DB 0 ;
FinalHeadC DB 0 ;
FinalSeclynC DW 0 ;
BeginSectorC DD 0 ;
SectorCountC DD 0 ;
PartitionD:
StatusD DB 0 ;
BeginHeadD DB 0 ;
BeginSeclynD DW 0 ;
FileSystemD DB 0 ;
FinalHeadD DB 0 ;
FinalSeclynD DW 0 ;
BeginSectorD DD 0 ;
SectorCountD DD 0 ;
Validation:
VALID DW 0 ; Should be 55AAH.
; DAPacket is used as the input parameter of ReadBootSector PROC
DAPacket: ; Abbr for Disk Address Packet.
PacketSize DB 16 ; Always 16.
Reserved DB 0 ; Reserved.
SectorCount DW 1 ; Should be 1 to read boot sector.
BufferOffset DW 0
BufferSegment DW 0
BlockNumber DB 8 DUP (0)
DataSeg ENDS
StackSeg SEGMENT
DB 4096 DUP (0)
StackSeg ENDS
CodeSeg SEGMENT
START:
MOV AX, DataSeg
MOV DS, AX
MOV AX, StackSeg
MOV SS, AX
MOV SP, 4096
MOV DL, 80H
CALL ReadDisk
MOV CX, VALID
MOV AX, 4C00H
INT 21H
; This process is used to read the boot sector of a given disk.
; Input:
; DL - Disk ID, 0~79H for floppies, 80H~FFH for hds.
; Output:
; BSBuffer - Boot sector of the disk indicated by DL.
ReadDisk:
PUSH AX
PUSH SI
MOV SI, DAPacket
MOV PacketSize, 16
MOV SectorCount, 1
MOV BufferOffset, BSBuffer
MOV BufferSegment, DataSeg
MOV AH, 42H
INT 13H
POP SI
POP AX
RET
CodeSeg ENDS
END START
谢谢!
答案 0 :(得分:1)
您使用了两个不属于同一API的函数。
int 13h - 啊:42h =>这是一个BIOS功能(IBM / MS Read disk extention)
int 21h - 啊:4Ch =>这是一个DOS函数(处理结束方法)
这个程序无法在任何地方运行!
修改:这是假的。你是对的@ninjalj,我不知道。它在DOS上工作。我的错。谢谢你的纠正。
如果您为WinXP编写代码,那么使用程序集的兴趣不大。如果需要关键部分,请使用C和内联汇编。 可悲的是,我不知道如何使用Win32API读取物理驱动器,但我已经看到它在somwhere,所以我猜到它可能......
答案 1 :(得分:1)
扇区是512(0x200)字节,如果要将其写入de数据段,则必须生成至少512字节长的块。否则,您将覆盖您尝试执行的CODE / DATA。