进入保护模式(三)——《x86汇编语言:从实模式到保护模式》读书笔记17
(十)保护模式下的栈
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的更多相关文章
- ASM:《X86汇编语言-从实模式到保护模式》第14章:保护模式下的特权保护和任务概述
★PART1:32位保护模式下任务的隔离和特权级保护 这一章是全书的重点之一,这一张必须要理解特权级(包括CPL,RPL和DPL的含义)是什么,调用门的使用,还有LDT和TSS的工作原理(15章着重 ...
- ASM:《X86汇编语言-从实模式到保护模式》第10章:32位x86处理器的编程架构
★PART1:32位的x86处理器执行方式和架构 1. 寄存器的拓展(IA-32) 从80386开始,处理器内的寄存器从16位拓展到32位,命名其实就是在前面加上e(Extend)就好了,8个通用寄存 ...
- ASM:《X86汇编语言-从实模式到保护模式》第11章:进入保护模式
★PART1:进入保护模式 1. 全局描述符表(Global Descriptor Table,GDT) 32位保护模式下,如果要使用一个段,必须先登记,登记的信息包括段的起始地址,段的 ...
- ASM:《X86汇编语言-从实模式到保护模式》第15章:任务切换
15章其实应该是和14章相辅相成的(感觉应该是作者觉得14章内容太多了然后切出来了一点).任务切换和14章的某些概念是分不开的. ★PART1:任务门与任务切换的方法 1. 任务管理程序 14章的时候 ...
- ASM:《X86汇编语言-从实模式到保护模式》第8章:实模式下硬盘的访问,程序重定位和加载
第八章是一个非常重要的章节,讲述的是实模式下对硬件的访问(这一节主要讲的是硬盘),还有用户程序重定位的问题.现在整理出来刚好能和保护模式下的用户程序定位作一个对比. ★PART1:用户程序的重 ...
- ASM:《X86汇编语言-从实模式到保护模式》第9章:实模式下中断机制和实时时钟
中断是处理器一个非常重要的工作机制.第9章是讲中断在实模式下如何工作,第17章是讲中断在保护模式下如何工作. ★PART1:外部硬件中断 外部硬件中断是通过两个信号线引入处理器内部的,这两条线分别叫N ...
- ASM:《X86汇编语言-从实模式到保护模式》第16章:Intel处理器的分页机制和动态页面分配
第16章讲的是分页机制和动态页面分配的问题,说实话这个一开始接触是会把人绕晕的,但是这个的确太重要了,有了分页机制内存管理就变得很简单,而且能直接实现平坦模式. ★PART1:Intel X86基础分 ...
- ASM:《X86汇编语言-从实模式到保护模式》第17章:保护模式下中断和异常的处理与抢占式多任务
★PART1:中断和异常概述 1. 中断(Interrupt) 中断包括硬件中断和软中断.硬件中断是由外围设备发出的中断信号引发的,以请求处理器提供服务.当I/O接口发出中断请求的时候,会被像8259 ...
- ASM:《X86汇编语言-从实模式到保护模式》第13章:保护模式下内核的加载,程序的动态加载和执行
★PART1:32位保护模式下内核简易模型 1. 内核的结构,功能和加载 每个内核的主引导程序都会有所不同,因为内核都会有不同的结构.有时候主引导程序的一些段和内核段是可以共用的(事实上加载完内核以后 ...
随机推荐
- java学习(三)数组
一维数组的定义格式: int[] a; //定义一个int类型的数组a变量 int a[]; //定义一个int类型的a数组变量 初始化一个int类型的数组 int[] arr = new i ...
- 从源码角度看Transaction以及如何手工接管Transaction实现高度的自定义化
一:transaction CUD: 在一个transaction中... transaction: start add.... delete... update... transaction: co ...
- iOS AppStore个人开发者账号申请
一.申请Apple Developer账号 1.注册App ID 1.打开苹果开发者网页,选择Account,注册Apple ID. 2.填写注册信息 3.地区选择China,填写好验证码,点击C ...
- 使用Go客户端访问MongoDB
1.安装MongoDB 1.1 到官网:www.mongodb.org/downloads下载windows最新版本,解压到目标目录下. 1.2 创建数据存储目录 mongodb需要一个数据文件夹来保 ...
- stderr和stdout(printf、fprintf、sprintf)(转)
本文转自:http://www.cnblogs.com/zhangyabin---acm/p/3203745.html 先区分一下:printf,sprintf,fprintf. 1,printf就是 ...
- EF:无法检查模型兼容性,因为数据库不包含模型元数据。
Model compatibility cannot be checked because the database does not contain model metadata. Model ...
- WPF MaterialDesignInXamlToolkit锁屏恢复后页面冻结的问题
在做WPF项目时,用到 MaterialDesignInXamlToolkit 开源项目.结果客户用的时候发现这个问题,锁屏后,界面不刷新. 如果不用MaterialDesign,测试后不会出现这个问 ...
- SystemID
A:BJQUANYONG-B:CCC332322987612323008002DDD A:JHDUJIA-B:CCC1365323754641263423809708001DDD A:GUANGZHO ...
- IoC概要
控制反转基本上说的是功能调用者与功能实现者之间应该如何交互,即二者之间没有直接的强耦合(调用者new一个被调用者),而是都依赖同一个抽象,这个抽象规定了二者交互的接口.反转的意思是实现了依赖倒置,在程 ...
- Chat Order (map映射)
Chat Order Time Limit:3000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit ...