九途长夜 2015-05-13 11:14 采纳率: 0%
浏览 1412

保护模式栈边界的问题

X86汇编语言-从实模式到保护模式 有这样一道题:
当前栈段描述符的B位是1,基地址为0X00700000,界限值为0XFFFE。那么,在32位模式下,该栈段的有效地址范围是0X00700000~( )。当ESP的内容为0XFFFFF002时,还能压入一个双字吗?为什么?当前栈段是向下扩展的。
我的答案是0X00700000+0XFFFFE*0X1000+0XFFF=0X1006FEFFF
去掉溢出位=0X006FEFFF
不过看到第二问时候我就知道我错了。可是书上又说,实际使用的栈段边界就是段内不允许访问的最低端偏移地址,所以又感觉我的是对的。栈段的边界真的搞不懂! 求给出具体的思路,最好带上备注,very thank you!

  • 写回答

1条回答 默认 最新

  • 小布丁的读书笔记 2018-08-19 13:43
    关注

    先计算有效偏移量范围:最小偏移量 ( 0XFFFFE x 0x1000 + 0xFFF) + 1 = 0xFFFFF000,最大偏移量0xFFFFFFFF。
    然后使用段基址加上偏移量:最低物理地址:0X00700000 + 0xFFFFF000 = 0x006FF000,最高物理地址:0x006FFFFF。范围为 [0x006FF000, 0x006FFFFF]或[0x006FF000,0X00700000)。
    当ESP为0xFFFFF002时,压入一个双字(4字节),ESP=ESP-4=0xFFFFF002-4=0xFFFFEFFE。物理地址为=0X00700000+0xFFFFEFFE=0x006FEFFE。0因为x006FEFFE<0x006FF000,所以不能压入一个双字。
    题目中给出段界限是0x0XFFFFE,不是0xFFFE。
    对于栈段来说,实际最低偏移量:B=0时为 描述符中段界限+1;B=1时为 (描述符中段界限x0x1000)+0xFFF+1。

    评论

报告相同问题?

悬赏问题

  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效