关注answer about assembly registers' sizes:
首先,在64位架构中,eax
,ax
,ah
及其对应的大小是多少?如何访问单个寄存器的字节以及如何访问所有64位寄存器的8个字节?
我很想关注 x86-64(x64)和 Itanium 处理器。
第二,在the new calling convention的函数调用中使用四个寄存器保存前四个参数的正确方法是什么?
答案 0 :(得分:26)
旧名称所有寄存器的大小保持不变。要访问64位寄存器,请使用带有R-prefix的新名称,例如rax,rbx ......
寄存器名称不会改变,所以你只需要使用字节寄存器(al,bl,cl,dl,ah,bh,ch,dh)作为之前的ax,bx,cx,dx的LSB和MSB。 / p>
还有 8个新寄存器,名为r8-r15。您可以通过添加后缀b
(或l
if you're using AMD)来访问其LSB。例如r8b,r9b ......您也可以使用名称sil,dil,spl,bpl和新REX prefix的esi,edi,esp,ebp的LSB,但不能同时使用它与啊,bh,ch或dh。
同样,新寄存器的最低字或双字可以通过后缀w
或d
访问。
What are the names of the new X86_64 processors registers?
关于调用约定,在特定系统上只有只有一个约定 1 。
1 自MSVC 2013起,Windows上还有一个名为__vectorcall
的新扩展约定。
这些是x86_64最基础的。您还应该read this
OTOH Itanium是完全不同的架构,与x86_64无关。它是纯64位架构,因此所有普通寄存器都是64位,没有32位或更小的版本。里面有很多寄存器:
- 128个通用整数寄存器r0到r127,每个寄存器携带64个值位和一个陷阱位。我们稍后会详细了解陷阱位。
- 128个浮点寄存器f0到f127。
- 64个谓词寄存器p0到p63。
- 8个分支寄存器b0到b7。
- 一个指令指针,由于某种原因Windows调试引擎调用iip。 (额外的“我”是为了“疯狂”?)
- 128个专用寄存器,并非所有寄存器都有意义。由于某些原因,这些被称为“应用程序寄存器”(ar)。我将在讨论期间介绍选定的注册表。
- 我们将不会在本系列中介绍其他杂项寄存器。
https://blogs.msdn.microsoft.com/oldnewthing/20150727-00/?p=90821