中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: [问题]硬盘主引导的备份 上一主题 | 下一主题
pcuser80
初级用户




积分 136
发帖 50
注册 2006-9-8
状态 离线
『楼 主』:  [问题]硬盘主引导的备份

我用DOS联盟的文章讲述的方法备份硬盘主引导,输入如下:
debug
mov ax,201
mov bx,200
mov cx,1
mov dx,80
int 13
int 3
-g=100
-r=cx
cx 0001:200
-n boot.zyd
-w 200
-q

在-w 200这一行出了问题
系统显示"write 2000200 bytes, D盘没有足够的空间",换C盘也是如此
然后我只输入w后面不加参数,之后得到一个32Mbyte大小的文件
这是主引导文件吗?

ps:我是在WINDOWS XP下用grub for DOS 0。96 加载DOS71启动软盘镜像,在这个DOS环境下进行的以上操作

2006-10-12 23:39
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
beiyuly
初级用户





积分 95
发帖 40
注册 2006-10-8
状态 离线
『第 2 楼』:  

代码明显错误.



http://beiyu.bokee.com
2006-10-13 21:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
beiyuly
初级用户





积分 95
发帖 40
注册 2006-10-8
状态 离线
『第 3 楼』:  

看看我得代码,
可以参考一下


http://www.cn-dos.net/forum/view ... ge=1&highlight=



http://beiyu.bokee.com
2006-10-13 21:10
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
GOTOmsdos
铂金会员

C++启程者


积分 5154
发帖 1827
注册 2003-7-18
状态 离线
『第 4 楼』:  

cx 应该是200才对

2006-10-13 22:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
DOS95
初级用户





积分 112
发帖 49
注册 2006-9-23
状态 离线
『第 5 楼』:  

你运行后 BX的值变成200了,W 命令写文件时标示文件大小的高位寄存器就放在 BX时,CX放的是低位值,当然就不对了。

所以 G 后要这样
r bx
bx XXXX:0200
0
r cx
cx XXXX:0001
200

另外,MBR 放在从 XXXX:0200 开始后 200bit ,而 W 时是从 XXXX:0100 开始计算的,要算好大小哦。

2006-10-14 23:49
查看资料  发短消息 网志   编辑帖子  回复  引用回复
DOS95
初级用户





积分 112
发帖 49
注册 2006-9-23
状态 离线
『第 6 楼』:  所以,最后要这样

-a
mov ax,201
mov bx,200
mov cx,1
mov dx,80
int 13
int 3
-g
-r bx
0
-r cx
200
-r ds
ds+10 (注意这里,DS+10 就相当于原来的 DS:200 变成 DS:100,如果原来的 DS 是 1234,现在把它改成 1244,即 1234+10)
-n boot.dat
-w
-q

这样就生成了一个 512 字节的 MBR 文件。

2006-10-14 23:57
查看资料  发短消息 网志   编辑帖子  回复  引用回复
beiyuly
初级用户





积分 95
发帖 40
注册 2006-10-8
状态 离线
『第 7 楼』:  

mov ax,201


这条语句错误了。


你好好看看int13的资料吧。



