64 位架构中的汇编寄存器

2023-11-26

回答有关汇编寄存器大小的问题:

  • 首先,尺寸是多少eax, ax, ah以及 64 位架构中的对应产品?如何访问单个寄存器的字节以及如何访问所有64位寄存器的八个字节?

    我希望双方都受到关注x86-64 (x64) and Itanium处理器。

  • 其次,使用四个寄存器来保存函数调用中的前四个参数的正确方法是什么新的调用约定?


带着旧名字所有寄存器保持相同的大小,就像 x86-16 扩展到 x86-32 时一样。要访问 64 位整数寄存器,您可以使用新名称R-prefix例如拉克斯、RBX...

寄存器名称不会改变,因此您只需使用字节寄存器(al、bl、cl、dl、ah、bh、ch、dh) 的 LSB 和 MSB斧头、bx、cx、dx像以前一样。

还有8 个新寄存器 called r8-r15。您可以通过添加后缀来访问它们的 LSBb (or l如果您使用的是 AMD)。例如r8b、r9b、r10l、r11l...您还可以使用 LSBESI、EDI、ESP、EBP按名字西尔、迪尔、spl、bpl与新的REX 前缀,但不能同时使用它ah、bh、ch 或 dh.

同样,新寄存器的最低字或双字可以通过后缀访问w or d.

Update:英特尔刚刚推出了x86-64 的新扩展 called APX添加了 16 个寄存器,名为 r16-r31

所以通用寄存器列表是这样的:

64-bit register Lower 32 bits Lower 16 bits Lower 8 bits
rax eax ax al
rbx ebx bx bl
rcx ecx cx cl
rdx edx dx dl
rsi esi si sil
rdi edi di dil
rbp ebp bp bpl
rsp esp sp spl
r8 r8d r8w r8b (r8l)
r9 r9d r9w r9b (r9l)
r10 r10d r10w r10b (r10l)
r11 r11d r11w r11b (r11l)
r12 r12d r12w r12b (r12l)
r13 r13d r13w r13b (r13l)
r14 r14d r14w r14b (r14l)
r15 r15d r15w r15b (r15l)
r16 (with APX) r16d r16w r16b (r16l)
r17 (with APX) r17d r17w r17b (r17l)
... ... ... ...
r31 (with APX) r31d r31w r31b (r31l)

当然还有其他类型的寄存器,例如control, debug, flag、浮点、向量、段、测试...寄存器。欲了解更多详情,请检查https://wiki.osdev.org/CPU_Registers_x86。也可以看看新的 X86_64 处理器寄存器的名称是什么?


Regarding the calling convention, on each specific system there's only one convention1.

  • 在 Windows 上:

    • RCX、RDX、R8、R9 表示前四个整数或指针参数
    • XMM0、XMM1、XMM2、XMM3 用于浮点参数


    1Since MSVC 2013 there's also a new extended convention on Windows called __vectorcall so the "single convention policy" is not true anymore.

  • 在 Linux 和其他后续系统上系统 V AMD64 ABI,可以在寄存器上传递更多参数,并且有一个 128 字节red zone位于堆栈下方,这可能会使函数调用更快。

    • 前六个整数或指针参数在寄存器 RDI、RSI、RDX、RCX、R8 和 R9 中传递
    • 浮点参数在 XMM0 到 XMM7 中传递

欲了解更多信息,请阅读x86-64 and x86-64 调用约定

还有一个约定用于Plan 9 where

  • 所有寄存器均由调用者保存
  • 所有参数都在堆栈上传递
  • 返回值也返回到堆栈上,位于参数下方(堆栈方式;amd64 上的较高地址)保留的空间中。

Golang 遵循 Plan 9 调用约定,但从 go 1.17+ 开始,他们逐渐引入了基于寄存器的调用约定为了更好的性能。调用约定将来可能会发生变化,编译器可以生成存根以自动调用旧约定中的汇编函数。眼下ABI 规定

  • 9 个通用寄存器将用于传递整数参数:RAX、RBX、RCX、RDI、RSI、R8、R9、R10、R11
  • 15 个寄存器 XMM0-XMM14 用于浮点参数

