如何知道寄存器是否是“通用寄存器”?

2024-05-09

我试图了解寄存器必须具备什么标准才能被称为“通用寄存器”。

我相信通用寄存器是一个可以用于任何用途的寄存器(用于计算、将数据移入/移出等),并且是一个没有特殊用途的寄存器。

现在我读到了ESP寄存器是通用寄存器。我猜是ESP寄存器可以用于任何事情,但是ESP寄存器还有一个特殊的用途,那就是指向栈顶。

那么这是否意味着ESP寄存器是特殊用途寄存器吗?


期限通用寄存器(探地雷达)与特殊用途寄存器。后者不能在所有情况下使用。

从历史上看,旧的 8086 架构为名称中出现的整数寄存器引入了这种差异,直到今天:

  • AX = A累加器寄存器: 累加结果(**)
  • BX = BASE寄存器:某些指令的基址偏移量,例如XLAT http://felixcloutier.com/x86/XLAT:XLATB.html
  • CX = C计数器寄存器:循环计数,例如JCXZ http://felixcloutier.com/x86/Jcc.html.
  • DX = DATA寄存器:扩展数据范围,例如的结果MUL http://felixcloutier.com/x86/MUL.html位于 DX:AX
  • SI = S来源索引:字符串指令的来源,例如LODSB http://felixcloutier.com/x86/LODS:LODSB:LODSW:LODSD:LODSQ.html
  • DI = D目的地索引:字符串指令的目的地,例如STOSB http://felixcloutier.com/x86/STOS:STOSB:STOSW:STOSD:STOSQ.html
  • SP = S定位指针: 指向堆栈的当前项
  • BP = BASE指针:指向当前子程序的基址(堆栈帧)

(**) AX/AL 也是某种特殊用途寄存器。许多指令都有 AX/AL 作为操作数的特殊编码,例如加载段寄存器MOV http://felixcloutier.com/x86/MOV.html.

Other 特殊用途寄存器 were

  • 段寄存器(CS、DS、ES、SS)
  • 标志寄存器(FLAGS)和
  • 指令指针(IP)

