汇编问题新手
有没有有人学过汇编(3)查看内存中的内容。PC机主板上的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个生产日期并试图改变它,视频上是先d fff0:0 ff然后修改e ffff:05为什么是ffff:05呀?左边不是从fff0:00f0吗? 本帖最后由 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:0000EF 49 F5 65 F0 4D F8 41-F8 59 EC 39 E7 59 F8 2E .I.e.M.A.Y.9.Y..
FFF0:0010E8 D2 EF 57 FF F2 E6 6E-FE 53 FF 53 FF A4 F0 C7 ...W...n.S.S....
FFF0:0020EF 00 00 24 F2 31 F6 9F-11 9F 11 9F 11 B6 A3 9F ...$.1..........
FFF0:003011 52 F5 E9 25 F6 E8 F0-EE CB 50 B0 00 E6 43 E6 .R..%.....P...C.
FFF0:0040ED E4 40 E6 ED 8A E0 E4-40 86 C4 8B F8 58 C3 00 ..@.....@....X..
FFF0:005000 00 00 CF E9 AD ED E9-D4 9E E9 CC 9E 50 56 2E .............PV.
FFF0:006003 36 A8 FE 2E 8B 34 2E-03 36 A8 FE B4 0E 2E AC .6....4..6......
FFF0:00700A C0 74 04 CD 10 EB F6-5E 58 C3 FA B4 0B E8 1C ..t.....^X......
-d
FFF0:00803E 24 57 E8 20 3E CB 00-FF E7 50 41 54 43 48 31 >$W. >....PATCH1
FFF0:009000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
FFF0:00A000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
FFF0:00B0FF E7 50 41 54 43 48 32-00 00 00 00 00 00 00 00 ..PATCH2........
FFF0:00C000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
FFF0:00D000 00 00 00 00 00 00 00-00 00 00 00 00 EB 08 00 ................
FFF0:00E0BF 00 00 00 E9 75 BA E8-89 FE CB 00 00 00 00 00 .....u..........
FFF0:00F0EA 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,与我们看到的地址一致
下面再尝试修改这个日期
-e fff0:f5 '19/11/08'
我们试图把原来的日期修改为 '19/11/08' 也就是今天的日期,Debug 没有给出任何回馈信息。
下面查看修改效果
-d fff0:f0 l10
FFF0:00F0EA 5B E0 00 F0 30 34 2F-31 34 2F 31 31 00 FC 29 .[...04/14/11..)
我们看到,结果并非如我们所愿,什么都未能修改。因为这段内存属于 ROM,是只读的,不可更改。
明白了
20 位内存地址 = 段地址 x 10H + 偏移这个是这样吗不是都是应该是物理地址=段地址X16+偏移地址吗 大佬。这个只能是逆推出这个值所出的内存?
老韭菜A 发表于 2019-8-11 13:30
明白了
20 位内存地址 = 段地址 x 10H + 偏移这个是这样吗不是都是应该是物理地址=段地址X16+偏移地址 ...
一回事,十六进制的 10 用 10H 表达,就是十进制的 16。
楼主,如果回复对你有所帮助别忘记要设置最佳答案,不要让别人的辛苦白费! jackz007 发表于 2019-8-11 22:31
一回事,十六进制的 10 用 10H 表达,就是十进制的 16。
楼主,如果回复对你有所帮助别忘 ...
他是把16进制和10进制混着乘了。
页:
[1]