为什么 mov 不能设置代码段寄存器 CS,尽管它可以设置其他寄存器?

2023-12-08

我需要知道使用 mov 指令直接加载代码段寄存器是否有任何限制。

在从实模式切换到保护模式时,这一点让我印象深刻。我发现为了将正确的值放入代码段中,使用“跳转”指令来设置正确的段。

那么跳转指令的这种使用是否是由于任何这样的限制?为什么我们不能直接将值加载到代码段中?


设置 CS 会be跳转,因为代码获取发生在 CS:IP(或 CS:RIP/EIP)。

这是有道理的,这样做仅限于jmp far / call far / ret far和其他控制转移指令。

更改 CS 而不更改 IP 会很奇怪:假设的下一条指令之后执行mov cs, ax指令将是new_CS_base:old_IP+2(因为mov cs,ax如果不使用操作数大小前缀,则长度为 2 个字节。)

当然,您可以进行设置,以便您的代码位于相对于两个不同段基的相同 IP 偏移量,但事实是pop cs是一个跳跃pop ds不是只是奇怪。强制您同时设置 CS 和 IPjmp对我来说似乎很理智/正常。

有关的:是否可以在 8086 汇编中操作指令指针?.
Intel 8086汇编中CS和IP寄存器的用途是什么?


请记住,386 保护模式是一种扩展;在实模式下CSvalue直接用作段基 =cs<<4. 加载具有相同基数的新描述符的用例是 386 中的新用例。(实际上是286保护模式)。在此之前,并没有真正的用例mov cs, r/m16 or pop cs操作码,因此英特尔保留这些指令编码用于其他用途。

无需支持,从而简化了未来的 CPUmov cs, r/m or pop cs作为必须丢弃预取代码的跳转指令。

(在 8086 的一些早期版本中,pop cs确实存在,遵循与push/pop其他段寄存器,并且它有操作码0x0f,但英特尔明智地决定保留0F用作未来 x86 CPU 中多字节操作码的转义字节。如果改变CS段寄存器会发生什么? (你会怎么做?)).


在保护模式下更改 CS 比在实模式下更不常见(主流操作系统使用平面内存模型),因此绝对没有必要开始支持mov到CS。jmp far工作得很好,而且事实上更好,因为你不需要确保IP / EIP相对于段基址的偏移量前后相同。

正如 Margaret 指出的,CS 选择器的低 2 位是 286 或 386 保护模式(如 x86-64 长模式)中的当前权限级别,因此通常仅在您想要执行不同的代码而不是继续执行时才执行此操作不管接下来发生什么。这种特殊情况通常只在从实模式转换到保护模式期间出现,您可能希望加载 CS 以进入 32 位模式,而根本不改变代码获取的来源。但是改变 CS 本质上会更新 CS 基地址,所以即使允许mov cs, reg不会让这变得更容易。

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

