荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: samba (木星), 信区: Hacker
标 题: 拷贝心得(2)
发信站: BBS 荔园晨风站 (Thu Sep 9 07:44:11 1999), 转信
磁碟控制卡上的 uPD765A 是整个磁碟作业的核心 ,而 uPD765A 靠著3个
I/O 埠的暂存器与 CPU 沟通 ,这三个暂存器如下 :
&h3F2 : 数位输出暂存器
&h3F4 : 主状态暂存器
&h3F5 : 资料/状态 暂存器
资料传输到磁片时 ,又可分为 DMA 与 非DMA 模式 ,由於与主题无关略过。
uPD765A 磁碟控制卡可下达以下指令 :
┌━━━━━━━━━━━━━━━━━━━━━━━━━━┐
┃ Read Data (读取资料) ┃
┃ Write Data (写入资料) ┃
┃ Read ID (读取 ID) ┃
┃ Format A Track (将磁轨格式化) ┃
┃ Read Deleted Dtat (读取已删除的资料) ┃
┃ Write Delete Data (写入已删除的资料) ┃
┃ Read A Track (读取磁轨) ┃
┃ Seek (找寻磁轨) ┃
┃ Scan EQUAL (扫瞄比对相等) ┃
┃ Scan high or equal (扫瞄大於或等於) ┃
┃ Scan low or equal (扫瞄小於或等於) ┃
┃ Recalibrate (校准磁头 ,磁头回到第零轨) ┃
┃ Sense Interrupt status (感测中断状态) ┃
┃ Sense Driver Status (感测磁碟机状态) ┃
┃ Specify (指定) ┃
└━━━━━━━━━━━━━━━━━━━━━━━━━━┘
┌━━━━━━━━━┐
┃ 3-2 工作方式 ┃
└━━━━━━━━━┘
┌━━━━━┐
┃ CPU ┃
└━━━━━┘
↑
↓
系统汇流排 (SYSTEM BUS)
↑ ↑
↓ ↓ 资料窗 ┌━━━┐
┌━━━━━┐ DRQ ┌━━━━━┐←━━━━━┤ RLL ├┬━ ┬━━┐
┃ ┃←━ ┃ ┃ RD DATA └━━━┘┃ ┃ 磁 ┃
┃ ┃ ┃ ┃←━━━━━━━━━━┘ ┃ 碟 ┃
┃ 8237 ┃DACK ┃ uPD765A ┃━━━━━━━━━━━━→ ┃ 机 ┃
┃ ┃━→ ┃ ┃ WR DATA ┃ 介 ┃
┃DMA 控制器┃ ┃ FDC ┃ 输入控制 ┃ 面 ┃
┃ ┃ ┃ ┃ → ┃ ⊙ ┃
┃ ┃━→ ┃ ┃ → ┴━━┘
└━━━━━┘ TC └━━━━━┘ 输出控制
终结计数
┌━━━━━━━━━━┐
┃ 3-3 中断简介 ┃
└━━━━━━━━━━┘
由於组合高手甚多 ,因此各中断向量便不再介绍 ,只介绍几个与磁碟有
关的功能 ,其它中断请自行查书。
INT 13h
(AH)=0 : 重置磁碟机 ,将磁头拉到 TRACK 0
(AH)=1 : 读入磁碟状态
(AH)=2 : 将指定磁区读入记忆体
(AH)=3 : 将记忆体资料写入磁区
(AH)=4 : 查验磁区
(AH)=5 : 格式化指定磁区
返回代码 (AH or AL 值,以二进位来看)
00000001 传给磁碟机 I/O 指令不正确
00000010 找不到位址标记
00000011 磁片贴有防写
00000100 找不到指定磁区
00001000 DMA 越界
00001001 超过DMA边界(有64K)处存取资料
00010000 CRC 错误
00100000 磁碟机控制卡损坏
01000000 Seek 动作错误
10000000 时间超过而磁碟机仍未动作
INT 1Eh
INT 1E 指向的位址就是磁碟参数表 ,一般指向 0000:522-52C
0000:0522 DF 步进速率
0000:0523 02 表 DMA 传输资料
0000:0524 25 马达起动时等待 25ms
0000:0525 02 N值为2 (512Bytes)
0000:0526 09 可容许最大磁区编
0000:0527 2A 间细(Gap)长度
0000:0528 FF 磁区资料长
0000:0529 50 格式化时的间细长度
0000:052A F6 填入空白磁区的位元值
0000:052B 0F 移动每一轨後等待25ms再读写资料
0000:052C 02 马达起动时间
第四章 程式追踪的动作
┌━━━━━━━━━━━━━━┐
┃ 4-1 DEBUG 的追踪程式功能 ┃
└━━━━━━━━━━━━━━┘
在组合指令中有数百个指令,程式中又有数以万计的指令,到底那里才是
保护的所在地呢,这就要牵扯到 DEBUG 的 TRACE 的功能了。
DEBUG 较常用的指令有 :
"N" = 定义程式名称
"L" = 根据定义的档名作 LOAD 档案
"W" = 根据定义的档名作 SAVE 档案
"U" = 列出程式 (相当於 LIST)
"T" = 执行一个指令码,遇到 CALL 则跳到内部继续执行
"P" = 执行到下一行,遇到 CALL 时则执行完那个 CALL
"G" = 执行程式,又可分成下列几种
"G=<Address>" 不管现在执行到那,直接跳到<Address>
继续执行(不常用)
"G <Address>" 从现在的地方执行到<Address> 後停下来
"G" 从现在的地方执行到结束为止
┌━━━━━━━━━━┐
┃ 4-2 组合指令简介 ┃
└━━━━━━━━━━┘
MOV AA,BB 将 BB 放到 AA 里
CALL 呼叫副程式 (相当於 BASIC 的 GOSUB)
RET 与 RETF 返回程式 (相当於 BASIC 的 RETURN)
CMP XX,YY 比较 XX 与 YY
JZ 若相等则跳跃
JNZ 若不相等则跳跃
JB 若小於则跳跃
JG 若大於则跳跃
JMP 无条件跳跃
J??? (各种跳跃指令)
LOOP 回路
INT XX 类似 CALL 的中断涵数
以後凡是遇到上述指令都停下来查看一下 ,即键入 G<该行号>
兹举例如下(随压缩档内附档案) :
CW.EXE (唯我读尊执行档)
A>DEBUG
-N CW.EXE 请您随时键入 "U" 键看看程式
-L
-G 37
-G 60 ┐ 一个回圈,程式在此打转
-T (JZ 6B) ┃ 为了能继续执行,因此最後一定会跳出此回路
-G 71 ┃ 前面三个条件跳跃不管是否成立都跳不出此回路
-T (JZ 7C) ┃ 因此肯定它一定是在 CS:9C 不成立下跳出
-G 8A ┃ 所以我们可以键入 G 9E(CS:9C的下一行)
-T (JNZ 92) ┃
-G 98 ┃ 如果没有把握只能用试的,或您时间多慢慢追踪程式
-G 9C ┃ 个数圈以後也会跳出。
-T (JZ 58) ┘
-G 9E (回路跳出後继续追踪)
-G 9E (回路跳出後继续追踪)
-G AD ┐
-T ┃ 第二个回路,可能从 "CS:BB JZ CE" 或 "CS:C6 JZ DE" 跳出
-G BB ┃ 於是先假设是 CS:BB ,当您键入 "G CE" 时程式执行了,可见
-T ┃ 假设错误,应该是由 CS:C6 跳出,於是再重新 LOAD ,
-G C6 ┃ 前面已 TRACE 过,故直接键入 G37、T、GFE、T
-T ┘ (因为 RETF 与 IRET、JMP FAR、CALL FAR 指令会改变 CS
段落,故需在此停下後再按"T" ,如 "CS:37 的 RETF" ,
"CS:FE 的 JMP FAR")
-G DE (回路跳出後继续追踪)
-G FE
-T
-G 483
-T
-G 495 \ 从 495 到 4A9 中间有个 "CALL" ,当您执行完此 CALL 竟
-T - "问你密码" ... 表示如杀掉此 CALL 则不会再问你密码了
-G 4A9 / 但以下程式仍稍追一断试试。
-T (JNZ 4AE) --> 如果你密码输入正确,则会跳跃,若错误就不跳,因此
你必须将它改为无条件跳跃 (JMP)
-於是将此两位置 ASCII 码抄下後用 PCTOOLS(Find) 修改後执行看看
结果执行无误 ,此档以後就不再须要输入密码了 !
PS : 1. 在解的过程中一定要拿支笔来记下已追到那儿了 !!
2. CW.EXE 必须再配合其它档才能执行此 Game ,因档案过大
所以未全部压进此档。
--
※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 202.202.37.146]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店