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

Assembly 64位体系结构中的汇编寄存器,assembly,x86-64,32bit-64bit,cpu-registers,itanium,Assembly,X86 64,32bit 64bit,Cpu Registers,Itanium,以下是: 首先,在64位体系结构中,eax、ax、ah及其对应物的大小是多少?如何访问单个寄存器的字节以及如何访问所有64位寄存器的八个字节 我希望大家对x86-64(x64)和安腾处理器都给予关注 第二,使用四个寄存器保存函数调用中前四个参数的正确方法是什么 使用旧名称时,所有寄存器的大小保持不变,就像x86-16扩展到x86-32时一样。要访问64位寄存器,请使用新名称,例如rax、rbx 寄存器名不会改变,所以您只需像前面一样为ax、bx、cx、dx的LSB和MSB使用字节寄存器(a

以下是:

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

    我希望大家对x86-64(x64)和安腾处理器都给予关注

  • 第二,使用四个寄存器保存函数调用中前四个参数的正确方法是什么


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

寄存器名不会改变,所以您只需像前面一样为ax、bx、cx、dx的LSB和MSB使用字节寄存器(al、bl、cl、dl、ah、bh、ch、dh)

还有8个名为r8-r15的新寄存器。您可以通过添加后缀
b
(或)来访问其LSB。例如r8b、r9b。。。您也可以使用esi、edi、esp、ebp的LSB,名称为sil、dil、spl、bpl,但不能与ah、bh、ch或dh同时使用

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


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

  • :

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

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

  • 在Linux和其他后续系统上,可以在寄存器上传递更多的参数,堆栈下面有一个128字节,这可能会加快函数调用速度

    • 前六个整数或指针参数在寄存器RDI、RSI、RDX、RCX、R8和R9中传递
    • 浮点参数在XMM0到XMM7之间传递
有关更多信息,请阅读和

在where中也有一个约定

  • 所有寄存器都已保存
  • 所有参数都在堆栈上传递
  • 返回值也在堆栈上返回,在参数下面保留的空间中(堆栈方向;amd64上的更高地址)
事实上,第九计划一直都是个怪人。例如,在没有硬件零寄存器的RISC架构上,它强制寄存器为0。它上面的x86寄存器名在16位、32位和64位x86体系结构中也是一致的,操作数大小由助记符后缀表示。这意味着ax可以是16、32或64位寄存器,具体取决于指令后缀。如果你对此感到好奇,请阅读


OTOH是一种完全不同的体系结构,与x86-64没有任何关系。它是一个纯64位体系结构,所以所有普通寄存器都是64位的,没有32位或更小的版本可用。其中有很多寄存器:

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


阅读更多关于

hmm
eax==32位
ax==16位
ah | al==8位
,总是这样的,x64添加了新的寄存器,在16位的日子里,我们只有
ax&al&ah
,然后当32位寻址出现时,它的添加方式并没有真正影响16位或8位寄存器的寻址方式,x64中的新寄存器(重叠的64位寄存器、重叠ax的eax等)以
r
so
rax
rbx
等开头。了解更多信息。