有关汇编的 int 13h (ah = 42h) 中断的问题

码师 2011-06-07 12:20:37
首先谢谢大家来看我的问题。我想做一个能够读取磁盘主分区信息的程序,查了几天的资料,决定用 int 13h (ah = 42h) 中断来读取第一个硬盘的第一个扇区的信息。但是在中断调用后,CF 标记为 1, ah 也成了 1, 查了一下文档,说是失败的标志……

我是在 Windows 7 64bit 下用 VMWare 虚拟机里的 Windows XP 写的,代码有点啰嗦,抱歉……


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


祝大家昨天端午快乐~!
...全文
436 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
码师 2011-06-07
  • 打赏
  • 举报
回复
谢谢各位,我在虚拟机里用纯 DOS 试了一下,是成功了的。现在还没学到在汇编里调用 Win32 API, 稍后我再去查吧。结贴啦~。
cxdzxc 2011-06-07
  • 打赏
  • 举报
回复
给你试试这个吧:
HANDLE   hDrive   =   CreateFile(   _T( "\\\\.\\PHYSICALDRIVE0 "),   FILE_ALL_ACCESS,FILE_SHARE_READ   |   FILE_SHARE_WRITE,   NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL  );
BYTE   pBuf[512];
DWORD   dwRead;
ReadFile(hDrive,   pBuf,   512,  &dwRead,NULL);
CloseHandle(   hDrive   );
读出后存放在pBuf
cxdzxc 2011-06-07
  • 打赏
  • 举报
回复
可以用CreateFile(win系统api,用法自己google)打开物理硬盘直接读写。
WJN92 2011-06-07
  • 打赏
  • 举报
回复
windows下面 int13是不能用的
int13是bios的中断,windows启动的时候会加载驱动
在windows下,除了驱动,没有其他正规方式来直接控制硬件

码师 2011-06-07
  • 打赏
  • 举报
回复
谢谢~ 那么,我如何用汇编在 Windows 的 CMD 里读取到磁盘第一个扇区的信息呢?有没有这种可行性?……
cxdzxc 2011-06-07
  • 打赏
  • 举报
回复
你可以在虚拟机里装个dos再试试
cxdzxc 2011-06-07
  • 打赏
  • 举报
回复
代码没看,但是操作磁盘必须在纯实模式下才能用,在虚拟机的xp的cmp环境下操作磁盘是非法的

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