In fact Plan 9 was always a weirdo. For example it forces a register to be 0 on RISC architectures without a hardware zero register. x86 register names on it are also consistent across 16, 32 and 64-bit x86 architectures with operand size indicated by mnemonic suffix. That means ax can be a 16, 32 or 64-bit register depending on the instruction suffix. If you're curious about it read

  • A Manual for the Plan 9 assembler
  • Go/plan9’s assembler is weird

OTOH Itanium is a 完全不同的架构与 x86-64 没有任何关系。它是纯 64 位架构,因此所有普通寄存器都是 64 位,没有 32 位或更小的版本可用。里面有很多寄存器:

  • 128 个通用整数寄存器 r0 到 r127,每个寄存器承载 64 个值位和一个陷阱位。稍后我们将了解有关陷阱的更多信息。
  • 128 个浮点寄存器 f0 到 f127。
  • 64 个谓词寄存器 p0 到 p63。
  • 8 个分支寄存器 b0 到 b7。
  • 指令指针,Windows 调试引擎出于某种原因将其称为 iip。 (多出来的“i”是“疯狂”的意思?)
  • 128个特殊用途寄存器,并非所有寄存器都已被赋予含义。由于某种原因,这些被称为“应用程序寄存器”(ar)。我将讨论讨论期间出现的选定寄存器。
  • 其他杂项寄存器我们不会在本系列中介绍。

安腾处理器,第 1 部分:预热

阅读更多内容x64 和 IA-64 有什么区别?

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

64 位架构中的汇编寄存器 的相关文章

