【问题标题】:Assembly registers in 64-bit architecture64 位架构中的汇编寄存器
【发布时间】:2014-01-05 10:00:10
【问题描述】:

关注answer about assembly registers' sizes

  • 首先,在 64 位架构中,eaxaxah 及其对应物的大小是多少?如何访问单个寄存器的字节以及如何访问所有 64 位寄存器的 8 个字节?

    我很想关注 x86-64 (x64)Itanium 处理器。

  • 二、在the new calling convention中的函数调用中,使用四个寄存器保存前四个参数的正确方法是什么?

【问题讨论】:

  • hmm eax == 32bits ax == 16bits ah|al == 8bits,总是这样,x64 添加了新寄存器,回到 16 位时代,我们只有 ax & al & ah,然后当 32 位寻址出现时以一种不会真正影响您如何寻址 16 位或 8 位寄存器的方式添加,x64 中的新寄存器(重叠的 64 位寄存器,重叠 ax 的 eax 等)以 r 开头,所以 rax @987654333 @ 等等。 see here 了解更多信息。

标签: assembly x86-64 32bit-64bit cpu-registers itanium


【解决方案1】:

使用旧名称所有寄存器保持相同大小,就像 x86-16 扩展到 x86-32 时一样。要访问 64 位寄存器,请使用带有 R-prefix 的新名称,例如 rax、rbx...

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

还有 8 个新寄存器,称为 r8-r15。您可以通过添加后缀 b(或 l if you're using AMD)来访问它们的 LSB。比如r8b, r9b... 你也可以用名字sil, dil, spl, bpl的esi, edi, esp, ebp的LSB和新的REX prefix一起使用,但是不能和ah同时使用, bh, ch 或 dh。

同样可以通过后缀wd访问新寄存器的最低字或双字。

What are the names of the new X86_64 processors registers?


关于调用约定,在特定系统上只有一个约定1

  • On Windows:

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


    1自 MSVC 2013 以来,Windows 上还有一个名为__vectorcall新扩展约定,因此“单一约定政策”不再适用。

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

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

更多信息请阅读x86-64x86-64 calling conventions

Plan 9 中还有一个约定

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

事实上,Plan 9 一直都是个怪人。例如,它在没有硬件零寄存器的 RISC 架构上强制寄存器为 0。它上面的 x86 寄存器名称在 16、32 和 64 位 x86 架构中也是一致的,操作数大小由助记符后缀指示。这意味着 ax 可以是 16、32 或 64 位寄存器,具体取决于指令后缀。如果您对此感到好奇,请阅读


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

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

The Itanium processor, part 1: Warming up

阅读更多What is the difference between x64 and IA-64?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2020-06-07
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    相关资源
    最近更新 更多