80386ASM程序设计基础(十):段描述符,段选择子(zz)

内核_段寄存器|段描述符|段选择子(详解) 段寄存器概述 概述 段寄存器: ES CS SS DS FS GS LDTR TR共8个。 段寄存器结构分布 Struct SegMent{ WORD Selector段选择子;//16位selector WORD Attribute;//16位的Attribute WORD Base;//32位的Base DWORD Limit //32位的Limit }; 段寄存器结构图 读一个段寄存器只读16位,写一个段寄存器写96位。 ... 阅读详情

主要介绍段描述符,段选择子

   在保护模式下,段是实现虚拟地址到线性地址转换的基础。在保护方下,每个段有三个参数:段基址,段界限,段属性。段基址规定了线性地址空间中段的开始地址,段基址长度为32位,所以任何一个段都可以从32位线性地址空间中的任何一个字节开始,这一点和实式方式不同,实式方式下要求段的边界必须被16整除。段界限规定段的大小,段界限用20位表示,而且段界限可以是字节或4K为单位,这个称为段的粒度。当段界限以字节为单位时,那么段的范围是1字节至1M字节;当段界限是以4K字节为单位时,那么段的范围是4K至4G。段的界限同时也是用来校验偏移地址的合法性,比如说段A的基址为00123456H,段界限为1000H,如果段界限以字节为单位,那么段的范围是00123456H-00124456H;如果段界限以4K字节为单位,那么段的范围是00123456H-00223456H。事实上,段的界限也可以用来校验偏移地址的合法性,上面的例子中界限为1000H,那么偏移地址的范围就是0-1000H,如果偏移地址不在这个范围内那就会引起异常。需要说明的是,数据段有点特殊,因为数据段的偏移范围不仅仅是由段界限来决定,还要由段的扩展方向(Extension Direction)来决定,因为要照顾到堆栈段(堆栈段是一种特殊的数据段,它是向低端地址扩展的),如果段界限为Limit,段的扩展方向为向高端地址扩展的话,那么我们可以断定它是一普通的数据段,0-Limit是有效的偏移范围,而Limit以上属于无效的偏移范围;如果段界限为Limit,段的扩展方向为向低端地址扩展的话,那么可以断定它是一堆栈段,此时0-Limit是无效的偏移范围,Limit以上则属于有效的偏移范围,正好和向高端地址扩展的普通数据段相反。除了堆栈段以外,其它的段均是自然向高端扩展。
   段基址,段界限及段属性这三个参数在保护模式下用描述符来描述,每个描述符的长度为8个字节,每个段都有一个对应的描述符。在保护模式下有三种描述符:存储段描述符,系统段描述符,门描述符。
   A.存储段描述符:存储段是指程序直接执行的代码段和数据段,存储段描述符是用来描述存储段的,也可以说是用来描述代码和数据段的,它的长度为8个字节,该描述符结构示意图:
    
    第7字节  第6字节  第5字节     第4字节  第3字节  第2字节   第1字节  第0字节
   |--------|------------------|-----------------------------|-----------------|
   |段基址的|                  |                             |                 |
   |高8位   |Segment Attributes|       段基址的低24位        | 段界限的低16位  |
   | 24~31  |   段属性,占用两 |         0~23                |      0~15       |
   |        |   个字节         |                             |                 |
   |--------|------------------|-----------------------------|-----------------|
            |                  | 
            |                  | 
   _________|                  |_____________________________
   | 15  14 13  12 11            8 7 6     5   3           0|
   |---|---|---|---|-------------|---|--- -|---|------------|
   | G | D |0  |AVL|段界限的高4位| P | DPL |DT |    TYPE    |
   |---|---|---|---|--- ---------|---|-----|---|------------|
   
   段基址和段界限都被安排在描述符的两个域中,主要是来看段的属性:
   a.G(第15位),这是段界限粒度,即是说段界限到底是以字节为单还是以4K字节为单位。G=0表示段界限是字节,G=1表示段界限为4K字节。
   b.D(第14位),D是一个很特殊的位,在描述可执行段,向低扩展数据段或者由SS寄存器寻址的段。在描述可执行段的描述符中,D位决定了指令使用的地址及操作数据默认的大小,D=1表示默认情况下使用32位地址及32位或8位操作数,这样的代码段称为32位代码段;D=0表示默认情况下使用16位地址及16位操作数或8位操作数,这样的代码段称为16位代码段;在向低扩展的数据段中,D=1表示段的上部界限为4G,D=0表示段的上部界限为64K;在描述由SS寄存器寻址的段中,该位决定使用隐式的堆栈访问指令使用何种堆栈指针寄存器。D=1表示使用32位堆栈指针寄存器ESP,D=0表示使用16位堆栈指针寄存器SP,隐式的堆栈访问指令指的是那些指令中没有明显对SP或ESP进行操作的指令,比如说PUSH,POP,PUSHA,POPA,PUSHAD,POPAD都属于隐式的堆栈访问指令。
   c.0(第13位),这一位恒为0,为80386以后的处理器保留的。
   d.AVL(第12位),软件可利用位,主要是为了保持和以后的处理兼容。
   e.第11位到第8位是段界限的高4位。
   f.P(第7位),存在位,P=1表示描述符对转换地址有效。P=0表示描述符对转换地址无效,如果使用该描述符将会引起异常。    
   g.DPL(Descriptor Privelege Level)描述符特权级,共2位,它规定了所述段的特权级别,用于特权检查,以决定是否能对该段进行访问。
   h.DT(Descriptor Type)描述符的类型,DT=0表示存储段描述符,DT=0表示系统段描述符和门描述符。
   i.TYPE,共4位,说明存储段的具体属性:
     TYPE0:指示描述符是否被访问,用A标记,A=0表示描述符未被访问,A=1表示描述符已被访问。
     TYPE1:根据TYPE3来确定。
     TYPE2:根据TYPE3来确定。
     TYPE3:指示描述符所描述的段是数据段还是代码段,用E标记。E=0表示是不可执行段,是数据段,对应的描述符也就是数据段描述符。E=1表示是可执行段,也就是代码段,对就的描述符也就是代码段描述符。 
     如果TYPE3=0,也就是说描述符是数据段描述符,那么TYPE1指示该数据段是否可写,用W标记。W=0表示对应的数据段不可写,只读。W=1表示对应的数据段可写。TYPE2则指示数据段的扩展方向,用ED标记。ED=0表示向高端扩展,ED=1表示向低端扩展。
     如果TYPE3=1,也就是说描述符是代码段描述符,那么TYPE1指示该代码段是否可读,用符号R标记。R=0表示对应的代码段不可读,只能执行,R=1表示对应的代码可读可执行。TYPE2则指示所描述的代码段是否是一致代码段,用C表示。C=0表示代码段不是一致代码段,C=1表示是一致代码段。
     TYPE3-TYPE0这四位可以列成一个表:
    ____________________________________________________________________________________
    |0000 |只读                                                                        |
    |_____|____________________________________________________________________________|
    |0001 |只读,已访问                                                                |
    |_____|____________________________________________________________________________|
    |0010 |可读,可写                                                                  |
    |_____|____________________________________________________________________________|
    |0011 |读写,已访问                                                                |
    |_____|____________________________________________________________________________|
    |0100 |只读,向低扩展                                                              |
    |_____|____________________________________________________________________________|
    |0101 |只读,向低扩展                                                              |
    |_____|____________________________________________________________________________|
    |0110 |读/写,向低扩展                                                             |
    |_____|____________________________________________________________________________|
    |0111 |读/写,向低扩展,已访问                                                     |
    |_____|____________________________________________________________________________|
    |1000 |只执行                                                                      |
    |_____|____________________________________________________________________________|
    |1001 |只执行,已访问                                                              |
    |_____|____________________________________________________________________________|
    |1010 |可执行,可读                                                                |
    |_____|____________________________________________________________________________|
    |1011 |可执行,可读,已访问                                                        |
    |_____|____________________________________________________________________________|
    |1100 |只执行,一致代码段                                                          |
    |_____|____________________________________________________________________________|
    |1101 |只执行,一致代码段,已访问                                                  |
    |_____|____________________________________________________________________________|
    |1110 |可执行,可读,一致代码段                                                    |
    |_____|____________________________________________________________________________|
    |1111 |可执行,可读,一致代码段,已访问                                            |
    |_____|____________________________________________________________________________|

    存储段描述符的结构可以这样定义:
    DESCRIPTOR STRUCT
    Segment_LimitL16 DW 0;段界限的低16位    
    Segment_BaseL16 DW 0;段基址的低16位
    Segment_BaseM8 DB 0;段基址的中间8位
    Segment_BaseH8 DB 0;段基址的高8位
    Segment_Attributes DW 0;段属性
    DESCRIPTOR ENDS
    一个任务有多个段,每个段都有一个描述符。因此在80386下,为了方便管理这些段描述符,将描述符组成一个线性表,称之为描述符表。在80386下有三种描述符表:GDT(Global Descriptor Table),LDT(Local Descriptor Table),IDT(Interrupt Descriptor Table)。在整个系统中全局描述符表GDT和中断描述符表只有一张,局部描述符表可以由若干张。每个描述符表都形成一个特殊的16位数据段,这样的特殊数据段最多可以有8192个描述符,具体使用哪一个段描述符,由段的选择子来确定。每个任务都有自已的局部描述符表LDT,它包含自已的代码段,数据段,堆栈段,也包含该任务使用的一些门描述符。随着任务的切换,LDT也跟着切换。GDT包含每一个任务都可能或可以访问的段的描述符,通常包含描述操作系统所用的代码段,数据段以及堆栈段的描述符,也包含描述任务LDT的描述符。在任务切换时,并不切换GDT。一个任务的整个虚拟地址空间可以分为相等的两半,一半空间的描述符在全局描述符表GDT中,一半空的描述符在局部描述符表LDT中。由于全局描述符表和局部描述符表都可以包含最多为8192个描述符,而每个描述符所描述的段的最大长度为4G,因此最大的虚拟地址空间为:8192*4G*2=64TB。
   段选择子用来确定使用描述符表中的哪一个描述符。实式模式下逻辑地址由段地址*16再加上段内偏移地址;保护模式下虚拟地址空间由段选择子和段内偏移来确定,和实式模式比较,段选择子代替了段值,实际上通过段选择子就可以确定了段基址。选择子的高13位是描述符表中的索引号,用来确定描述符,因为是13位,所以说最多可以有2的13次方8192个描述符,索引号:0-8191。标记TI指示是从全局描述符中读取描述符还是从局部描述符表中读取描述符。TI=0指示是从全局描述符表中读取描述符,TI=1指示从局部描述符表读取描述符。RPL表示请求特权级,用于特权检查。假设段选择子为88H,则表示请求的特权级别是0,从全局描述表中读取描述表,描述符的索引号为11H。有一个特殊的选择子称为空选择子,它的Index=0(即高13位为0),TI=0,RPL则可以为任意值。当用空选择子对存储器进行访问,会出现异常。空选择子对应于全局描述表中的第0个描述符,因此全局描述符表中的第0个描述符总是不会被访问。如果TI=1,那么就不是空选择子,它指定的是当前局部描述符表中的第0个描述符。为了更快地从段选择子中获得段的基本信息(段基址,段界限,段属性),从80386开始为每个段寄存器在硬件上配备了段描述符高速缓冲存储器,对我们写程序的人来讲,它是不可编程的。有了这种高速缓冲寄存器后,每当将选择子装入段寄存器后,处理器将自动装入描述符表中相应的描述符,并将描述表的信息装入到高速缓冲寄存器,这样可以加快访问速度,以下是段选择子的结构示意图:
   
   15________________________________________________________________3__2__1_____0 
   |                                                                |TI |  RPL   |
   |________________________________________________________________|___|________|


伺服电机入门01 编码器输出 旋转信号 , 接收端: 使用ADC 捕捉旋转信号 ,转成数字信号,驱动器得到数字处理, 因为信号量是模拟信号, mcu mpu 等芯片通常内部处理是数字,通过adc 得到数字cpu 才能识别 传输过来的pos 等信息。IPM 芯片示例, IRAM256A 这个芯片已经停产,有换新的,,下面示例来自stmbl 高功率方案,4 步进电机 有全步控制,半步控制 ,微步控制,FOC控制,步进电机也是可以做伺服系统的。以下面几种信号是可以细分,也就是通过细分增加编码器的分辨率, 阅读详情

相关推荐

SNAP实战:哨兵1 SLC数据预处理全流程详解(附避坑指南)

本文详细解析了使用SNAP软件处理哨兵1号SLC数据的完整预处理流程。从轨道精校正、辐射定标到多视与斑点滤波,再到地理编码,文章提供了清晰的操作步骤与核心逻辑,并重点分享了实践中的常见“坑”与解决方案,旨在帮助用户高效、准确地完成SAR数据预处理。

7up55的博客 1026

段寄存器&段选择子&段描述符

充分利用了分段机制,提供了对代码,数据结构以及程序的硬件级保护,在这里每个进程(任务)都被分配了自己的段描述符以及自己的段,进程可以完全独自拥有这些分配到的段,也可以与其他进程共享这些段。单独的程序对段和执行环境的访问由硬件控制 ......

weixin_45678798的博客 2025

使用LogisticRegression和LightGBM模型对信贷违约进行预测----基于kaggle比赛数据

3.分离数值型变量与类别型变量,发现有些数值型变量因为输入不规范,比如数值中含有字符(28_,_10000_等)被划分为类别型变量 ,比如 'Age','Annual_Income','Num_of_Loan', 'Num_of_Delayed_Payment', 'Changed_Credit_Limit','Credit_Mix','Monthly_Balance', 'Outstanding_Debt' ,'Amount_invested_monthly'等。三、分箱,woe编码,计算IV值。

I_am_a_big_tiger的博客 1682

3-段选择子与段描述符结构

段描述符与段选择子的结构段选择子结构段选择子一共有16位,结构如下:| 1 | 0 | 字节 |7654321076543 2 10| 比特 |-------------|-|--| 占位 | INDEX |T|R | 含义 | |I|P | | | |L | INDEX:在GDT数组或LDT数组的索引号 TI

进击的小学生 2万+

沙猫群优化算法(SCSO)详解:从沙漠生存智慧到全局优化引擎

本文详细介绍了沙猫群优化算法(SCSO),这是一种新型元启发式优化算法,灵感来源于沙猫在沙漠环境中的卓越狩猎行为。SCSO通过模拟沙猫的低频探测能力和精确攻击策略,将优化问题转化为搜索和捕获"猎物"的过程。算法核心包括探索阶段(全局搜索)和开发阶段(局部精细搜索),通过灵敏度范围模型和自适应控制参数实现两者的平衡。SCSO具有参数简单、收敛性能好等优点,适用于解决复杂全局优化问题。

qq_42212808的博客 200

JEDEC 标准半导体功率循环热阻测试(JESD51 系列)

【代码】JEDEC 标准半导体功率循环热阻测试(JESD51 系列)

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 467

段描述符与段选择子

段描述符与段选择子 当写一个段寄存器的时候,只给了一个16位的数,但段寄存器有96位,那剩下的80位从哪里来的? GDT(全局描述符表) 和LDT(局部描述符表) gdt 数组中的每个元素都是一个段描述符。 数组的索引号是段选择子。 这个 gdt 数组被称为 gdt 表。 Gdtr 存储 GDT 表的基址,查看gdt 一、段描述符结构如图: BASE: 段基址,由上图中的两部分(BASE 31-24 和 BASE 23-0)组成 G:LIMIT的单位,该位 0 表示单位是字节,1表

maomao171314的专栏 2966

基于Simulink的单级式光伏并网系统MPPT控制仿真

本文基于Simulink平台,详细介绍了单级式光伏并网系统的MPPT控制仿真实现。主要内容包括:1)阐述MPPT作为光伏系统"智能大脑"的核心作用;2)解析单级式系统架构及扰动观察法(P&O)算法原理;3)以10kW户用系统为例,分步骤演示建模过程,包括光伏阵列搭建、P&O控制器实现(含MATLAB代码)、并网控制设计等;4)通过仿真验证系统在光照突变下的动态响应性能,MPPT效率达98.3%。文章还提出了变步长P&O等优化方向,为光伏系统仿真与控制提供实用指导。

