386的“D位”中的“D”代表什么?

2023-11-29

In 关于 GDT 的文章OSDev wiki 描述了用作 CS 描述符的 D 位的标志,如下所示:

Sz:尺寸位。如果0选择器定义16位保护模式。如果1它定义了32位保护模式。您可以同时拥有 16 位和 32 位选择器。

另一个问题引用了英特尔手册:代码段描述符中的 D 标志对于 x86-64 指令有何作用?链接到“3.4.5 段描述符”部分Intel 64 和 IA-32 架构软件开发人员手册第 3 卷 [...]:系统编程指南, 阅读:

D/B(默认操作大小/默认堆栈指针大小和/或上限)标志

根据段描述符是可执行代码段、向下扩展数据段还是堆栈段来执行不同的功能。 (对于 32 位代码和数据段,该标志应始终设置为 1;对于 16 位代码和数据段,该标志应始终设置为 0。)

• 可执行代码段。该标志称为 D 标志,它指示段中指令引用的有效地址和操作数的默认长度。如果设置了该标志,则假定为 32 位地址和 32 位或 8 位操作数;如果清楚,则假定为 16 位地址和 16 位或 8 位操作数。指令前缀66H可用于选择默认值以外的操作数大小,并且前缀67H可用于选择默认值以外的地址大小。

问题是,“D”代表什么?


我找到了一份副本Intel 80386 程序员参考手册,1987 年其中有以下描述16.1 80386 如何实现 16 位和 32 位功能:

允许 80386 在 32 位和 16 位地址和操作数大小下同样良好工作的架构特性包括:

  • 代码段描述符的 D 位(默认位),它确定代码段指令的操作数大小和地址大小的默认选择。 (在不使用描述符的实地址模式和V86模式下,默认为16位。)设置了D位的代码段称为USE32段; D 位为零的代码段是 USE16 段。当所有指令都使用相同大小的操作数和有效地址时,D 位消除了对指令中的操作数大小和地址大小进行编码的需要。

  • 显式覆盖操作数大小和地址大小的默认选择的指令前缀(在保护模式以及实地址模式和 V86 模式下可用)。

  • 独立的 32 位和 16 位门用于段间控制传输(包括调用门、中断门和陷阱门)。控制传输的操作数大小由门的类型决定,而不是由传输指令的 D 位或前缀决定。

  • 可用于 32 位和 16 位操作数以及有效地址计算的寄存器。

  • 数据段描述符的 B 位(大位),它确定 CPU 用于隐式堆栈引用的堆栈指针(32 位 ESP 或 16 位 SP)的大小。

所以“D位”代表“Default操作数和地址大小”(对于代码段)和“B 位”对于“Big“(对于堆栈段)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

