本帖最后由 jackz007 于 2019-8-11 12:21 编辑
首先要明白,8086 架构的 CPU 采用 20 位地址总线,而 CPU 字长却是 16 位的,这就产生一个问题,一个16 位的字无法表示一个 20 位的内存地址,于是,才有了使用 段:偏移进行表达的方式。即便这样,我们还是应该明白,每一个用 段:偏移 方式表达的内存地址其实是一个 20 位的地址。计算公式是: 20 位内存地址 = 段地址 x 10H + 偏移
例如,1234:0000、1230:0040、1200:0340、1000:2340 等表达的都是同一个内存地址 12340,也就是说,同一个内存地址可以用不同的段:偏移组合来进行表达。
内存地址 FFF00H~FFFFF 实际上是 20 位地址体系(容量:1 MB)中最后 100H(十进制 256)字节空间,这个范围如果用段:偏移的方式进行表达,那就是 fff0:0000 ~ fff0:00ff。
下面,用 Debug 来查看这段内存-d fff0:0
FFF0:0000 EF 49 F5 65 F0 4D F8 41-F8 59 EC 39 E7 59 F8 2E .I.e.M.A.Y.9.Y..
FFF0:0010 E8 D2 EF 57 FF F2 E6 6E-FE 53 FF 53 FF A4 F0 C7 ...W...n.S.S....
FFF0:0020 EF 00 00 24 F2 31 F6 9F-11 9F 11 9F 11 B6 A3 9F ...$.1..........
FFF0:0030 11 52 F5 E9 25 F6 E8 F0-EE CB 50 B0 00 E6 43 E6 .R..%.....P...C.
FFF0:0040 ED E4 40 E6 ED 8A E0 E4-40 86 C4 8B F8 58 C3 00 ..@.....@....X..
FFF0:0050 00 00 00 CF E9 AD ED E9-D4 9E E9 CC 9E 50 56 2E .............PV.
FFF0:0060 03 36 A8 FE 2E 8B 34 2E-03 36 A8 FE B4 0E 2E AC .6....4..6......
FFF0:0070 0A C0 74 04 CD 10 EB F6-5E 58 C3 FA B4 0B E8 1C ..t.....^X......
-d
FFF0:0080 3E 24 57 E8 20 3E CB 00-FF E7 50 41 54 43 48 31 >$W. >....PATCH1
FFF0:0090 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
FFF0:00A0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
FFF0:00B0 FF E7 50 41 54 43 48 32-00 00 00 00 00 00 00 00 ..PATCH2........
FFF0:00C0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
FFF0:00D0 00 00 00 00 00 00 00 00-00 00 00 00 00 EB 08 00 ................
FFF0:00E0 BF 00 00 00 E9 75 BA E8-89 FE CB 00 00 00 00 00 .....u..........
FFF0:00F0 EA 5B E0 00 F0 30 34 2F-31 34 2F 31 31 00 FC 29 .[...04/14/11..)
我们看到,在从 fff0:00f5 开始的内存确实有一个日期,这个日期是 04/14/11,也就是 2004-11-14
下面,我们用命令来搜索这个日期-s fff0:0 l100 '04/14/11'
FFF0:00F5
debug 回应的地址是 FFF0:00F5,与我们看到的地址一致
下面再尝试修改这个日期 我们试图把原来的日期修改为 '19/11/08' 也就是今天的日期,Debug 没有给出任何回馈信息。
下面查看修改效果-d fff0:f0 l10
FFF0:00F0 EA 5B E0 00 F0 30 34 2F-31 34 2F 31 31 00 FC 29 .[...04/14/11..)
我们看到,结果并非如我们所愿,什么都未能修改。因为这段内存属于 ROM,是只读的,不可更改。
|