;┌─────────────────────────────────┐
;│BIOS 呼叫 INT 13H,AH=01H                                         │
;│讀取磁碟機狀態                                                    │
;│? (DL) <= 磁碟機代號 (A:00H,B:01H,C:80H,D:81H)                │
;│成功 => (C=0),(失敗 C=1,示誤碼如下)                             │
;│      AH=00H:成功                 AH=0AH:硬碟的磁區損壞           │
;│      AH=01H:不合法的磁碟機命令   AH=0BH:硬碟的磁軌損壞           │
;│      AH=02H:磁區損壞或位址欄有誤 AH=0CH:存取不存在的磁軌         │
;│      AH=03H:防寫貼紙未撕         AH=10H:CRC/ECC錯誤              │
;│      AH=04H:找不到指定的磁區     AH=11H:資料讀取錯誤,使用ECC校正│
;│      AH=05H:硬碟重置錯誤         AH=20H:磁碟控制器失誤           │
;│      AH=06H:不是原來的磁片       AH=40H:尋找磁軌錯誤             │
;│      AH=07H:硬碟參數錯誤         AH=80H:floppy disk drive 未備妥 │
;│      AH=08H:DMA 忙碌中           AH=AAH:hard disk drive 未備妥   │
;│      AH=09H:DMA搬動記憶區越過64K AH=BBH:所指定的磁碟機找不到     │
;│註:CRC為循環重複檢查檢,用來偵測磁碟上資料是否有誤                │
;│   ECC為錯誤校正碼,是用來偵測並校正磁碟上的資料是否有誤,ECC具有 │
;│   自動校正錯誤功能,而且只有硬碟才有ECC                          │
;└─────────────────────────────────┘
;┌─────────────────────────────────┐
;│BIOS 呼叫 INT 13H,AH=02H                                         │
;│讀取磁區資料                                                      │
;│? (DL) <= 磁碟機代號 (A:00H,B:01H,C:80H,D:81H)                │
;│? (AL) <= 欲讀取的磁區數                                         │
;│? (CH) <= 磁軌號碼,從 0 開始,高 2 bit 可存於 cl 的 b6、b7      │
;│? (CL) <= 起始磁區編號,從 1 開始                                │
;│? (DH) <= 磁頭號碼,從 0 開始                                    │
;│? (ES:BX) <= 欲儲存資料的緩衝區記憶體變數                        │
;│成功 => (C=0),(AL=真正讀到的磁區數)                              │
;│      AH=00H:成功                 AH=0AH:硬碟的磁區損壞           │
;│      AH=01H:不合法的磁碟機命令   AH=0BH:硬碟的磁軌損壞           │
;│      AH=02H:磁區損壞或位址欄有誤 AH=0CH:存取不存在的磁軌         │
;│      AH=03H:防寫貼紙未撕         AH=10H:CRC/ECC錯誤              │
;│      AH=04H:找不到指定的磁區     AH=11H:資料讀取錯誤,使用ECC校正│
;│      AH=05H:硬碟重置錯誤         AH=20H:磁碟控制器失誤           │
;│      AH=06H:不是原來的磁片       AH=40H:尋找磁軌錯誤             │
;│      AH=07H:硬碟參數錯誤         AH=80H:floppy disk drive 未備妥 │
;│      AH=08H:DMA 忙碌中           AH=AAH:hard disk drive 未備妥   │
;│      AH=09H:DMA搬動記憶區越過64K AH=BBH:所指定的磁碟機找不到     │
;│註:CRC為循環重複檢查檢,用來偵測磁碟上資料是否有誤                │
;│   ECC為錯誤校正碼,是用來偵測並校正磁碟上的資料是否有誤,ECC具有 │
;│   自動校正錯誤功能,而且只有硬碟才有ECC                          │
;└─────────────────────────────────┘
;┌─────────────────────────────────┐
;│BIOS 呼叫 INT 13H,AH=03H                                         │
;│寫資料到磁區內                                                    │
;│? (DL) <= 磁碟機代號 (A:00H,B:01H,C:80H,D:81H)                │
;│? (AL) <= 欲寫入的磁區數                                         │
;│? (CH) <= 磁軌號碼,從 0 開始,高 2 bit 可存於 cl 的 b6、b7      │
;│? (CL) <= 起始磁區編號,從 1 開始                                │
;│? (DH) <= 磁頭號碼,從 0 開始                                    │
;│? (ES:BX) <= 已儲存資料的緩衝區記憶體變數                        │
;│成功 => (C=0),(AL=真正寫入的磁區數)                              │
;│      AH=00H:成功                 AH=0AH:硬碟的磁區損壞           │
;│      AH=01H:不合法的磁碟機命令   AH=0BH:硬碟的磁軌損壞           │
;│      AH=02H:磁區損壞或位址欄有誤 AH=0CH:存取不存在的磁軌         │
;│      AH=03H:防寫貼紙未撕         AH=10H:CRC/ECC錯誤              │
;│      AH=04H:找不到指定的磁區     AH=11H:資料讀取錯誤,使用ECC校正│
;│      AH=05H:硬碟重置錯誤         AH=20H:磁碟控制器失誤           │
;│      AH=06H:不是原來的磁片       AH=40H:尋找磁軌錯誤             │
;│      AH=07H:硬碟參數錯誤         AH=80H:floppy disk drive 未備妥 │
;│      AH=08H:DMA 忙碌中           AH=AAH:hard disk drive 未備妥   │
;│      AH=09H:DMA搬動記憶區越過64K AH=BBH:所指定的磁碟機找不到     │
;│註:CRC為循環重複檢查檢,用來偵測磁碟上資料是否有誤                │
;│   ECC為錯誤校正碼,是用來偵測並校正磁碟上的資料是否有誤,ECC具有 │
;│   自動校正錯誤功能,而且只有硬碟才有ECC                          │
;└─────────────────────────────────┘
;┌─────────────────────────────────┐
;│BIOS 呼叫 INT 13H,AH=04H                                         │
;│檢查磁區結構是否完好                                              │
;│? (DL) <= 磁碟機代號 (A:00H,B:01H,C:80H,D:81H)                │
;│? (AL) <= 欲檢查的磁區數                                         │
;│? (CH) <= 磁軌號碼,從 0 開始,高 2 bit 可存於 cl 的 b6、b7      │
;│? (CL) <= 起始磁區編號,從 1 開始                                │
;│? (DH) <= 磁頭號碼,從 0 開始                                    │
;│成功 => (C=0),(失敗 C=1,示誤碼如下)                             │
;│      AH=00H:成功                 AH=0AH:硬碟的磁區損壞           │
;│      AH=01H:不合法的磁碟機命令   AH=0BH:硬碟的磁軌損壞           │
;│      AH=02H:磁區損壞或位址欄有誤 AH=0CH:存取不存在的磁軌         │
;│      AH=03H:防寫貼紙未撕         AH=10H:CRC/ECC錯誤              │
;│      AH=04H:找不到指定的磁區     AH=11H:資料讀取錯誤,使用ECC校正│
;│      AH=05H:硬碟重置錯誤         AH=20H:磁碟控制器失誤           │
;│      AH=06H:不是原來的磁片       AH=40H:尋找磁軌錯誤             │
;│      AH=07H:硬碟參數錯誤         AH=80H:floppy disk drive 未備妥 │
;│      AH=08H:DMA 忙碌中           AH=AAH:hard disk drive 未備妥   │
;│      AH=09H:DMA搬動記憶區越過64K AH=BBH:所指定的磁碟機找不到     │
;│註:CRC為循環重複檢查檢,用來偵測磁碟上資料是否有誤                │
;│   ECC為錯誤校正碼,是用來偵測並校正磁碟上的資料是否有誤,ECC具有 │
;│   自動校正錯誤功能,而且只有硬碟才有ECC                          │
;└─────────────────────────────────┘
;┌─────────────────────────────────┐
;│BIOS 呼叫 INT 13H,AH=05H                                         │
;│將指定的磁區格式化,以軌為單位                                    │
;│? (DL) <= 磁碟機代號 (A:00H,B:01H,C:80H,D:81H)                │
;│? (CH) <= 磁軌號碼,從 0 開始,高 2 bit 可存於 cl 的 b6、b7      │
;│? (DH) <= 磁頭號碼,從 0 開始                                    │
;│? (ES:BX) <= 指向磁區參數表的記憶體變數,共四 byte,即 CHRN      │
;│磁區參數表:C:磁柱編號(cylinder)   R:磁區編號(Record)              │
;│           H:磁頭編號(head)       N:每磁區的byte數(0:128,1:256   │
;│                                                   2:512,3:1024) │
;│成功 => (C=0),(失敗 C=1,示誤碼如下)                             │
;│      AH=00H:成功                 AH=0AH:硬碟的磁區損壞           │
;│      AH=01H:不合法的磁碟機命令   AH=0BH:硬碟的磁軌損壞           │
;│      AH=02H:磁區損壞或位址欄有誤 AH=0CH:存取不存在的磁軌         │
;│      AH=03H:防寫貼紙未撕         AH=10H:CRC/ECC錯誤              │
;│      AH=04H:找不到指定的磁區     AH=11H:資料讀取錯誤,使用ECC校正│
;│      AH=05H:硬碟重置錯誤         AH=20H:磁碟控制器失誤           │
;│      AH=06H:不是原來的磁片       AH=40H:尋找磁軌錯誤             │
;│      AH=07H:硬碟參數錯誤         AH=80H:floppy disk drive 未備妥 │
;│      AH=08H:DMA 忙碌中           AH=AAH:hard disk drive 未備妥   │
;│      AH=09H:DMA搬動記憶區越過64K AH=BBH:所指定的磁碟機找不到     │
;│註:CRC為循環重複檢查檢,用來偵測磁碟上資料是否有誤                │
;│   ECC為錯誤校正碼,是用來偵測並校正磁碟上的資料是否有誤,ECC具有 │
;│   自動校正錯誤功能,而且只有硬碟才有ECC                          │
;└─────────────────────────────────┘
;┌─────────────────────────────────┐
;│BIOS 呼叫 INT 13H,AH=06H                                         │
;│將指定的磁軌格式化,並設定損壞磁碟                                │
;│? (DL) <= 磁碟機代號 (A:00H,B:01H,C:80H,D:81H)                │
;│? (CH) <= 磁軌號碼,從 0 開始,高 2 bit 可存於 cl 的 b6、b7      │
;│? (CL) <= 起始磁區編號,從 1 開始                                │
;│? (DH) <= 磁頭號碼,從 0 開始                                    │
;│成功 => (C=0),(失敗 C=1,示誤碼如下)                             │
;│      AH=00H:成功                 AH=0AH:硬碟的磁區損壞           │
;│      AH=01H:不合法的磁碟機命令   AH=0BH:硬碟的磁軌損壞           │
;│      AH=02H:磁區損壞或位址欄有誤 AH=0CH:存取不存在的磁軌         │
;│      AH=03H:防寫貼紙未撕         AH=10H:CRC/ECC錯誤              │
;│      AH=04H:找不到指定的磁區     AH=11H:資料讀取錯誤,使用ECC校正│
;│      AH=05H:硬碟重置錯誤         AH=20H:磁碟控制器失誤           │
;│      AH=06H:不是原來的磁片       AH=40H:尋找磁軌錯誤             │
;│      AH=07H:硬碟參數錯誤         AH=80H:floppy disk drive 未備妥 │
;│      AH=08H:DMA 忙碌中           AH=AAH:hard disk drive 未備妥   │
;│      AH=09H:DMA搬動記憶區越過64K AH=BBH:所指定的磁碟機找不到     │
;│註:CRC為循環重複檢查檢,用來偵測磁碟上資料是否有誤                │
;│   ECC為錯誤校正碼,是用來偵測並校正磁碟上的資料是否有誤,ECC具有 │
;│   自動校正錯誤功能,而且只有硬碟才有ECC                          │
;└─────────────────────────────────┘
;┌─────────────────────────────────┐
;│BIOS 呼叫 INT 13H,AH=07H                                         │
;│從指定的磁軌位置,格式化磁片                                      │
;│? (DL) <= 磁碟機代號 (A:00H,B:01H,C:80H,D:81H)                │
;│? (CH) <= 磁軌號碼,從 0 開始,高 2 bit 可存於 cl 的 b6、b7      │
;│? (CL) <= 起始磁區編號,從 1 開始                                │
;│? (DH) <= 磁頭號碼,從 0 開始                                    │
;│成功 => (C=0),(失敗 C=1,示誤碼如下)                             │
;│      AH=00H:成功                 AH=0AH:硬碟的磁區損壞           │
;│      AH=01H:不合法的磁碟機命令   AH=0BH:硬碟的磁軌損壞           │
;│      AH=02H:磁區損壞或位址欄有誤 AH=0CH:存取不存在的磁軌         │
;│      AH=03H:防寫貼紙未撕         AH=10H:CRC/ECC錯誤              │
;│      AH=04H:找不到指定的磁區     AH=11H:資料讀取錯誤,使用ECC校正│
;│      AH=05H:硬碟重置錯誤         AH=20H:磁碟控制器失誤           │
;│      AH=06H:不是原來的磁片       AH=40H:尋找磁軌錯誤             │
;│      AH=07H:硬碟參數錯誤         AH=80H:floppy disk drive 未備妥 │
;│      AH=08H:DMA 忙碌中           AH=AAH:hard disk drive 未備妥   │
;│      AH=09H:DMA搬動記憶區越過64K AH=BBH:所指定的磁碟機找不到     │
;│註:CRC為循環重複檢查檢,用來偵測磁碟上資料是否有誤                │
;│   ECC為錯誤校正碼,是用來偵測並校正磁碟上的資料是否有誤,ECC具有 │
;│   自動校正錯誤功能,而且只有硬碟才有ECC                          │
;└─────────────────────────────────┘
;┌─────────────────────────────────┐
;│BIOS 呼叫 INT 13H,AH=08H                                         │
;│取得磁碟機的磁軌參數                                              │
;│? (DL) <= 磁碟機代號 (A:00H,B:01H,C:80H,D:81H)                │
;│磁面的磁軌數減 1 => (CH) 及 (CL 的 bit6、bit7)                    │
;│磁軌的磁區數 => (CL 的 bit0 ~ bit5)                               │
;│磁面數減 1 => (DH)                                                │
;│磁碟機數量 => (DL)                                                │
;└─────────────────────────────────┘
;┌─────────────────────────────────┐
;│BIOS 呼叫 INT 13H,AH=17H                                         │
;│設定磁碟機型式                                                    │
;│? (DL) <= 磁碟機代號 (A:00H,B:01H)                              │
;│? (AL) <= 磁碟機型式                                             │
;│磁碟機型式:AL=01H:使用 360K 磁碟機,工作 360K 的磁片              │
;│           AL=02H:使用 1.2M 磁碟機,工作 360K 的磁片              │
;│           AL=03H:使用 1.2M 磁碟機,工作 1.2M 的磁片              │
;│           AL=04H:使用 720K 磁碟機,工作 720K 的磁片              │
;│           AL=05H:使用 1.44M 磁碟機,工作 1.44M 的磁片            │
;│成功 => (C=0),(失敗 C=1,示誤碼如下)                             │
;│      AH=00H:成功                 AH=0AH:硬碟的磁區損壞           │
;│      AH=01H:不合法的磁碟機命令   AH=0BH:硬碟的磁軌損壞           │
;│      AH=02H:磁區損壞或位址欄有誤 AH=0CH:存取不存在的磁軌         │
;│      AH=03H:防寫貼紙未撕         AH=10H:CRC/ECC錯誤              │
;│      AH=04H:找不到指定的磁區     AH=11H:資料讀取錯誤,使用ECC校正│
;│      AH=05H:硬碟重置錯誤         AH=20H:磁碟控制器失誤           │
;│      AH=06H:不是原來的磁片       AH=40H:尋找磁軌錯誤             │
;│      AH=07H:硬碟參數錯誤         AH=80H:floppy disk drive 未備妥 │
;│      AH=08H:DMA 忙碌中           AH=AAH:hard disk drive 未備妥   │
;│      AH=09H:DMA搬動記憶區越過64K AH=BBH:所指定的磁碟機找不到     │
;│註:CRC為循環重複檢查檢,用來偵測磁碟上資料是否有誤                │
;│   ECC為錯誤校正碼,是用來偵測並校正磁碟上的資料是否有誤,ECC具有 │
;│   自動校正錯誤功能,而且只有硬碟才有ECC                          │
;└─────────────────────────────────┘



http://beiyu.bokee.com
2006-10-15 02:15
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
DOS95
初级用户





积分 112
发帖 49
注册 2006-9-23
状态 离线
『第 8 楼』:  

你说哪里错?

mov ax,201 ==> mov ah,2 / mov al,1

就是读1个扇区,错在哪?
我自己写的多系统引导程序也是这样用的,没发现有哪里不对。

2006-10-15 15:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
beiyuly
初级用户





积分 95
发帖 40
注册 2006-10-8
状态 离线
『第 9 楼』:  



  Quote:
Originally posted by DOS95 at 2006-10-15 15:37:
你说哪里错?

mov ax,201 ==> mov ah,2 / mov al,1

就是读1个扇区,错在哪?
我自己写的多系统引导程序也是这样用的,没发现有哪里不对。

不好意思,我看错了。

但我想,也许没错,取决于编译器。



http://beiyu.bokee.com
2006-10-17 07:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: