一、段寄存器结构


段寄存器由4部分,共96位组成,其中段选择子(Selector)是可见的,占16位;另外3部分占80位,不可见。下面通过程序论证不可见部分的存在。

详细说明见代码注释,环境是VC6+XP。

二、段寄存器读写

我们可以使用MOV指令对段寄存器进行读写。
读操作时,我们可以读到段寄存器的段选择子部分的16位。例如 mov ax,es 指令会把es寄存器的段选择子读到ax。

写操作时,会写入96位,其中源操作数的16位写入到段寄存器的段选择子部分,另外80位会根据段选择子从GDT表(全局描述表)中获取。因此,

mov ax,cs
mov ds,ax

实际上是把cs完整的复制给了ds。

三、测试Attribute

首先测试往SS段写数据,运行不报错。

#include <stdafx.h>int var = 0;int main()
{// 段寄存器由4部分共96位组成,分别是// Selector(段选择子):16位,是唯一可见的部分,实际上就是GDT表的下标// Attribute:16位,不可见,控制段的读写执行属性// Base:32位,不可见,值是0(FS除外)// Limit:32位,和Base共同决定段的范围// 读段寄存器会读到16位的段选择子// 写段寄存器会写入16位段选择子和剩余80位数据,后者是根据段选择子从GDT表获取的// 论证段寄存器权限控制的存在// 已知CS没有写权限,SS有写权限__asm{mov ax,ss  // 源操作数分别设置为SS和CS,观察运行结果mov ds,axmov dword ptr ds:[var],eax}return 0;
}


接下来测试向CS段写入数据,我们知道CS段是没有写权限的。


运行结果证明了Attribute位的存在。

四、测试Base

int main()
{   // 论证Base的存在// 已知FS的Base不为0__asm{mov eax,fs:[0] // 编译通过,运行成功,因为 fs.base + 0 可读mov eax,ss:[0] // 编译通过,运行报错,因为 ss.base + 0 是NULL,不可读}return 0;
}

五、测试limit

已知FS的limit是0xFFF

#include <stdafx.h>int var = 0;int main()
{   __asm{mov eax,ds:[var]  // 编译通过,运行成功,因为 ds.base + var 可读mov eax,fs:[0x1000]      // 编译通过,运行报错,因为 fs.base + fs.limit 超出fs段的范围}return 0;
}

(1)段寄存器属性探测相关推荐

  1. Windows保护模式学习笔记(一)—— 段寄存器GDT表

    Windows保护模式学习笔记(一)-- 段寄存器&GDT表 保护模式 参考书籍: 一.段寄存器 段寄存器的结构 段寄存器的读写 段寄存器的属性 1)探测Attribute: 2)探测Base ...

  2. 汇编的8种寻址方式,以及2个默认段寄存器

    16位CPU所含有的寄存器有(见图2.1中16位寄存器部分): 4个数据寄存器(AX.BX.CX和DX) 2个变址和指针寄存器(SI和DI) 2个指针寄存器(SP和BP) ,32位CPU增加2个16位 ...

  3. 2020-11-24(Windows保护模式学习笔记(1)—— 段寄存器与段权限检查)

    X86 CPU的三个模式:实模式.保护模式和虚拟8086模式 0x01 段寄存器 通常情况下,我们认为有8个段寄存器,他们分别是 ES CS SS DS FS GS LDTR TR 其中,后四个寄存器 ...

  4. win32 段寄存器怎么寻址

    32位cpu 地址线扩展成了32位,这和数据线的宽度是一致的.因此,在32位机里其实并不需要采用"物理地址=段:偏移"这种地址表达方式.原来在16位机里规定的 每一个段不大于64k ...

  5. Windows 中 FS 段寄存器

    代码运行在RING0(系统地址空间)和RING3(用户地址空间)时,FS段寄存器分别指向GDT(全局描述符表)中不同段:在RING3下,FS段值是0x3B(这是WindowsXP下值:在Windows ...

  6. 段寄存器和8种地址寻址方式

    段寄存器是因为对内存的分段管理而设置的. 16位CPU有四个段寄存器,其程序可同时访问四个不同含义的段,引用方面有如下规定: 1. 取命令:段寄存器CS指向存放程序的内存段,IP是用来存放下条待执行的 ...

  7. 汇编语言--段寄存器

    我们可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元,可以用分段的方式来管理内存. 用一个段存放数据,将它定义为"数据段": 用一个段存放代码,将它定义为& ...

  8. 汇编中的通用寄存器、标志寄存器、段寄存器

    通用寄存器: 寄存器和变量差不多,目的都是用于保存一些即将操作的数据 EAX(accumulator) 寄存器:扩展累加寄存器(一般在乘/除中会被主动调用),也可以用于其他用途 ECX(Count) ...

  9. 反汇编最基础知识(段寄存器和寄存器的说明)

    段寄存器 CS(Code Segment):代码段寄存器 DS(Data Segment):数据段寄存器 SS(Stack Segment):堆栈段寄存器 ES(Extra Segment):附加段寄 ...

最新文章

  1. 【java】兴唐第二十一节(LinkedList和泛型)
  2. 计算机数控装置论文,数控专业(论文)范文.doc
  3. 第二轮“双一流”名单:这 44 所高校有调整!
  4. 使用独立mysql_MYSQL建立独立数据库以及独立数据库用户详细教程,利用PHPstudy自带的MySQL-Front...
  5. PHP IDE免费干货来了!
  6. logstash 获取多个kafka_logstash 配置详解
  7. me shy是什么歌 抖音make_内含活动福利 | 小红书、抖音爆赞的高颜值的北欧家居神店开到卜蜂中心啦!...
  8. MySQL2种多实例部署方式总结
  9. 用aspectJ 做了一次日志
  10. activiti工作流 php,码云社 | 砺锋科技-SpringBoot整合Activiti工作流(附源码) - 用代码改变世界...
  11. 期末总结(持续更新)
  12. 官网下载 CentOs 7 镜像的详细步骤
  13. AM3352上移植sqlite3数据库
  14. 实验一:VLAN实验
  15. 3GPP Release和Category简介
  16. 干货 | 拆解一个 Elasticsearch Nested 类型复杂查询问题
  17. form-group 两种常用使用
  18. 解决AppUpdate不能使用的问题
  19. 计算机学院的横幅,毕业横幅标语(精选50句)
  20. 关于笔记本连接显示器检测不到的问题(NoVideoInput)

热门文章

  1. AI:2020年6月22日北京智源大会演讲分享之09:50-10:40 Anil教授《Pattern Recognition: Statistics to Pattern Recognition》
  2. DL之DNN:自定义MultiLayerNet【6*100+ReLU,SGD】对MNIST数据集训练进而比较【多个超参数组合最优化】性能
  3. 【构建之法教学项目】一个简单的基于C#的电子商务系统演练场景的代码示例...
  4. Windows下安装Apache 2.2.21图文教程
  5. sql语句的学习(2)
  6. bootstrap 列表--水平定义列表
  7. ios:CGContextRef 渲染中文问题
  8. Oracle 体系结构2 - 共享和专用服务器
  9. 第二十篇:定义一个整形变量
  10. C#---HTML 转文本及HTML内容提取