随机推荐

  • 当我想要选择物品来尽可能填满容器时,它叫什么 - 我应该使用什么算法?

    我有一个问题如下 给定的物品类型重量为 w1 w2 w3 wn 每一项的 这些类型的数量是无限的 你有一个能够承载重量W的容器 找到具有最大权重总和的项目组合 将装入容器中且不超过最大重量 W 例如 我有三种类型的带有重量的物品 w 5 w
  • PHPMailer 无法连接到 SMTP 主机

    出现以下错误 SMTP gt 错误 无法连接到服务器 php network getaddresses getaddrinfo 失败 不知道这样的主机 0 SMTP 错误 无法连接到 SMTP 主机 发送此邮件时出现问题 这是我的配置文件设
  • 在控制台中禁用 Rails SQL 日志记录

    当我在控制台中执行命令时 有没有办法禁用 SQL 查询日志记录 理想情况下 如果我可以禁用它并使用控制台中的命令重新启用它 那就太好了 我正在尝试调试某些内容并使用 puts 打印出一些相关数据 然而 sql 查询输出使其难以阅读 Edit
  • 测试失败+异常的截图

    你们中有人知道对测试失败和异常进行屏幕截图的可能解决方案吗 我在中添加了以下代码TearDown 但结果它也会对通过的测试进行截图 所以这不是最好的解决方案 DateTime time DateTime Now string dateTod
  • 作为服务器进程读取 Excel 文件

    我正在尝试找到一种适当的方法来读取 NT 服务器操作系统上的 Excel 文件的内容 我在使用 Excel API 时遇到了很多问题 然后遇到了官方微软办公自动化其中指出 Excel API 不适合 Excel 自动化 我看到的问题与文章中
  • 防止 AngularJS 中的退格键导航回来

    我在 AngularJS Web 应用程序中遇到了这个问题 当用户进入需要填写表单的页面并开始输入时 如果他按退格键并且焦点不在输入文本上 则页面将转到之前的状态 我抬头这个解决方案使用 jQuery 但这似乎不是在 AngularJS 中
  • Eclipse 中的 Tomcat:它运行但在启动过程中超时

    我正在使用 Tomcat 7 在 Eclipse Helios 中运行 java web 应用程序 服务器成功启动 指示了持续时间 但是 Eclipse 的进度条仍然旋转 表示 Tomcat 正在启动 最终达到超时并抛出错误 我相信 Tom
  • C++:为什么 bool 是 8 位长?

    在 C 中 我想知道为什么 bool 类型是 8 位长 在我的系统上 而只有一位就足以保存布尔值 我曾经认为这是出于性能原因 但是在 32 位或 64 位机器上 寄存器为 32 或 64 位宽 性能优势是什么 或者这只是这些 历史 原因之一
  • 单击时更改锚点的颜色

    我希望当我单击此链接时 它的颜色会更改为给定的颜色 li a href Press a li CSS 声明 active将实现你所追求的 http www w3schools com CSS pr pseudo active asp Exa
  • 在 Django 管理更改/添加页面中显示外键数据

    我试图让一个模型的属性显示在另一个模型的 Django 管理更改 添加页面中 这是我的模型 class Download model Model task models ForeignKey Task class Task model Mo
  • 重现RabbitMQ网络分区场景

    我想重现网络分区场景具有所有三种模式 ignore autoheal and pause minority 我怎样才能实现这个目标 我尝试停止 sbin service restart 集群的节点之一 但这并没有导致任何网络分区 我还尝试删
  • 在 Android 中以编程方式打开 ServiceMode 菜单

    如何打开安卓服务模式在三星手机上以编程方式菜单 手动的话 我可以通过拨打ussd代码 0011 来完成 这是一个挑战 我花了几个小时寻找解决方案 但恐怕我没有好消息 1 第一次尝试 Intent ACTION DIAL 确实 一开始 可以直
  • R-更改数据框中列的编码?

    我正在尝试更改数据框中列的编码 stri enc mark data updated text 1 UTF 8 ASCII ASCII UTF 8 ASCII ASCII UTF 8 UTF 8 UTF 8 10 ASCII ASCII U
  • not() 和ends-with() 的Xpath 错误

    我有以下 Xpath 表达式 not input ends with Copyright 我希望它能够为我提供所有元素 输入除外 以及以 版权 结尾的任何属性值 我在 Selenium 2 Java API 中执行它webDriver fi
  • C++ 中 min 和 max 函数的使用

    从 C 来看 有std min and std max优于fmin and fmax 为了比较两个整数 它们提供基本相同的功能吗 您是否倾向于使用这些函数集中的一组 还是更喜欢编写自己的函数 也许是为了提高效率 可移植性 灵活性等 Note
  • ClassNotFoundException:net.sourceforge.jtds.jdbc.Driver

    我有连接到 MS SQL 数据库并获取一些数据的 java 代码 在运行代码之前 我在 Unix 服务器中设置了类路径 它以前工作得很好 但由于某种原因 几天前运行的同一个 jar 文件抛出了 Class not found 异常java
  • 不带 typedef 关键字的结构

    我目前正在学习有关structC 中的数据结构以及如何在该结构前加上typedef关键词 这会导致实际结构的变量名称被放置在不同的命名空间中 如几个不同参考文献中所述 C 中 struct 和 typedef struct 的区别 type
  • 如何使用 Cocoa 标记文件和文件夹

    我想用某种颜色 图像 标记文件和文件夹 如何才能实现这一目标 我尝试使用图标服务 它适用于文件 但不适用于文件夹 我看到这种行为有效Dropbox 10 4 10 5 和 10 6 如何做到这一点 博客文章Cocoa 教程 自定义文件夹图标
  • 平面文件与数据库 - 速度?

    我正在制作一个聊天程序 我需要一个地方来存储消息 客户端将每隔 x 秒与服务器联系一次最后收到的消息 id 服务器将在客户端加入的房间中查找 id 高于该 id 的所有消息 由于我不会永远存储内容 因此我正在考虑使用仅包含最后 40 条左右
  • 64 位架构中的汇编寄存器

    继回答有关汇编寄存器大小的问题 首先 尺寸是多少eax ax ah以及 64 位架构中的对应产品 如何访问单个寄存器的字节以及如何访问所有64位寄存器的八个字节 我希望双方都受到关注x86 64 x64 and Itanium处理器 其次