其中一些限制至今仍在 16 位指令的寻址模式中使用。实模式 (See 英特尔® 64 和 IA-32 架构 软件开发人员手册 https://software.intel.com/en-us/articles/intel-sdm第 2 卷,第 2.1.5 节,表 2-1。 “ModR/M 字节的 16 位寻址形式”)


随着 32 位架构 - IA-32 的引入,整数寄存器的用途得到了扩展,并且(几乎)每个寄存器都可以用于每种用途(因此是通用用途)。这也反映在指令的寻址模式编码中,请参见英特尔手册第 2 卷,第 2.1.5 节,表 2.2。 (比较表2.1和表2.2以了解差异)

这些名称带有前缀E and an R to EAX and RAX分别表示用途,而它们的历史名称现在只是约定俗成的。

许多新架构中添加了新的专用寄存器。完整的概述在英特尔手册,第 1 卷,第 3.7.2 节。:

  • 32 位通用寄存器(EAX、EBX、ECX、EDX、ESI、EDI、ESP 或 EBP)
  • 16 位通用寄存器(AX、BX、CX、DX、SI、DI、SP 或 BP)
  • 8 位通用寄存器(AH、BH、CH、DH、AL、BL、CL 或 DL)
  • 段寄存器(CS、DS、SS、ES、FS 和 GS)
  • EFLAGS 寄存器
  • x87 FPU 寄存器(ST0 到 ST7、状态字、控制字、标记字、数据操作数指针和指令 指针)
  • MMX 寄存器(MM0 到 MM7)
  • XMM 寄存器(XMM0 到 XMM7)和 MXCSR 寄存器
  • 控制寄存器(CR0、CR2、CR3 和 CR4)和系统表指针寄存器(GDTR、LDTR、IDTR 和任务 登记)
  • 调试寄存器(DR0、DR1、DR2、DR3、DR6 和 DR7)
  • MSR寄存器

A 通用寄存器是一种可以用于多种目的的产品。这些目的是

  • value
  • 寻址
  • indexing
  • (数数)
  • (base)

A 段寄存器例如,只能保存段值,但不能用于加法。还有一个FPU寄存器只能保存浮点值,但不能用于寻址。

在 IA-32 中ESP寄存器更接近于通用寄存器因为它可以用于(几乎)所有上述目的:

  • 作为值:mov eax, esp
  • 在寻址中:mov eax, [esp+4], but notas(缩放的)索引,如mov eax, [4+esp*2]
  • 作为基础:mov eax, [esp + eax]
  • 作为计数:inc esp在跳转有效之前

唯一的例外是ESP那是(缩放)指数寻址不能被编码。它只能用作基址寄存器它特别用 SIB 字节进行编码(请参阅英特尔手册,第 2 卷,第 2.1.5 节,表 2.3 - 请参阅页脚)。

为了说明之间的编码差异ESP和其他寄存器(例如ECX):

8b 01         mov eax, [ecx]   ; MOV + ModRM (normal)
8b 04 24      mov eax, [esp]   ; MOV + ModRM + SIB byte
8b 41 04      mov eax, [ecx+4] ; MOV + ModRM + disp8
8b 44 24 04   mov eax, [esp+4] ; MOV + ModRM + SIB + disp8

我想尽管有这个例外ESP仍然可以算作一个GPR.

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

如何知道寄存器是否是“通用寄存器”? 的相关文章

随机推荐

  • 使用 keyup 事件仅触发表单验证中文本框的部分规则,并取消其余规则的事件

    我的应用程序中有一个表单 我正在使用 jQuery 表单验证插件对其进行验证 其中一项规则是远程类型 用于验证用户名是否不存在 我已经能够覆盖 onkeyup 事件 因此规则不会为我输入的每个字母发送到服务器 我完成的方式如下 var va
  • CLion 2019.2.1 工具链:未找到 WSL

    我通过 Windows 商店安装了 Ubuntu 然后按照此处的 Jetbrains CLion WSL 设置指南进行操作 https www jetbrains com help clion how to use wsl developm
  • 设计 Javascript 前端 <-> C++ 后端通信

    在我最近的将来 我将不得不制作一个具有 C 后端和 Web 前端的系统 要求 目前 我对此了解不多 我认为前端将触发数据传输 而不是后端 所以不需要类似 Comet 的东西 由于在该领域的经验可能很少 我非常感谢您对我所做的设计决策的评论
  • Rails - 使链接与 ajax 一起工作

    我有一个链接 应该使用 ajax 加载它旁边的部分内容 而无需重新加载页面 链接在这里 这是链接应该转到的控制器 class ProfilesController lt ApplicationController def profile f
  • 反转二进制网络

    如何反转二元方程 以便找到哪些输入将产生给定的输出 Example Inputs i0 through i8 Outputs o0 through o8 Operators XOR AND 二元方程 1 i0 1 i1 0 i2 1 i3
  • 用于真实 Web 项目的 Scala-JS [已关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有人用过吗Scala JS在真实的网络项目中 但不仅仅适用于普通的JavaScript在隔离环境中替换 我想尽可能多地使用 Scala 我希望可
  • JavaScript - 这个这个

    String prototype foo String prototype foo bar function How can you reference the grandparent string console log this par
  • 如何使用 terraform 创建 azure 应用程序注册和客户端密钥

    我正在尝试为 Azure 应用程序注册和客户端密钥创建 Terraform 代码 对订阅具有读取访问权限的服务主体 基本上 我正在尝试将 Azuresafe 与 Terraform 集成 并尝试确定如何逐步配置 https docs saf
  • 为什么这个 CSS nowrap 不起作用?

    我试图阻止 bar top container div 包裹它的内容 无论页面有多宽 即两个选择应该始终出现在同一行 但是当页面宽度太小而无法容纳它们时 这不起作用一方面 我该如何解决这个问题 Styles bar top containe
  • 不兼容的类型 - 是因为数组已经是指针吗?

    在下面的代码中 我创建一个基于书籍结构的对象 并让它保存多个 书籍 我设置的是一个数组 即定义 启动的对象 然而 每当我去测试我对指针的了解 实践有帮助 并尝试创建一个指向创建的对象的指针时 它都会给我错误 C Users Justin D
  • 如何得到将外力映射到广义力的矩阵?

    给定一个多体植物 我需要找到将外力 lambda 转换为广义力的矩阵 IE 以下方程中的 Phi 取自 Scott Kuindersma Frank Permenter 和 Russ Tedrake 的 稳定动态运动的有效可解二次规划 我的
  • 检查 href 中是否存在 jQuery 中的查询字符串

    我目前有一段 jQuery 用于附加带有一些位置信息的 URL jQuery a attr href function return this href location 123 abc 我的问题是大多数链接都有一个 其中使用上面的 就可以
  • 无法匹配任何路线。 URL 段:'':尝试使用子路由和 Ng2 时

    I have 以下笨蛋 https plnkr co edit PHaGNtfa0fPBgET4NEpZ p preview 这是行不通的 为了让它发挥作用 我可以评论 RouterModule forRoot path component
  • 显示带有 jQ​​uery-ui 自动完成功能的微调器

    我一直在到处搜索 但没有看到有人这样做 是否有可能拥有某种带有 jQ uery UI 自动完成功能的旋转器 加载器 1 8 获取数据时 我的解决方案是使用 ui autocomplete loading CSS 类 该类在 ajax GET
  • AngularUI Router:在调用子状态时将 url 参数传递给“抽象”状态

    我想在调用子状态时访问抽象状态内的 url 参数 stateParam 我很想知道如何做到这一点 代码在笨蛋也 http plnkr co edit L0TXx3DCBOJmh4XydXbV p preview stateProvider
  • 网页抓取 - 如何识别网页上的主要内容

    给定一个新闻文章网页 来自任何主要新闻来源 例如时报或彭博社 我想识别该页面上的主要文章内容 并丢弃其他杂项元素 例如广告 菜单 侧边栏 用户评论 在大多数主要新闻网站上都可以使用的通用方法是什么 有哪些好的数据挖掘工具或库 最好是基于Py
  • Phonegap 图像未显示

    我无法让图像在我的phonegap 版本中正常工作 我读过绝对路径可能不起作用 所以我尝试了绝对路径和相对路径 但仍然没有运气 我包括这样的图像
  • 什么是错误“类型实例化涉及 byref 类型。” F# 中的解决方法是什么

    我有一些代码包装 TA Lib 很多包装器非常相似 let sma timePeriod int data float let mutable outStartIndex 0 let mutable outNbElement 0 let m
  • Curl 和 Php 5.3.3 中的 SSL 连接错误

    我的网站自 3 年来一直运行良好 代码如下 现在突然从 2 天开始出现以下错误 SSL 连接错误 在 Curl error 中 下面是我的代码
  • 如何知道寄存器是否是“通用寄存器”?

    我试图了解寄存器必须具备什么标准才能被称为 通用寄存器 我相信通用寄存器是一个可以用于任何用途的寄存器 用于计算 将数据移入 移出等 并且是一个没有特殊用途的寄存器 现在我读到了ESP寄存器是通用寄存器 我猜是ESP寄存器可以用于任何事情