(十)保护模式下的栈

76         ;以下用简单的示例来帮助阐述32位保护模式下的堆栈操作
77 mov cx,00000000000_11_000B ;加载堆栈段选择子
78 mov ss,cx
79 mov esp,0x7c00

第77~79行用来初始保护模式下的栈。栈段描述符是GDT中第3个(从0开始数)描述符,这个描述符的线性基地址是0x0000_0000,段界限是0x0000_7a00,粒度是字节,B=1,属于可读可写、向下扩展的数据段。

我在博文数据段描述符和代码段描述符(一)——《x86汇编语言:从实模式到保护模式》读书笔记10中已经说过,

对于向上扩展的段(E=0),逻辑地址中的偏移值范围可以从0到(界限值*粒度);

对于向下扩展的段(E=1),逻辑地址中的偏移范围可以从(界限值*粒度)到0xFFFF(当B=0时)或者0xFFFF_FFFF(当B=1时)。

所以,对于描述符中的栈段,偏移范围是0x0000_7a00~0xffff_ffff. 仔细琢磨一下,这和我们的想法不是那么一致,因为代码79行,令ESP的初值是0x7c00,也就是说,我们本打算定义一个偏移范围是0x0000_7a00~0x0000_7c00的栈段。

因为线性基地址是0x0000_0000,也就是说描述符定义的栈段,实际可以访问的物理空间是0x0000_7a00~0xffff_ffff,但是我们却希望这个栈可以访问的物理空间是0x0000_7a00~0x0000_7c00。示意图(根据原书的图11-14改编而成)如下图所示。虽然这个栈不完美,但是不用担心,我们会在后面的学习中用更好的方法来创建栈。

(十一)验证32位下的栈操作

隐式的栈操作(如push、pop、call、ret、iret等)涉及两个段,一个是指令所在的代码段,一个是栈段。之前的博文我们说过,对于可执行代码段,

D=1:默认是32位地址和32位或8位的操作数

D=0:默认是16位地址和16位或8位的操作数

注意:指令前缀0x66可以用来选择非默认值的操作数大小;前缀0x67可以用来选择非默认值的地址大小

对于栈段,

B=1:栈指针使用ESP

B=0:栈指针使用SP

就本文的实验代码,其代码段描述符的D位是1,其栈段描述符的B位也是1. 所以,当进行隐式的栈操作时,默认是32位操作数(比如压栈的时候,压入的是双字),且用ESP进行操作。

所以,下面的代码就用来验证这个事实。

81         mov ebp,esp                        ;保存堆栈指针
82 push byte '.' ;压入立即数(字节)
83
84 sub ebp,4
85 cmp ebp,esp ;判断压入立即数时,ESP是否减4
86 jnz ghalt
87 pop eax
88 mov [0x1e],al ;显示句点
89
90 ghalt:
91 hlt ;已经禁止中断,将不会被唤醒

在阅读这段代码的时候,我多少有点怀疑:书上说的到底是不是真的?我想通过实践来检验:探究一下PUSH指令在16位模式和32位模式下的执行规律。经过一番折腾,终于有了结果。请参考我的博文 
16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16

第81行,复制esp的值给ebp;第82行,压入一个字节(byte关键字不能省略);理论上,把ebp的值减去4后(第84行),应该和此时esp的值相等。为了证明这一点,第85行比较ebp和esp的值,如果不相等,就跳转到91行执行停机指令;如果相等,就把字符“.”显示在之前的字符串后面。

OK,第11章的内容已经学习完了。最后我们看一下代码的运行结果吧,结果就是在屏幕的左上角显示“Protect mode OK.”

(完)

