返回

揭开 Windows 64 位与众不同的调用惯例之谜

windows

Windows 64 位:异类调用惯例的解析

导言

在 x86-64 架构中,调用惯例是定义函数调用机制的一组规则。当涉及到 Windows 64 位时,它采取了一条与其他操作系统不同的道路,创建了自己的独特惯例。本文将深入探讨这一差异的原因,影响和后果。

历史与技术根源

Windows 64 位的独特调用惯例起源于历史上对 IA-32 惯例的兼容性需求。在移植到 x86-64 架构时,微软决定保留 IA-32 的关键特性,例如隐式 this 指针分配给 rcx 寄存器。

另一方面,AMD 的 x86-64 ABI 规范是为了优化性能和代码大小而设计的,它采用了不同的寄存器分配和参数传递顺序。这些差异使得 Windows 64 位调用惯例与 AMD64 惯例不相容。

政治因素的潜在影响

除了技术因素外,政治因素也可能在 Windows 64 位调用惯例的差异中发挥了作用。微软作为业界巨头,对技术标准有很大的影响力。因此,它选择不遵循 AMD 的规范可能表明不愿意让步于竞争对手。

调用惯例差异详解

Windows 64 位和 AMD64 调用惯例的主要区别在于参数传递顺序:

  • Windows 64 位: rcxthis 指针)、rdxr8r9,堆栈上的其余参数
  • AMD64: rdithis 指针)、rsirdxrcxr8r9,堆栈上的其余参数

差异的影响

Windows 64 位调用惯例的差异带来了几个关键影响:

  • 二进制不兼容性: 它阻碍了在 Windows 64 位和遵循 AMD64 惯例的操作系统之间共享代码和库。
  • 潜在的性能开销: 由于需要转换参数顺序,Windows 64 位惯例可能会在某些情况下导致性能开销。
  • 生态系统分化: 它创造了 Windows 64 位的独特生态系统,该生态系统与遵循 AMD64 惯例的更广泛的 x86-64 生态系统分离。

结论

Windows 64 位采用与其他 x86-64 操作系统不同的调用惯例,这反映了历史、技术和政治因素的复杂交织。虽然这种差异为向后兼容性和性能带来了好处,但也限制了与其他生态系统的互操作性。

常见问题解答

  1. 为什么 Windows 64 位不遵循 AMD64 ABI 规范?
    答:出于与 IA-32 兼容性、性能考量和潜在的政治因素等原因。
  2. 参数传递顺序差异的影响是什么?
    答:二进制不兼容性、潜在的性能开销和生态系统分化。
  3. Windows 64 位调用惯例有什么好处?
    答:向后兼容性和保留 IA-32 中 rcx 作为隐式 this 指针的分配。
  4. AMD64 ABI 规范有什么好处?
    答:提高性能、减小代码大小和与其他遵循 AMD64 惯例的操作系统的互操作性。
  5. 这种差异是否会随着时间的推移而消失?
    答:不太可能,因为 Windows 64 位已经建立了庞大的生态系统,并且微软不太可能改变其惯例。