鱼C论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 87|回复: 5

汇编问题新手

[复制链接]
最佳答案
0 
发表于 2019-8-11 09:34:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
有没有有人学过汇编(3)查看内存中的内容。PC机主板上的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个生产日期并试图改变它,
视频上是先d fff0:0 ff然后修改e ffff:05为什么是ffff:05呀?左边不是从fff0:00f0吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
482 
发表于 2019-8-11 12:11:13 | 显示全部楼层
本帖最后由 jackz007 于 2019-8-11 12:21 编辑

      首先要明白,8086 架构的 CPU 采用 20 位地址总线,而 CPU 字长却是 16 位的,这就产生一个问题,一个16 位的字无法表示一个 20 位的内存地址,于是,才有了使用 段:偏移进行表达的方式。即便这样,我们还是应该明白,每一个用 段:偏移 方式表达的内存地址其实是一个 20 位的地址。计算公式是:
  1. 20 位内存地址 = 段地址 x 10H + 偏移
复制代码

      例如,1234:0000、1230:0040、1200:0340、1000:2340 等表达的都是同一个内存地址 12340,也就是说,同一个内存地址可以用不同的段:偏移组合来进行表达。
      内存地址 FFF00H~FFFFF 实际上是 20 位地址体系(容量:1 MB)中最后 100H(十进制 256)字节空间,这个范围如果用段:偏移的方式进行表达,那就是 fff0:0000 ~ fff0:00ff。
      下面,用 Debug 来查看这段内存
  1. -d fff0:0

  2. 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..
  3. FFF0:0010  E8 D2 EF 57 FF F2 E6 6E-FE 53 FF 53 FF A4 F0 C7   ...W...n.S.S....
  4. FFF0:0020  EF 00 00 24 F2 31 F6 9F-11 9F 11 9F 11 B6 A3 9F   ...$.1..........
  5. FFF0:0030  11 52 F5 E9 25 F6 E8 F0-EE CB 50 B0 00 E6 43 E6   .R..%.....P...C.
  6. FFF0:0040  ED E4 40 E6 ED 8A E0 E4-40 86 C4 8B F8 58 C3 00   ..@.....@....X..
  7. FFF0:0050  00 00 00 CF E9 AD ED E9-D4 9E E9 CC 9E 50 56 2E   .............PV.
  8. FFF0:0060  03 36 A8 FE 2E 8B 34 2E-03 36 A8 FE B4 0E 2E AC   .6....4..6......
  9. FFF0:0070  0A C0 74 04 CD 10 EB F6-5E 58 C3 FA B4 0B E8 1C   ..t.....^X......
  10. -d

  11. FFF0:0080  3E 24 57 E8 20 3E CB 00-FF E7 50 41 54 43 48 31   >$W. >....PATCH1
  12. FFF0:0090  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
  13. FFF0:00A0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
  14. FFF0:00B0  FF E7 50 41 54 43 48 32-00 00 00 00 00 00 00 00   ..PATCH2........
  15. FFF0:00C0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
  16. FFF0:00D0  00 00 00 00 00 00 00 00-00 00 00 00 00 EB 08 00   ................
  17. FFF0:00E0  BF 00 00 00 E9 75 BA E8-89 FE CB 00 00 00 00 00   .....u..........
  18. 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

        下面,我们用命令来搜索这个日期
  1. -s fff0:0 l100 '04/14/11'

  2. FFF0:00F5
复制代码

        debug 回应的地址是 FFF0:00F5,与我们看到的地址一致

        下面再尝试修改这个日期
  1. -e fff0:f5 '19/11/08'
复制代码

        我们试图把原来的日期修改为 '19/11/08' 也就是今天的日期,Debug 没有给出任何回馈信息。

        下面查看修改效果
  1. -d fff0:f0 l10

  2. FFF0:00F0  EA 5B E0 00 F0 30 34 2F-31 34 2F 31 31 00 FC 29   .[...04/14/11..)
复制代码


        我们看到,结果并非如我们所愿,什么都未能修改。因为这段内存属于 ROM,是只读的,不可更改。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
 楼主| 发表于 2019-8-11 13:30:44 | 显示全部楼层
明白了
20 位内存地址 = 段地址 x 10H + 偏移  这个是这样吗不是都是应该是  物理地址=段地址X16+偏移地址吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
 楼主| 发表于 2019-8-11 13:31:21 | 显示全部楼层
大佬。这个只能是逆推出这个值所出的内存?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
482 
发表于 2019-8-11 22:31:08 | 显示全部楼层
老韭菜A 发表于 2019-8-11 13:30
明白了
20 位内存地址 = 段地址 x 10H + 偏移  这个是这样吗不是都是应该是  物理地址=段地址X16+偏移地址 ...

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

      楼主,如果回复对你有所帮助别忘记要设置最佳答案,不要让别人的辛苦白费!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
1 
发表于 2019-8-13 16:41:14 | 显示全部楼层
jackz007 发表于 2019-8-11 22:31
一回事,十六进制的 10 用 10H 表达,就是十进制的 16。

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

他是把16进制和10进制混着乘了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐上一条 /1 下一条

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号

GMT+8, 2019-8-21 09:05

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表