主题:读取硬盘主引导区,保存恢复CMOS的源程序
qb45
[专家分:2880] 发布于 2004-01-12 22:55:00
启动QB请加参数 如:QB/L 这样你的程序可以支持中断调用
读取硬盘主引导区:
'$INCLUDE: 'qb.bi'
DIM SHARED ax, bx, cx, dx, es
buff$ = SPACE$(512) '设置磁盘缓冲区
bx = SADD(buff$) '获得缓冲区的偏移地址
es = VARSEG(buff$) '获得缓冲区的段址
OPEN "savehd.dat" FOR BINARY AS #1
ax = &H201
cx = 1
dx = &H80
int13 ' 调用13号中断
PUT #1, , buff$
CLOSE #1
PRINT "硬盘主引导区已被成功的保存到SAVEHD.DAT文件中!"
END
SUB int13
DIM InRegs AS RegTypeX
DIM OutRegs AS RegTypeX
InRegs.ax = ax
InRegs.bx = bx
InRegs.cx = cx
InRegs.dx = dx
InRegs.es = es
INTERRUPTX &H13, InRegs, OutRegs
ax = OutRegs.ax
bx = OutRegs.bx
cx = OutRegs.cx
dx = OutRegs.dx
es = OutRegs.es
END SUB
此程序用qb4.5编写通过!
回复列表 (共20个回复)
11 楼
moz [专家分:37620] 发布于 2008-06-07 02:38:00
拜托,三更半夜大喊三声你跳出来吓人干吗?还不早点睡觉?
12 楼
我是大喊三 [专家分:3010] 发布于 2008-06-07 08:45:00
但是,我问你AH=0还能读一个扇区吗,你还没回答我呢老莫
13 楼
moz [专家分:37620] 发布于 2008-06-07 10:10:00
应该是不对的,
应该AH=2的时候才是读,但偏偏是
AH=2
AL=1
就死机。
14 楼
我是大喊三 [专家分:3010] 发布于 2008-06-07 18:30:00
ROM 中断 INT 13
B.硬盘机I/O调用
入口: AH =0-3, DL =驱动器号(硬盘80H,81H), 80=C, 81=D
DH =头号(硬盘0-15), CH =道号(0-1023), CL =起始扇区号(1-17)
AL =欲读写扇区数, ES:BX =内存缓冲区首址.
返回: AL =实际读入扇区数,AH =磁盘状态; 进位标志CF =0,出错; =1,成功
--------------------
ax = 1 '调用磁盘读中断,直接读一个扇区
--------------------
ax=1是直接读一个扇区,那我要写一个扇区咋办,ax=2?
15 楼
moz [专家分:37620] 发布于 2008-06-07 19:11:00
我不知道,你去翻翻汇编的书看看系统中断吧。
16 楼
TengLong [专家分:0] 发布于 2008-06-09 23:10:00
我是阿文;
中断方面确实在QB 7.1上有问题,很晕啊
AX是中断调用的关键,当是AX=201时是读一个扇区,读两个扇区就是AX=202
而写的中断调用是AX=301,写两个扇区是AX=302,
------------------------------------------------------------------
另外在扩展INT 13中断中又是不一样的,AX =4200为读扇区
AX =4300为写扇区
AX =4800O获得硬盘的容量
17 楼
qb45 [专家分:2880] 发布于 2008-06-24 23:23:00
程序的思路没有错,只是qb71中把中断调用方式改了,我也写了qb71中的扩展INT13的调用.但是现在在外面搞工程,很少时间研究了,等有机会放上来
.......这么老的帖子竟然有人看
18 楼
TengLong [专家分:0] 发布于 2008-06-26 23:49:00
等待啊,早点可以中断,而且还是扩展中断呢
19 楼
lingluoz [专家分:110] 发布于 2008-07-28 16:26:00
啊。。。。qb45我的偶像。終于出現啦
20 楼
qb45 [专家分:2880] 发布于 2008-08-28 12:24:00
buff$ = SPACE$(512) '设置磁盘缓冲区
bx = SADD(buff$) '获得缓冲区的偏移地址
es = VARSEG(buff$) '获得缓冲区的段址
在QB7.1和VBDOS里运行会出错,出错的语句是这个es = VARSEG(buff$) '获得缓冲区的段址
获取段地址应该用SSEG
所以应该改成es = SSEG(buff$) '获得缓冲区的段址
这样就可以了!
我来回复