386的“D位”中的“D”代表什么? 的相关文章

  • CSS 术语:这些叫什么?

    考虑 p foo bar CSS 中这些语句的正确名称是什么 我见过它们被称为选择器 规则或规则集 但哪个是正确的 将考虑一条规则 p 本例中的选择器是 p 规则由选择器和声明组成 声明是property value所以整个规则是 sele
  • 汇编语言中的全局_start是什么?

    这是我的汇编级代码 section text global start start mov eax 4 mov ebx 1 mov ecx mesg mov edx size int 0x80 exit mov eax 1 int 0x80
  • MASM 字符串反转

    好吧 我正在讨论这个问题 可能是一个非常复杂的解决方案 但这是我脑海中浮现的第一件事 我需要编写一个汇编语言程序来反转 源 字符串 而不使用 目标 字符串 临时变量 这是我的尝试 INCLUDE Irvine32 inc data sour
  • 如何在 Ubuntu 14.04 LTS 中安装 ia32-libs (Trusty Tahr)

    我昨天安装了 Ubuntu 14 04 Trusty Tahr 一切看起来都还好 但是当我尝试编译一些C代码时 我遇到了以下错误 该错误似乎是由于操作系统缺乏 32 位架构支持造成的 错误输出如下 usr bin ld i386 archi
  • 装配中出现奇怪的字符?

    我写了以下代码 386 model small stack 100h data text db Paper 0 code start lea dx text mov ah 9h int 21h mov ah 4ch int 21h end
  • 在 REP MOVSW 之前 PUSH CS / POP DS 的目的是什么?

    为什么在下面的代码中我们压入代码段 PUSH CS 然后将其弹出到数据段 POP DS 我将这些行明确指定为 line1 和 line2 请告诉我 MOVSW 在这里是如何工作的 IF HIGHMEMORY PUSH DS MOV BX D
  • 为什么我可以使用 ret 退出 main?

    我即将弄清楚程序堆栈到底是如何设置的 我了解到用以下方式调用该函数 call pointer 实际上等同于 mov register pc programcounter add register 1 where 1 is one instr
  • 破坏/分解函数的函数

    我以前有过 here https stackoverflow com questions 4920610 c class function in assembly 已经表明 C 函数不容易用汇编表示 现在我有兴趣以一种或另一种方式阅读它们
  • x86-64 上这个语句有什么问题?

    该函数的目的是获取堆栈的起始地址 unsigned long find start void asm movq rsp eax 当我编译它时 出现错误 Error suffix or operands invalid for movq mo
  • C++ 中的 CPUID 实现

    我想知道这里是否有人有一些可以从任何托管 net 语言引用的 C CPUID 实现的好示例 另外 如果情况并非如此 我是否应该注意 X86 和 X64 之间的某些实现差异 我想使用 CPUID 来获取运行我的软件的机器上的信息 崩溃报告等
  • 为 Visual Studio 应用程序设置平台目标的目的是什么?

    对于任何 VS 项目 都可以在该项目的构建属性中设置平台目标 您可以将其设置为任何 CPU x86 x64 或 Itanium 我的问题是 如果我将此值设置为 x86 是否意味着我无法在 x64 计算机上运行该项目 如果是这样 为什么还要使
  • Clang 使用 -nostdlib 生成崩溃代码

    我正在尝试为可执行文件设置自己的运行时环境 但无法使用 clang v3 4 1ubuntu1 目标 x86 64 pc linux gnu 来生成没有段错误的可执行文件 我已将问题简化为以下内容 如果我有一个文件 crt1 c 除了满足
  • 在 x86 程序集中将整数打印到控制台

    当我在 16 位汇编中添加两个值时 将结果打印到控制台的最佳方法是什么 目前我有这个代码 CODE START mov ax 1 put 1 into ax add ax 2 add 2 to ax current value mov ah
  • 为什么不能执行 mov [eax], [ebx] [重复]

    这个问题在这里已经有答案了 我可以做这个 mov eax ebx 和这个 mov eax ebx 甚至这个 mov eax ebx 但不是这个 错误C2415 mov eax ebx 只是wtf 为什么 它与 ptr1 ptr2 相同 为什
  • 在 x86 Intel VT-X 非根模式下,是否可以在每个指令边界传递中断?

    除了不将中断传送到虚拟处理器的某些正常指定条件 cli if 0 等 之外 客户机中的所有指令实际上都是可中断的吗 也就是说 当传入的硬件中断先传递给 LAPIC 然后传递给处理器时 据说会发生一些内部魔法 将其转换为虚拟中断给来宾 使用虚
  • Visual Studio 2017 上的简单装配程序

    386 model flat c stack 100h printf PROTO arg1 Ptr Byte data msg1 byte Hello World 0Ah 0 code main proc INVOKE printf ADD
  • 减法进位标志

    我正在使用 MASM32 有了这个代码 mov eax 5 sub eax 10 CF 状态标志将被设置 但使用我的铅笔和纸 我实际上看到 MSB 没有任何进位 是的 我知道从较少的数字中减去大的数字集CF 但我想知道为什么 因为使用这段代
  • 为什么 RISC-V S-B 和 U-J 指令类型以这种方式编码?

    我正在读一本书 计算机组织与设计RISC V版 我遇到了 S B 和 U J 指令类型的编码 我上面提到的那些类型有奇怪的编码立即字段 S B 类型将直接字段分为两部分 这是有道理的 因为所有指令编码都必须相似 但我无法理解为什么立即字段以
  • 汇编8086监听键盘中断

    我有与此完全相同的问题 边画边听键盘 https stackoverflow com questions 13970325 8086 listen to keyboard while drawing 但第一个答案 接受的答案 只听键盘一次
  • 在 x86 ASM 中测试零通常哪个更快:“TEST EAX, EAX”与“TEST AL, AL”?

    测试 AL 中的字节是否为零 非零通常哪个更快 TEST EAX EAX TEST AL AL 假设之前有一个 MOVZX EAX BYTE PTR ESP 4 指令加载了一个带有零扩展的字节参数到 EAX 的其余部分 防止了我已经知道的组

