You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARM64EC代码如何在ARM芯片上执行?Windows on ARM运行原理咨询

核心概念澄清:ISA与ABI的关联

首先明确二者的本质边界,这是理解所有问题的基础:

  • ISA(指令集架构) 是处理器硬件层面可直接识别执行的指令、寄存器、寻址模式的集合,A64就是ARMv8及以上架构的64位指令集,只要是符合A64规范的指令,都能在ARM64芯片上直接运行,和上层使用规则无关。
  • ABI(应用二进制接口) 是软件层面的约定,规定了二进制模块之间传递参数、使用栈空间、数据对齐、函数返回的规则,本质是对ISA提供的硬件资源的使用约定,本身不会改变指令的硬件合法性。

A64 ISA并没有强制绑定唯一的ABI,目前适配A64的主流ABI包括:常规ARM64 ABI(Windows on ARM、Linux AArch64默认使用,遵循ARM官方调用约定)、ARM64EC ABI(微软为x64兼容性自定义的ABI)、ARM64X/SE等特殊兼容场景ABI,所有这些ABI的代码最终都会编译为合法A64指令,都可以在ARM64芯片上原生运行。


ARM64EC可原生运行的原因

你之前的误解是把「适配x64约定」等同于「输出x64指令」,实际ARM64EC的编译逻辑是:
编译器根据ARM64EC的ABI规则,把源码直接编译为合法的A64指令,只是这些指令对寄存器、栈的使用规则向x64 ABI对齐,比如参数传递顺序、栈帧结构、函数名修饰规则都和x64保持一致,而非使用常规ARM64 ABI的规则。
举个简单例子:常规ARM64 ABI用X0-X3寄存器传递前4个参数,x64 ABI用RCX、RDX、R8、R9传递前4个参数,ARM64EC就是让生成的A64指令传参时用X0对应RCX、X1对应RDX,以此类推符合x64的参数位置约定,但所有指令都是原生A64指令,完全不需要模拟就能直接运行。


ARM64EC与模拟x64代码的互操作逻辑

二者的核心差异是指令类型和执行路径不同:

  • 纯x64代码输出的是x64指令,ARM芯片无法直接识别,必须通过系统内置的x86/64模拟器将x64指令动态转译为A64指令才能运行,存在固定转译开销。
  • ARM64EC输出的是原生A64指令,无转译开销,可直接执行。

系统确实会在内部做适配转换,也就是微软内置的thunk中间层:
当ARM64EC代码调用x64模拟代码时,thunk层会把ARM64EC已经按x64规则排列的参数直接传给模拟器,不需要额外做参数格式转换;反过来x64模拟代码调用ARM64EC代码时,模拟器已经把x64的调用参数按x64规则排列完成,ARM64EC代码可以直接读取使用,也不需要转换,因此二者可以无缝互操作。
二者需要区分的核心原因是性能差异:纯x64代码有转译开销,ARM64EC无性能损失,二者混用的模式允许开发者逐步把原有x64应用的核心性能敏感模块重编译为ARM64EC,不需要全量重写应用就能拿到原生运行性能。

内容的提问来源于stack exchange,提问作者Ztrew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:45:03