zhangleierli
驱动小牛
驱动小牛
  • 注册日期2007-01-31
  • 最后登录2017-05-24
  • 粉丝1
  • 关注0
  • 积分3分
  • 威望158点
  • 贡献值0点
  • 好评度146点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:2007回复:2

懂汇编的来看下求PTE,PDE的算法

楼主#
更多 发布于:2008-01-16 10:13
MOV EAX, ESI
AND EAX, 0xFFFFF3FF
SHR EAX, 0A
SUB EAX, 40000000

MOV EAX, ESI
AND EAX, FFCFFFFF
SHR EAX, 14
SUB EAX,3FD00000

当 ESI 寄存器的值为一个虚地址时,这两段代码分别取得页表项和页目录项。 实际中所用的寄存器可能不同,但模式是一样的。 许多于内存管理相关的代码中都会见到此类代码。起初看上去是有些别扭,但他们都是经过2的补码方法高度优化的。 作为练习,试着弄清楚它是如何工作的。提示:页表被映射的起始点在虚地址 0xC0000000,而页目录的则在 0xC0300000。


以上内容是在undocumented NT里看到了,始终不能理解这段汇编代码的含义,谁能解释下
vancaho
驱动牛犊
驱动牛犊
  • 注册日期2004-04-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分574分
  • 威望100点
  • 贡献值0点
  • 好评度56点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-01-17 12:51
我有,等下传给你
附件名称/大小 下载次数 最后更新
PTECalc.rar (93KB)  17 2008-01-17 12:54
zhangleierli
驱动小牛
驱动小牛
  • 注册日期2007-01-31
  • 最后登录2017-05-24
  • 粉丝1
  • 关注0
  • 积分3分
  • 威望158点
  • 贡献值0点
  • 好评度146点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2008-01-18 13:50
总算是明白了,谢谢二楼的兄弟提供的例子,虽然我还没看。

PTE  =   (VA>>12)*4 + 0xC0000000,
PDE =    (VA>>22)*4 + 0xC0300000,

最上面的汇编没有把VA先右移12,而是右移了10,因为右移12位后又乘了4,就等于只右移了10位;至于后面为什么没有加0xC0000000,而是减了0x40000000,是因为0xC0000000的补码就是0x40000000,计算机做的减法是补码运算。
都是挺简单的东西,自己没有仔细思考。
游客

返回顶部