Assembly 汇编中断问题:int 13h(ah=42h)返回cf=1、ah=1失败
我想用汇编语言写一个程序来读取硬盘的主分区。最近几天我在谷歌上搜索了很多,我发现也许INT13h(ah=42h)适合我。但一开始我失败了。调用INT 13H后,CF设置为1,AH设置为1。从文件中我知道中断失败了 这是我的密码:Assembly 汇编中断问题:int 13h(ah=42h)返回cf=1、ah=1失败,assembly,interrupt,disk,disk-partitioning,Assembly,Interrupt,Disk,Disk Partitioning,我想用汇编语言写一个程序来读取硬盘的主分区。最近几天我在谷歌上搜索了很多,我发现也许INT13h(ah=42h)适合我。但一开始我失败了。调用INT 13H后,CF设置为1,AH设置为1。从文件中我知道中断失败了 这是我的密码: ASSUME CS:CodeSeg, DS:DataSeg, SS:StackSeg DataSeg SEGMENT BSBuffer: ; Abbr for Boot Sector Buffer. MBRecord:
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
谢谢 您使用了两个不属于同一API的函数 int13h-ah:42h=>这是一个BIOS函数(IBM/MS读磁盘扩展) int21h-ah:4Ch=>这是一个DOS函数(进程结束方法) 这个程序不能在任何地方运行 编辑:这是错误的。你说得对,我不知道。这是DOS上的工作。我的错。谢谢你的更正 如果您为WinXP编写代码,那么使用汇编程序的兴趣真的很低。如果您希望用于关键部分,请使用C和内联汇编。
遗憾的是,我不知道如何使用Win32API在物理驱动器上读取数据,但我已经在某些地方见过它,所以我认为它是可能的…一个扇区是512(0x200)字节,如果要将其写入数据段,则必须创建一个至少512字节长的块。否则,您将覆盖您尝试执行的代码/数据。您是否在纯DOS下运行此代码?因为它不会在Windows下运行,所以我没有在纯DOS下运行该代码。我已经在WinXP中运行了该代码。在Windows下,还有其他方法读取磁盘的第一个扇区吗?DOS程序可以(而且经常)使用BIOS服务。BIOS只是DOS中依赖于机器的部分(实际上是CP/M)。