assembly 64位体系结构中的汇编寄存器

8nuwlpux  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(107)

answer about assembly registers' sizes

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

我希望注意x86-64(x64)Itanium处理器。

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

w8rqjzmb1#

使用旧名称所有寄存器保持相同的大小,就像x86-16扩展到x86-32时一样。要访问64位整数寄存器,您可以使用带有R-prefix的新名称,例如 rax,rbx... *
寄存器名称不会改变,因此您只需像以前一样使用字节寄存器(a
l,bl,cl,dl,ah,bh,ch,dh*)来存储 ax,bx,cx,dx 的LSB和MSB。
还有8个新寄存器,称为 r8-r15。您可以通过添加后缀b(或l if you're using AMD)来访问其LSB。例如 * r8 b,r9 b,r10 l,r11 l... * 您也可以使用 esi,edi,esp,ebp 的LSB,名称为 sil,dil,spl,bpl,带有新的REX前缀,但不能同时使用 ah,bh,ch或dh
同样,新寄存器的最低字或双字可以通过后缀wd访问。

**更新:**英特尔刚刚推出了一个名为APXnew extension for x86-64,它增加了16个名为r16-r31的寄存器

因此,通用寄存器列表如下所示:
| 64-低32位|低16位|低8位| Lower 8 bits |
| --|--|--| ------------ |
| 埃克斯|斧头|阿尔| al |
| 埃布克斯|bx| BL| bl |
| 欧洲共同市场|cx| cl| cl |
| edx| dx| dl| dl |
| 埃西|si|银| sil |
| edi|迪|迪尔| dil |
| 欧洲银行|bp|英国石油公司| bpl |
| 尤指|SP| SPL| spl |
| r8d| R8W| r8b(r8l)| r8b (r8l) |
| r9d| r9w| r9b(r9l)| r9b (r9l) |
| r10d| r10w| r10b(r10l)| r10b (r10l) |
| r11d| r11w| r11b(r11l)| r11b (r11l) |
| r12d| r12w| r12b(r12l)| r12b (r12l) |
| r13d| r13w| r13b(r13l)| r13b (r13l) |
| r14d| r14w| r14b(r14l)| r14b (r14l) |
| r15d| r15w| r15b(r15l)| r15b (r15l) |
| r16d| r16w| r16b(r16l)| r16b (r16l) |
| r17d| r17w| r17b(r17l)| r17b (r17l) |
| ......这是什么?|......这是什么?|......这是什么?| ... |
| r31d| r31w| r31b(r31l)| r31b (r31l) |
当然,也有其他类型的寄存器,如控制,debugflag,浮点,向量,段,测试...寄存器。有关详细信息,请查看https://wiki.osdev.org/CPU_Registers_x86。参见What are the names of the new X86_64 processors registers?
关于 * 调用约定 *,在每个特定系统上只有一个约定1。

  • On Windows
  • RCX、RDX、R8、R9用于前四个整数或指针参数
  • XMM 0、XMM 1、XMM 2、XMM 3用于浮点参数

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

  • 在Linux和其他遵循System V AMD64 ABI的系统上,可以在寄存器上传递更多的参数,并且在堆栈下面有一个128字节的red zone,这可能会使函数调用更快。
  • 前六个整数或指针参数在寄存器RDI、RSI、RDX、RCX、R8和R9中传递
  • 浮点参数在XMM 0到XMM 7中传递

有关更多信息,请阅读x86-64和x86-64调用约定
Plan 9中还有一个约定:

  • 所有寄存器都是调用者保存的
  • 所有参数都在堆栈上传递
  • 返回值也在堆栈上返回,在下面保留的空间中(按堆栈; AMD 64上的更高地址)参数。

Golang follows the Plan 9 calling convention,但自go 1.17+以来,他们逐渐引入了register-based calling convention以获得更好的性能。调用约定将来可能会更改,编译器可以生成存根以自动调用旧约定中的汇编函数。目前the ABI specifies that

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

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

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

  • 128个通用整数寄存器r 0到r127,每个寄存器携带64个值位和一个陷阱位。稍后我们会了解更多关于陷阱的内容。
  • 128个浮点寄存器f0到f127。
  • 64Assert寄存器p0到p63。
  • 8个分支寄存器b 0到b7。
  • 一个指令指针,Windows调试引擎出于某种原因将其称为iip。(多出来的“i”代表“疯了”?)
  • 128个专用寄存器,并非所有寄存器都被赋予了意义。出于某种原因,这些被称为“应用寄存器”(ar)。我将在讨论期间讨论选定的登记册。
  • 本系列中不会涉及其他各种寄存器。

The Itanium processor, part 1: Warming up
阅读更多关于What is the difference between x64 and IA-64?

相关问题