随机推荐

  • 如何使用Python和Cypher在Apache Age中实现最短路径算法?

    我正在开发一个使用 Apache Age 作为图形数据库的 Python 项目 我需要找到两个可能节点之间的最短路径 我如何使用 Python 来实现这个 创建节点和图结构的代码如下 Python code to create nodes
  • 如何创建在设备和佩戴上不同的通知?

    基本上 我想知道是否有可能创建两个不同的通知以及如何创建 一个用于 Android 设备 另一个用于 Android Wear 例如 我想要setContentText 但在 Android 设备上我想要setContentTitle an
  • 在 ObservableList 上调用clear()会导致IndexOutOfBoundsException

    我有一个带有可观察列表的组合框 该列表会随着用户输入字符或进行选择而更新 我遇到的问题是当我从 ComboBox 中选择一个项目并调用侦听器事件 然后调用 ComboBox 的 ObservableList 中的clear 方法时引起的 完
  • Android TCP 应用程序挂在 inStream.readline() 上

    这是一个延续这个问题因为它回答了我原来的问题 但它没有解决错误 问题 如何修复挂在这一行的代码inStream readline 我的意图 这是在一个线程中 该线程将循环检查是否有 outMessage 如果有 它将发送消息 接下来 它将检
  • 如何在 Vim 中实现类似 MATLAB 的单元格模式

    在 MATLAB 中 我们可以向编辑器写入以下内容 a example cell plot rand 3 another cell A rand 2 10 t linspace pi pi 2 10 compass fft A sin t
  • 将 Parceler (@Parcel) 与 Realm.io (Android) 一起使用

    我有以下代码会产生错误 Error Parceler Unable to find read write generator for type io realm Realm for io realm RealmObject realm 一切
  • MATLAB 中的稳定 AccumArray

    MATLAB的内置函数accumarray接受一个函数fun作为第四个参数 A accumarray subs val sz fun 这适用fun到每个元素子集val具有相同的下标subs 然而 该文档指出 如果下标在subs未根据其线性索
  • 在下拉列表内的树层次结构中显示类别/子类别

    我有一个类别表 其中包含字段 id name 和parent id 根类别的parent id 0 现在我想在下拉列表中显示类别列表 结构如下 root category first sub category sub sub categor
  • .NET 4 GUID 是如何生成的?

    我知道有很多问题here以及雷蒙德的出色 像往常一样 post 然而 由于创建 GUID 的算法明显发生了变化 我发现很难获得任何最新信息 这MSDN似乎试图提供尽可能少的信息 关于 NET 4 中如何生成 GUID 我们了解多少 更改了什
  • ID 保存并显示名称 - 带芯片的材质 ui 多选

    我正在使用基于文档示例的 Material UI Multiple Select 我需要保存所选选项的 ID 和显示名称 我尝试了很多方法但没有任何帮助 我需要存储 id 并显示值 请帮助我指导 这是我的代码和盒子link 我也想知道同样的
  • 奇怪的谷歌地图行为 - 瓷砖仅出现在左上象限

    使用谷歌地图数十次 但无法绕过这一点 为地图版本 3 执行 google 的简单 hello world http code google com apis maps documentation javascript tutorial ht
  • 赋值关联性[重复]

    这个问题在这里已经有答案了 赋值运算符有右到左关联性 所以 var x y x y 1 按预期工作 x 等于 1 现在考虑代码 var foo foo x foo n 2 我希望上面的工作像下面这样 var foo n 2 foo x fo
  • 管理两个 NSURLConnection

    我想从两个不同的 kml 文件执行两个异步请求 因此我首先设置两个请求 NSString server1URL NSString stringWithFormat NSMutableURLRequest firstRequest NSMut
  • Github 操作在作业之间共享工作空间/工件?

    尝试使用 Github 的 beta 操作时 我有两项工作 一项是构建代码 另一项是部署代码 但是 我似乎无法在部署作业中获取构建工件 我最新的尝试是为每个作业手动设置具有相同卷的容器映像 根据文档 这应该是解决方案 https help
  • python:类 super() 的代理对象,在指定的类处启动 MRO 搜索

    根据文档 super cls obj returns 将方法调用委托给父级或同级的代理对象 cls 类型的类 我明白为什么super 提供此功能 但我需要稍微不同的东西 我需要创建一个代理对象 将方法调用 和属性查找 委托给类cls本身 和
  • 如何从“请告知 Microsoft 此事”对话框中获取错误报告?

    我编写的一个程序在启动时崩溃 Windows XP 对话框 请告诉 Microsoft 有关此问题的信息 出现 我想知道这个问题 因为这是我的应用程序 问题是 单击 单击链接 查看错误报告的内容 错误报告内容 对话框不允许我的客户将其内容复
  • Delphi:将数据存储在类与记录中,减少内存使用

    当应用程序运行时 我需要在内存中存储 读取和修改大量数据 数据可以比作一棵树 其中每个节点由有限数量的字符串和整数描述 并且具有相当多的子元素 目前数据是使用类 对象存储的 例如 TRootElement class fName fDesc
  • 使用 php 从像素计算图像大小(以英寸或 dpi 为单位)

    假设 300dpi 我需要计算近似的图像尺寸 以英寸为单位 我心中有一个目标图像大小 我想向用户展示他们上传的图像是否足够 或者是否需要拉伸 并据此提供各种条件消息 我已经有了以像素为单位的高度和宽度 只需要知道我猜的数学 DPI 每英寸点
  • 禁用单击按钮事件 C# [关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我在 Visual Studio 2013 C 中编程 我想要一个功能来短时间禁用按钮 我试过button Enabled false 但我发现当我在禁用期间单击它时 单击操作会在我在程序
  • 386的“D位”中的“D”代表什么?

    In 关于 GDT 的文章OSDev wiki 描述了用作 CS 描述符的 D 位的标志 如下所示 Sz 尺寸位 如果0选择器定义16位保护模式 如果1它定义了32位保护模式 您可以同时拥有 16 位和 32 位选择器 另一个问题引用了英特