欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

(3)段描述符,段选择子,LES指令

发布时间:2025/3/21 编程问答 24 豆豆
生活随笔 收集整理的这篇文章主要介绍了 (3)段描述符,段选择子,LES指令 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

一、段描述符

GDT表里面存的东西叫段描述符,一个段描述符占8字节,结构如下
暂时不需要知道各个位的作用,先练习一下拆分,在windbg中输入以下命令,打印GDT表。

这里我们打印了GDT表的前5个段描述符。以第2个为例,演示拆分。
00cf9b00 0000ffff
0000 0000 1100 1111 1001 1011 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111
Base 31:24: 00000000
G: 1
D/B: 1
0: 0
AVL: 0
Segment Limit 19:16: 1111
P: 1
DPL: 00
S: 1
Type: 1011
Base 23:16: 0000 0000
Base 15:00: 0x00000000
Segment Limit: 0xFFFFFFFF

二、段选择子

段选择子有16位,结构如下图:

其中,0-1位是RPL(暂时不知道是啥);2位是TI位,0表示查GDT表(windows不使用LDT所以此位永远是0),3-15位是GDT表的下标。

下面是段选择子拆分实验:
0x0023
0000000000100 0 11
Index: 0x4
TI: 0
RPL: 11

三、使用LES指令修改ES

// LES.cpp : Defines the entry point for the console application. //#include "stdafx.h"// RPL <= DPL // Selector: 0000 0000 0011 1000(0038) // LES高2字节给ES,低4字节给ECX,其他指令如LSS,LDS依此类推 // RPL是段选择子的权限,DPL是段描述符的权限,数值越大权限越小 // 因此当RPL=3时,只能访问DPL=3的段描述符;当RPL=0时,可以访问所有段描述符 // 下面的buffer作为源操作数执行les指令,会把ES写为0x0038,EAX写为0x11223344 char buffer[6] = {0x44,0x33,0x22,0x11,0x38, 0x00};int main(int argc, char* argv[]) {// LES修改段寄存器__asm{les ecx,fword ptr ds:[buffer]}return 0; }


《新程序员》:云原生和全面数字化实践50位技术专家共同创作,文字、视频、音频交互阅读

总结

以上是生活随笔为你收集整理的(3)段描述符,段选择子,LES指令的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。