assembly - 386的“D位”中的“D”代表什么?
问题描述
在GDT 的文章中, OSDev wiki 描述了用作 CS 描述符的 D 位的标志,如下所示:
Sz:尺寸位。如果为 0,则选择器定义 16 位保护模式。如果为1,则定义 32 位保护模式。您可以同时拥有 16 位和 32 位选择器。
另一个问题引用了英特尔手册:代码段描述符中的 D 标志对 x86-64 指令有什么作用?它链接到 Intel 64 and IA-32 Architectures Software Developer's Manual Volume 3 [...]: System Programming Guide中的“3.4.5 Segment Descriptors”部分,阅读:
D/B(默认操作大小/默认堆栈指针大小和/或上限)标志
根据段描述符是可执行代码段、向下扩展数据段还是堆栈段执行不同的功能。(对于 32 位代码和数据段,该标志应始终设置为 1,对于 16 位代码和数据段,该标志应始终设置为 0。)
• 可执行代码段。该标志称为 D 标志,它指示段中指令引用的有效地址和操作数的默认长度。如果设置了标志,则假定 32 位地址和 32 位或 8 位操作数;如果清楚,则假定 16 位地址和 16 位或 8 位操作数。指令前缀 66H 可用于选择默认以外的操作数大小,前缀 67H 可用于选择默认以外的地址大小。
问题是,“D”代表什么?
解决方案
我找到了一份Intel 80386 Programmer's Reference Manual, 1987的副本,在16.1 How the 80386 Implements 16-Bit and 32-Bit Features中有以下描述:
允许 80386 在 32 位和 16 位地址和操作数大小上同样出色地工作的架构特性包括:
代码段描述符的 D 位(默认位),它决定了代码段指令的操作数大小和地址大小的默认选择。(在不使用描述符的实地址模式和 V86 模式下,默认为 16 位。)设置了 D 位的代码段称为 USE32 段;D位为零的代码段是USE16段。当所有指令使用相同大小的操作数和有效地址时,D 位消除了在指令中对操作数大小和地址大小进行编码的需要。
显式覆盖操作数大小和地址大小的默认选择的指令前缀(在保护模式以及实地址模式和 V86 模式下可用)。
单独的 32 位和 16 位门用于段间控制传输(包括调用门、中断门和陷阱门)。控制传输的操作数大小取决于门的类型,而不是传输指令的 D 位或前缀。
可用于 32 位和 16 位操作数和有效地址计算的寄存器。
数据段描述符的 B 位(大位),它决定了 CPU 用于隐式堆栈引用的堆栈指针(32 位 ESP 或 16 位 SP)的大小。
因此,“D 位”代表“默认操作数和地址大小”(用于代码段),“B 位”代表“大”(用于堆栈段)。
推荐阅读
- python - 如何定义和初始化一个 numpy 元组矩阵?
- sql-server - 如果使用视图,更新 Azure 搜索文档会更新我的数据库
- android - 关于 onCreate() 的问题?
- ruby - Ruby 等待进程退出
- android - 找不到builder.jar (com.android.tools.build:builder:3.0.1)
- node.js - NodeJs Express - 将请求参数传递给护照身份验证
- git - 致命:Git 不支持协议“https”
- javascript - 使用选择选项从 JSON 动态设置单选按钮
- ruby-on-rails - Rails 5: Get complete count of orders
- php - Reformat Plucked Date in Laravel Collective Select