xiaoheshang_123的博客 111

深入理解计算机系统-之-内存寻址(三)--分段管理机制(段描述符,段选择子,描述符表)

逻辑地址-=>线性地址-=>物理地址前面我们提到了当使用80x86微处理器时,有三种不同的地址: 逻辑地址(logical address):包含在机器语言指令中用来指定一个操作数或一条指令的地址。这个寻址方式在80x86著名的分段结构中表现得尤为具体,它促使MS-DOS或Windows程序员把程序分成若干段。每一个逻辑地址都由一个段(segment)和偏移量(offset或dis

OSKernelLAB(gatieme) 1万+

OceanBase数据库:与MySQL和Oracle的函数差异分析

OceanBase数据库兼容性解析:MySQL与Oracle模式深度比较 摘要:OceanBase通过独特的双模式架构,实现了对MySQL和Oracle的高度兼容。文章首先分析了OceanBase的兼容性架构,包括SQL解析层、优化器层和执行引擎层的差异化设计。随后对比了两种模式在数据类型、SQL语法、函数支持等方面的兼容性差异,其中MySQL模式兼容5.7版本大部分功能,Oracle模式则支持155个内置函数和PL/SQL特性。最后提出了模式选择的六大考量因素,包括现有系统基础、功能需求和迁移成本等,为数

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1226

扩展卡尔曼滤波 (EKF, Extended Kalman Filter) 算法详解及案例分析

扩展卡尔曼滤波是一种用于估计非线性动态系统状态的递归算法。其目标是通过结合非线性系统模型和观测数据,估计系统的最优状态。

闲人编程的博客 2383

80386ASM程序设计基础(十)

主要介绍段描述符,段选择子   在保护模式下,段是实现虚拟地址到线性地址转换的基础。在保护方下,每个段有三个参数:段基址,段界限,段属性。段基址规定了线性地址空间中段的开始地址,段基址长度为32位,所以任何一个段都可以从32位线性地址空间中的任何一个字节开始,这一点和实式方式不同,实式方式下要求段的边界必须被16整除。段界限规定段的大小,段界限用20位表示,而且段界限可以是字节或4K为单位,这个称

kingcaiyao的专栏 1916

Oracle EBS FA 如何打开关闭的资产会计期间?

用户“运行折旧”,误勾选为“关闭期间”,还有一部分资产还需要操作报废和调整,希望后台打开关闭的资产会计期。

陈显平的专栏-Oracle EBS 1027

80386ASM程序设计基础(十) (转)

80386ASM程序设计基础(十) (转)[@more@]主要介绍段描述符,段选择子 在保护模式下,段是实现虚拟地址到线性地址转换的基础。在保护方下,每个段有三个参数:段基址,段界限,段属性。段基址规定了线性地址空间中段的开始...

csd3176的博客 130

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【转贴】80386ASM程序设计基础(十)

主要介绍段描述符,段选择子   在保护模式下,段是实现虚拟地址到线性地址转换的基础。在保护方下,每个段有三个参数:段基址,段界限,段属性。段基址规定了线性地址空间中段的开始地址,段基址长度为32位,所以任何一个段都可以从32位线性地址空间中的任何一个字节开始,这一点和实式方式不同,实式方式下要求段的边界必须被16整除。段界限规定段的大小,段界限用20位表示,而且段界限可以是字节或4K为单位,这个称

813

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

80386保护模式下实现 Hello World

利用选择子 拿到对应的段描述符,之后自然就可以拿到段基址,再加上段内偏移地址,就可以跳转 dword 双字 32位 word 两个字节 16位 dword 四个字节 32位 问题:为什么要明确的标识出 dword 32位呢? 答案:因为我们现在的无条件跳转 jmp 是从16位代码段 跳转到 32位代码段,16位代码段的意思就是 编译器在默认的情况下 对16位代码段里面的立即数 解释为16位。编译器有默认的准则,如果不明确指定,则在16位代码段中,编译器会默认 认为这个立即数就是16位的

奶牛养殖场小马 634

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

AI伦理工程实践:从公平性检查到可解释性评估的落地指南

机器学习模型在真实业务中部署后,准确率不再是唯一指标。模型偏差、决策黑箱、数据隐私泄露以及大模型被恶意注入等问题,本质上属于AI伦理范畴的系统性风险。理解公平性度量、可解释性分析、差分隐私与安全对齐等核心技术原理,是构建可信AI系统的前提。工程团队可通过引入Fairlearn、SHAP、Diffprivlib等开源工具,在模型全生命周期中嵌入伦理评估流水线,实现偏见检测、特征归因与隐私保护。这些实践不仅适用于信贷风控、推荐系统和客服机器人等场景,也是满足合规要求、提升用户信任的关键路径。本文从基础概念出发,

cuiji1279的博客 331

1.asm-80386汇编

1. leave: mov esp,ebp pop ebp 其实我们应该要注意到pop ebp时,esp也加了4.   2  MOVZX 指令  格式: MOVZX OPD,OPS  ----  功能: 总是高位0扩展 注意点:不要再写成 bTest1 byte 12h movzx ax, word ptr bTest1 (位数相同,所以没必要扩展?)也

hgy413的专栏 1702

全面剖析《自己动手写操作系统》的pmtest1.asm

Sunbelt铭记<<  第一个orange's程序 | 首 页 | java类内存对象  >>全面剖析《自己动手写操作系统》的pmtest1.asm - [orange's]Tag:<br />版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明<br />http://784812304.blogbus.com/logs/71646606.html<br /><br />网上看到的一强帖,不转不行了,牛人啊,把这段代码拿捏的相当到位 括号中是我的加注<br /> <br />段机制轻松体验<

