- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Win32程序设计学习笔记win32汇编学习笔记
勿在浮砂筑高台
背景知识 2
窗口程序工作原理 6
开始 15
Unicode简介 19
消息和窗口 25
输出文字 35
图形基础 49
键盘 65
鼠标 72
定时器 78
子窗口控件 81
菜单及其它资源 92
对话框 104
剪贴板 115
位图 125
多重文件界面(MDI) 136
进程和线程 144
动态链接库 156
杂记 163
难句分析 175
本笔记内容有相当一部分取自罗云彬的《Windows环境下32位汇编语言程序设计》(第2版)。
win32汇编学习笔记
背景知识
保护模式下GDTR,LDTR,GDT,LDT和段选择器的关系:
实地址模式下的内存寻址方式采用分段模式,这主要是解决16位寄存存器存放20位的地址而设置的。而在保护模式下,可以使用全部的32根址址线访问4GB大的内存。一个32位的寄存器就可以直接存放一个址址值,不需分段就可以访问到所有的内存地址。那么在保护模式下,段寄存器就没有用了呢?实际上段寄存器更有用了。
虽然在寻址上不再有分段的限制问题,但在保护模式下,一个地址空间是否可以被写入,可以被多少优先级的代码写入,是不是允许执行等涉及保护的问题就出来了(这也是名称的由来吧)。要解决这些问题,必须对一个地址空间定义一些安全上的属性,但是涉及属性和保护模式下段的其它参数,要表示的信息太多,需要用64位长的数据才能表示。我们把这64位的属性数据叫做段描述符。段描述符包含段的基址、限长(也叫界限)、优先级等各种属性。依据段描述符我们在内存中索引(定位)段的基址。
但是新的问题又来了,段寄存器是16位的,无法放下64位的段描符,解决的办法就是把所的段描述符顺序放在内存中指定位置,组成一个段描述符表(段描述符集合)。而段寄存器中的16位用来做索引信息,索引段描述表中的段描述符,从而间接定位段的地址,故称它为段选择器。
GDTR称为全局描述符表寄存器,它的值(索引值)为GDT的地址,它指向GDT。LDTR称为局部描述符表寄存器,它的索引值为LDT的地址,它指向LDT。
GDT及LDT:
GDT称为全局描述符表(惟一)。它包含系统中所有任务都可用的段描述符。
LDT称为局部描述符,处理器设计成每个任务都有一个独立的LDT,它包含每个任务私有的代码段、数据段和堆栈段等的描述符。不同的任务的局部描述符表分别组成不同的内存段,描述这些内存段的描述符当做系统描述符放在全局描述符表中。我们称其为LDT描述符。如图:
全局描述符表 OS代码段描述符 OS数据段描述符 OS堆栈段描述符 局部描述符表(LDT1) LDT1描述符 任务1代码段描述符 … 任务1数据段描述符 LDTn描述符 任务1堆栈段描述符
和GDTR直接指向内存地址不同,LDTR和CS,DS等段选选器一样只存放索引值。LDTR只索引(指向)GDT中的局部描述符表,然后再通过段选择器在局部描述符表中选择段描述符,从而确定段的基址。这是LDTR与CS,DS等段选择器的不同司职。段选择器也用于在GDT中直接索引非LDT项目,如操作系统的数据段或代码段。
要切换任务,只需改变LDTR的值,系统当前的LDT也随之切换,这样便于各任务之间数据的隔离。
但是又有一个问题,既然有全局描述符表和局部描述符表两个表,那么段选择器中的索引值对应哪个表中的描述符呢。实际上,16位段选择器只有高13位表示索引值。剩下的3个数据位中第0、1位表示程序的当前优先级RPL;第2位TI位用来表示在段描述符的位置:TI=0表示在GDT中,TI=1表示在LDT中。
下面以例子说明GDTR、LDTR、GDT、LDT及段选择器间的关系。
在保护模式下,以虚拟地址xxxx:yyyyyyyy为例。单单凭段选择器中的数值xxxx根本无法反映出段的基址在哪里。首先要看xxxx(16位段选择器)的TI位是否为0,如果是的话,则先从GDTR寄存器中获取GDT的基址(图中步骤1),然后在GDT中以段选择器xxxx的高13位当做位置索引得到段描述符(步骤2),从而得到段的基址;如果xxxx的TI位为1的话,这表示段描述符在LDT中,这时第一步操作还是从GDTR中获取GDT基址(步骤1‘),并且要从LDTR中获取LDT所在的位置索引(步骤2’,即在GDT中索引LDT描述符,步骤3‘。因为当前只有一个LDTR,通过切换LDTR来切换LDT),然后才是用xxxx做索引从LDT中获得段描述符(步骤4’),再以这个段描述符得到段的基址等信息(步骤5‘)。分这两种情况(1表示在GDT中,1’ 表示在LDT中 )得到段的基址后(图中的Result所示),再以基址加上偏移地址yyyyyyyy才得到最后的线性地址。
80386的内存分页机制
在实模式下下寻址的时候,“段寄存器+偏移地址”经过转换
您可能关注的文档
最近下载
- Do_QC-T 568-2019汽车机械式变速器总成技术条件及台架试验方法.docx
- 江西省南昌市2024—2025学年度第一学期期中测试卷九年级 (初三) 化学试卷及答案.docx VIP
- 零碳工厂培训课件.ppt VIP
- 2025年供热稽查考试题及答案.docx
- 信息化条件下联合作战.pptx VIP
- 2024年国家公务员录用考试《行测》题(地市级).pdf VIP
- 日产贵士V42 维修手册-AV.pdf VIP
- 丰田工具__A3资料的制作技巧(丰田工具_精益工具).ppt VIP
- 江西省南昌市2024—2025学年度第一学期期中测试卷九年级 (初三) 数学试卷及答案.docx VIP
- 液压挖掘机检验报告.doc VIP
文档评论(0)