回 帖 发 新 帖 刷新版面

主题:读取硬盘主引导区,保存恢复CMOS的源程序

启动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 楼

拜托,三更半夜大喊三声你跳出来吓人干吗?还不早点睡觉?

12 楼

但是,我问你AH=0还能读一个扇区吗,你还没回答我呢老莫

13 楼

应该是不对的,
应该AH=2的时候才是读,但偏偏是
AH=2
AL=1
就死机。

14 楼

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 楼

我不知道,你去翻翻汇编的书看看系统中断吧。

16 楼

我是阿文;

中断方面确实在QB 7.1上有问题,很晕啊

AX是中断调用的关键,当是AX=201时是读一个扇区,读两个扇区就是AX=202

而写的中断调用是AX=301,写两个扇区是AX=302,

------------------------------------------------------------------

另外在扩展INT 13中断中又是不一样的,AX =4200为读扇区
                                    AX =4300为写扇区
                                    AX =4800O获得硬盘的容量

17 楼

程序的思路没有错,只是qb71中把中断调用方式改了,我也写了qb71中的扩展INT13的调用.但是现在在外面搞工程,很少时间研究了,等有机会放上来


.......这么老的帖子竟然有人看

18 楼

等待啊,早点可以中断,而且还是扩展中断呢

19 楼

啊。。。。qb45我的偶像。終于出現啦

20 楼

buff$ = SPACE$(512) '设置磁盘缓冲区
bx = SADD(buff$)   '获得缓冲区的偏移地址
es = VARSEG(buff$) '获得缓冲区的段址
在QB7.1和VBDOS里运行会出错,出错的语句是这个es = VARSEG(buff$) '获得缓冲区的段址
获取段地址应该用SSEG
所以应该改成es = SSEG(buff$) '获得缓冲区的段址
这样就可以了!

我来回复

您尚未登录,请登录后再回复。点此登录或注册