charcy的专栏 1326

80386ASM程序设计基础(十一) (转)

80386ASM程序设计基础(十一) (转)[@more@]主要介绍系统地址寄存器和控制寄存器以及在程序中实方式下与保护方式下的切换 80386处理器新增了一组控制寄存器CR0,CR1,CR2,CR3和一组系统地址寄存器GD...

csd3176的博客 110

Markdown转PDF不求人:3种方案搞定排版与批量自动化

Markdown作为轻量级标记语言,凭借简洁的语法和高效的写作体验,已成为技术文档、笔记和博客创作的主流格式。然而,当需要将Markdown输出为PDF时,直接打印或浏览器导出往往会出现表格截断、图片丢失、样式错乱等问题。其核心在于PDF是固定页面布局,而Markdown需借助渲染引擎完成转换。理解这一原理后,选择合适的工具链便能实现高效、专业的文档交付。从单文件快速导出到批量自动化生产,不同场景对应不同方案:VSCode插件(如Markdown PDF、Markdown Preview Enhanced)

cuiji1279的博客 223

保护模式下pmtest1.asm的理解

保护模式下pmtest1.asm的理解 整个代码对应内存线性地址分为四段,[gdt] [code32] [video32] [code16] 代码先在实模式[code16]下运行,code16中的cs就是系统分配的该程序物理地址的基址. 编译器会自动把其他段中的标号,编译成相对这个物理地址基址的偏移量. 其他段的物理真实地址就是这个基址+标号所表示的偏移量. label_begi

u011078908的博客 741

《一个操作系统的实现》——pmtest1.asm详解

段机制轻松体验  内存寻址:  实模式下的内存寻址:  让我们首先来回顾实模式下的寻址方式  段首地址×16+偏移量 = 物理地址  为什么要×16?因为在8086CPU中,地址线是20位,但寄存器是16位的,最高寻址64KB,它无法寻址到1M内存。于是,Intel设计了这种寻址 方式,先缩小4位成16位放入到段寄存器,用到时候,再将其扩大到20位,这也造成了段的首地址必须是16的倍数的

tasty 1074
上一篇: MPQ技术内幕
下一篇: XEN网络配置综述
zhyjunFov
博客等级 码龄18年 17粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值