进入保护模式(三)——《x86汇编语言:从实模式到保护模式》读书笔记17的更多相关文章

  1. ASM:《X86汇编语言-从实模式到保护模式》第14章:保护模式下的特权保护和任务概述

    ★PART1:32位保护模式下任务的隔离和特权级保护  这一章是全书的重点之一,这一张必须要理解特权级(包括CPL,RPL和DPL的含义)是什么,调用门的使用,还有LDT和TSS的工作原理(15章着重 ...

  2. ASM:《X86汇编语言-从实模式到保护模式》第10章:32位x86处理器的编程架构

    ★PART1:32位的x86处理器执行方式和架构 1. 寄存器的拓展(IA-32) 从80386开始,处理器内的寄存器从16位拓展到32位,命名其实就是在前面加上e(Extend)就好了,8个通用寄存 ...

  3. ASM:《X86汇编语言-从实模式到保护模式》第11章:进入保护模式

    ★PART1:进入保护模式 1. 全局描述符表(Global Descriptor Table,GDT)        32位保护模式下,如果要使用一个段,必须先登记,登记的信息包括段的起始地址,段的 ...

  4. ASM:《X86汇编语言-从实模式到保护模式》第15章:任务切换

    15章其实应该是和14章相辅相成的(感觉应该是作者觉得14章内容太多了然后切出来了一点).任务切换和14章的某些概念是分不开的. ★PART1:任务门与任务切换的方法 1. 任务管理程序 14章的时候 ...

  5. ASM:《X86汇编语言-从实模式到保护模式》第8章:实模式下硬盘的访问,程序重定位和加载

        第八章是一个非常重要的章节,讲述的是实模式下对硬件的访问(这一节主要讲的是硬盘),还有用户程序重定位的问题.现在整理出来刚好能和保护模式下的用户程序定位作一个对比. ★PART1:用户程序的重 ...

  6. ASM:《X86汇编语言-从实模式到保护模式》第9章:实模式下中断机制和实时时钟

    中断是处理器一个非常重要的工作机制.第9章是讲中断在实模式下如何工作,第17章是讲中断在保护模式下如何工作. ★PART1:外部硬件中断 外部硬件中断是通过两个信号线引入处理器内部的,这两条线分别叫N ...

  7. ASM:《X86汇编语言-从实模式到保护模式》第16章:Intel处理器的分页机制和动态页面分配

    第16章讲的是分页机制和动态页面分配的问题,说实话这个一开始接触是会把人绕晕的,但是这个的确太重要了,有了分页机制内存管理就变得很简单,而且能直接实现平坦模式. ★PART1:Intel X86基础分 ...

  8. ASM:《X86汇编语言-从实模式到保护模式》第17章:保护模式下中断和异常的处理与抢占式多任务

    ★PART1:中断和异常概述 1. 中断(Interrupt) 中断包括硬件中断和软中断.硬件中断是由外围设备发出的中断信号引发的,以请求处理器提供服务.当I/O接口发出中断请求的时候,会被像8259 ...

  9. ASM:《X86汇编语言-从实模式到保护模式》第13章:保护模式下内核的加载,程序的动态加载和执行

    ★PART1:32位保护模式下内核简易模型 1. 内核的结构,功能和加载 每个内核的主引导程序都会有所不同,因为内核都会有不同的结构.有时候主引导程序的一些段和内核段是可以共用的(事实上加载完内核以后 ...

随机推荐

  1. vs2008编译opencv,不能copy CMakeVSMacros2.vsmacros

    由于学习opencv,要查看源码文件,所以要先对opencv进行编译,可悲的是出错了 “不能copy   CMakeVSMacros2.vsmacros” 通过上网查找资料,之所以出现这种情况,是因为 ...

  2. sudo -s/sodo -i/su root

    sudo : 暂时切换到超级用户模式以执行超级用户权限,提示输入密码时该密码为当前用户的密码,而不是超级账户的密码.不过有时间限制,Ubuntu默认为一次时长15分钟.su : 切换到某某用户模式,提 ...

  3. 《html5 从入门到精通》读书笔记(二)

    接着上面继续记录笔记,这次要记的知识点比较多...记录下我认为比较重要的东西. 一.表单属性 1.autocomplete属性 该属性规定form或input域应该拥有自动完成功能. <form ...

  4. RobotFramework关键字返回参数

    业务关键字[登录]返回参数 调用时直接把return的参数值写在业务关键字的最前面,就可以使用关键字的返回值了

  5. c#获取pdf文件页数

    引用命名空间:using iTextSharp.text.pdf; string filePath = Server.MapPath("/upload/123.pdf"); //文 ...

  6. MySQL数据库(四)

    操作数据库表的内容: -- 向表中插入数据:insert into table_name values(now(),'a'); insert into student (id,name,sex) va ...

  7. Win8.1下安装sql server 2008 r2详解

    我是来斗图的,安装了好多次,有一些配置还是不能烂熟于心啊,所以就想起来了米老师那句话,学习是个反复的过程.写个教程吧,很简单但是很实用. 首先打开"setup.exe"出现以下界面 ...

  8. 【FAQ】Could not extract response: no suitable HttpMessageConverter found for respo

    原因: 1:某些必须传入的参数没传 2:返回对象的接收类型不一致

  9. css块元素及内联元素

    块级元素主要有: address , blockquote , center , dir , div , dl , fieldset , form , h1 , h2 , h3 , h4 , h5 , ...

  10. XMPP使用tls 和sasl登录

    转自:http://ycool.com/post/xc98m5k 名词解释 TLS:安全传输层协议 TLS:Transport Layer Security 名词: 安全传输层协议(TLS)用于在两个 ...