老韭菜A 发表于 2019-8-11 09:34:08

汇编问题新手

有没有有人学过汇编(3)查看内存中的内容。PC机主板上的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个生产日期并试图改变它,
视频上是先d fff0:0 ff然后修改e ffff:05为什么是ffff:05呀?左边不是从fff0:00f0吗?

jackz007 发表于 2019-8-11 12:11:13

本帖最后由 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,是只读的,不可更改。


老韭菜A 发表于 2019-8-11 13:30:44

明白了
20 位内存地址 = 段地址 x 10H + 偏移这个是这样吗不是都是应该是物理地址=段地址X16+偏移地址吗

老韭菜A 发表于 2019-8-11 13:31:21

大佬。这个只能是逆推出这个值所出的内存?

jackz007 发表于 2019-8-11 22:31:08

老韭菜A 发表于 2019-8-11 13:30
明白了
20 位内存地址 = 段地址 x 10H + 偏移这个是这样吗不是都是应该是物理地址=段地址X16+偏移地址 ...

      一回事,十六进制的 10 用 10H 表达,就是十进制的 16。

      楼主,如果回复对你有所帮助别忘记要设置最佳答案,不要让别人的辛苦白费!

yjcoke 发表于 2019-8-13 16:41:14

jackz007 发表于 2019-8-11 22:31
一回事,十六进制的 10 用 10H 表达,就是十进制的 16。

      楼主,如果回复对你有所帮助别忘 ...

他是把16进制和10进制混着乘了。
页: [1]
查看完整版本: 汇编问题新手