为什么 mov 不能设置代码段寄存器 CS,尽管它可以设置其他寄存器? 的相关文章

  • 如何禁用浮点单元(FPU)?

    我想在 x86 系统中禁用 FPU MMX SSE 指令 并且我将为设备不可用异常实现一个处理程序 我已经提到过控制寄存器 wiki 页面 http en wikipedia org wiki Control register 看来我必须在
  • 英特尔® 事务同步扩展新指令 (TSX-NI) 与英特尔 TSX 有何不同?

    我在Intel的页面上找到了 https ark intel com products 97123 Intel Core i5 7500 Processor 6M Cache up to 3 80 GHz https ark intel c
  • MASM 字符串反转

    好吧 我正在讨论这个问题 可能是一个非常复杂的解决方案 但这是我脑海中浮现的第一件事 我需要编写一个汇编语言程序来反转 源 字符串 而不使用 目标 字符串 临时变量 这是我的尝试 INCLUDE Irvine32 inc data sour
  • C/C++ 中的简单“Hello World”内联汇编语言程序

    我使用 devcpp 和 borland c 编译器 asm mov ax 4 I O Func mov bx 1 Output func mov cx name address of the string mov dx 6 length
  • x86 平台中的 KVM 影子页表处理

    据我了解 在没有硬件支持来宾虚拟到主机物理地址转换的处理器上 KVM 使用影子页表 当来宾操作系统修改其页表时 会构建和更新影子页表 硬件中有没有专门的指令 以x86为参考 来修改页表 除非有特殊说明 否则不会对VMM 造成陷阱 Linux
  • 使用 gdb 调试反汇编库

    在Linux和Mac OS X中可以使用strapi和next来调试应用程序而无需调试信息 在 Mac OS X 上 gdb 显示在库内部调用的函数 尽管有时会在每个 stepi 指令中推进多个汇编程序指令 在 Linux 上 当我进入动态
  • 为什么这个 C++ 包装类没有被内联掉?

    EDIT 我的构建系统出了问题 我还在弄清楚到底是什么 但是gcc产生了奇怪的结果 尽管它是 cpp文件 但是一旦我使用了g 然后它按预期工作 对于我一直遇到麻烦的事情来说 这是一个非常精简的测试用例 其中使用数字包装类 我认为会内联 使我
  • 一条指令可以同时处于两种寻址模式吗?

    我在书中读到了以下内容从头开始编程 处理器有多种不同的访问数据的方式 称为 寻址模式 最简单的模式是立即模式 其中 要访问的数据嵌入在指令本身中 例如 如果我们想将寄存器初始化为 0 而不是给出 计算机要从中读取 0 的地址 我们将指定立即
  • 这段汇编语言代码是什么意思?

    我是一名学生 刚刚开始学习汇编语言 为了更好地理解它 我只是用 C 写了一个简短的代码并将其转换为汇编语言 奇怪的是我有点听不懂 代码是 include
  • 什么时候汇编比C更快? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • Clang 使用 -nostdlib 生成崩溃代码

    我正在尝试为可执行文件设置自己的运行时环境 但无法使用 clang v3 4 1ubuntu1 目标 x86 64 pc linux gnu 来生成没有段错误的可执行文件 我已将问题简化为以下内容 如果我有一个文件 crt1 c 除了满足
  • 即使我确实为变量设置了初始值,数据段也没有被初始化

    我已经编写了一个代码 该代码应该生成某种数字列表 但是即使我为它们分配了初始值 我的数据段变量也没有被初始化 This is how DS 0000 looks when I run it 这是我的代码 但数据段只保留垃圾值 MODEL s
  • 如何让c代码执行hex机器代码?

    我想要一个简单的 C 方法能够在 Linux 64 位机器上运行十六进制字节码 这是我的 C 程序 char code x48 x31 xc0 include
  • 在 x86 程序集中将整数打印到控制台

    当我在 16 位汇编中添加两个值时 将结果打印到控制台的最佳方法是什么 目前我有这个代码 CODE START mov ax 1 put 1 into ax add ax 2 add 2 to ax current value mov ah
  • 汇编-符号标志和奇偶校验标志

    我不明白什么时候设置标志标志 什么时候设置奇偶校验 据我所知 符号标志表示运算结果的符号 0表示正数 1表示负数 那么为什么在下一个代码中 mov al 5 sub al 124 SF为零 结果是负数 关于PF 为什么a和b中设置了PF a
  • 内联 asm 中不支持的指令“mov”将控制寄存器移动到 uint32_t

    我在 C 函数中使用汇编代码 但海湾合作委员会给出unsupported instruction mov 以下代码的错误 uint32 t faulting address asm volatile mov cr2 0 r faulting
  • 将两个 32 位整数向量相乘,生成 32 位结果元素向量

    将每个 32 位条目乘以 2 的最佳方法是什么 mm256i互相注册 mm256 mul epu32不是我正在寻找的 因为它产生 64 位输出 我想要每个 32 位输入元素都有一个 32 位结果 而且 我确信两个 32 位值的乘法不会溢出
  • 为什么 Solaris 汇编器生成的机器代码与 GNU 汇编器在这里不同?

    我为 amd64 编写了这个小汇编文件 对于这个问题来说 代码的作用并不重要 globl fib fib mov edi ecx xor eax eax jrcxz 1f lea 1 rax ebx 0 add rbx rax xchg r
  • 为什么 Visual Studio 使用 xchg ax,ax

    我正在查看程序的反汇编 因为它崩溃了 并注意到很多 xchg ax ax 我用谷歌搜索了一下 发现它本质上是一个 nop 但是为什么 Visual Studio 会执行 xchg 而不是 noop 该应用程序是一个C NET3 5 64位应
  • 为什么 RISC-V S-B 和 U-J 指令类型以这种方式编码?

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

随机推荐

  • 当密钥未翻译时使用默认语言后备

    我可以使用默认语言 例如英语 作为其他语言的 Localized strings 文件中的未翻译键吗 为此 您可以使用英文单词作为 Localized strings 文件中的键 另一种方法是检查 NSLocalizedString 的结果
  • 如何在悬停子元素时更改父元素的颜色

    我有一个带有社交链接的 div 当悬停任何具有不同颜色的锚点时 我想使背景颜色填充整个 div 具体取决于悬停的链接 目前 背景仅在锚文本下方发生变化 我正在研究使用纯 CSS 为整个父级填充子级背景颜色的方法 social width 4
  • JPA:如何在静态 JPA 元模型中对 NUMBER 列执行 LIKE?

    我确实有一个带有 NUMBER 实际上是 BigDecimal 不要问为什么 列的静态元模型 现在我想对该数字列进行 LIKE 查询 CriteriaBuilder cb cb like entity get Entity numberco
  • 如何链接多个 Promise?

    我不太确定 也许我错过了一些明显的东西 但我不知道如何链接两个承诺 我的基于回调的代码看起来像这样 async series function cb Create the directory if the nodir switch isn
  • 为什么 Erlang 中阶乘不会溢出堆栈?

    module demo export factorial 1 factorial 0 gt 1 factorial N gt N factorial N 1 阶乘不是尾递归 但为什么它不会溢出堆栈 我能够在没有堆栈溢出的情况下获得 100
  • 将未定义的类设为友元,然后再定义它

    交一个不认识的朋友 template
  • 一次性更改多个文件的 EOL

    Notepad 或者甚至使用其他工具 有什么方法可以自动更改行结尾一次性处理多个文件 即转换 Windows EOL 的混合 CRLF 和 UNIX EOL LF 文件全部为 Windows EOL CRLF The Replace对话框可
  • 将 printf 重定向到两个流

    我正在扩展一个现有的 C 项目 将所有信息打印到stdout with printf 我希望将此信息打印到标准输出和日志文件 如果我是原始项目的贡献者 我会替换所有printf使用我的自定义日志函数进行调用 唉 我不是 所以这是我的问题 是
  • SQL 包含问题

    谁可以给我解释一下这个 我有两个查询及其结果如下 query select from tbl where contains name he AND ca 结果集 赫兹租车 海明威的小酒馆 query select from tbl wher
  • Unity 3D/球体中的翻转法线

    我已经为我的游戏编写了这段代码 我想要的是统一翻转纹理上的法线 我有一个模型和一个纹理 希望纹理位于球体模型内部而不是外部 我想通过在翻转纹理顶部的球体内部的图像周围移动相机来创建 360 度全景效果 现在 当我第一次按下播放按钮时 它运行
  • PHP domDocument 删除子节点的子节点

    如何删除子节点的父节点 但保留所有子节点 XML 文件是这样的
  • 插入一行并避免竞争条件 (PHP/MySQL)

    我正在开发一款多人游戏 该游戏有一个类似大厅的区域 玩家可以选择要进入的 区域 大厅网关由 PHP 提供支持 而实际的游戏玩法则由一台或多台 Java 服务器处理 数据存储是MySQL 幸福之路 玩家选择一个区域并告诉大厅他想进入 大厅检查
  • 如何使用 PowerShell 导出特定的 Excel 列?

    我有一个包含多列的 Excel 我想将一些特定列导出到 xlsx文件 但它导出 Excel 的前 3 列 而不是具有特定标题的列 Host CPU usage Memory usage SourceFileDirectory C TEMP
  • 使用方法为案例类生成伴随对象(字段 = 方法)

    使用 scala macros 为案例类生成伴随对象 我尝试过的一些代码示例 它有效 我可以获取元组列表 名称 gt 类型 但如何在同一范围内生成对象 import c universe val tpe weakTypeOf T val f
  • 从 R 中的函数写入全局环境

    我是 R 新手 在理解如何处理本地和全局环境方面遇到一些困难 我检查了Post关于局部和全局变量 但无法弄清楚 例如 如果我想使用一个函数绘制几张图并像这样保存它们 PlottingFunction lt function type typ
  • 嵌套 CSS 网格布局在 Chrome 和 Firefox 中的不同行为

    我正在尝试使用 CSS 网格布局来模拟一些响应行为 特别是 grid template columns repeat auto fill minmax 250px 1fr 我的例子https codepen io elgs pen goNx
  • 删除评论标签但不满足于 BeautifulSoup

    我正在使用 BeautifulSoup 练习一些网页抓取 特别是我正在查看 NFL 比赛数据 更具体地说是本页上的 球队统计 表 https www pro football reference com boxscores 20180906
  • 如何将 IceFaces 组件映射到 java.util.Calendar 字段?

    有谁知道如何组件
  • HttpURLConnection c = URL.openConnection(); c.setRequestProperty() 不起作用

    这里的代码是一个普通的Java应用程序 而不是Android应用程序 它旨在将C2DM消息发送到具有YOUR REGISTRATION STRING的设备 作为具有auth key的开发人员 问题如下所述 import java io Bu
  • 为什么 mov 不能设置代码段寄存器 CS,尽管它可以设置其他寄存器?

    我需要知道使用 mov 指令直接加载代码段寄存器是否有任何限制 在从实模式切换到保护模式时 这一点让我印象深刻 我发现为了将正确的值放入代码段中 使用 跳转 指令来设置正确的段 那么跳转指令的这种使用是否是由于任何这样的限制 为什么我们不能