什么是ARM上的Windows RT本机代码调用约定? 我找不到任何关于VisualStudioC++中ARM调用约定的Windows RT文档。微软在使用ARM吗 [P>如果微软在ARM上使用Windows Application的APCS/EABI,它是否也使用(它是由ItAuthC++ C++ ABI派生的)?甚至可能是那个

什么是ARM上的Windows RT本机代码调用约定? 我找不到任何关于VisualStudioC++中ARM调用约定的Windows RT文档。微软在使用ARM吗 [P>如果微软在ARM上使用Windows Application的APCS/EABI,它是否也使用(它是由ItAuthC++ C++ ABI派生的)?甚至可能是那个,c++,winapi,windows-runtime,arm,calling-convention,C++,Winapi,Windows Runtime,Arm,Calling Convention,ARM上Windows RT使用的调用约定是否与其他(嵌入式)ARM Windows变体使用的调用约定不同 是否有可靠的方法通过预定义的编译器宏检测ARM上的Windows RT 更新:添加了关于C++ abi的问题。 < p>我只能回答第二个问题。 ARM上Windows RT使用的调用约定是否与其他(嵌入式)ARM Windows变体使用的调用约定不同 实际上有三个概念应该被理解。一个是ARM过程调用标准,另一个是ABI语言,第三个是系统调用约定。简单地说,ARM过程调用标准描述了序言/尾声

ARM上Windows RT使用的调用约定是否与其他(嵌入式)ARM Windows变体使用的调用约定不同

是否有可靠的方法通过预定义的编译器宏检测ARM上的Windows RT

更新:添加了关于C++ abi的问题。

< p>我只能回答第二个问题。

ARM上Windows RT使用的调用约定是否与其他(嵌入式)ARM Windows变体使用的调用约定不同

实际上有三个概念应该被理解。一个是ARM过程调用标准,另一个是ABI语言,第三个是系统调用约定。简单地说,ARM过程调用标准描述了序言/尾声中寄存器的使用。语言ABI描述了如何传递语言变量。例如,一个双精度、一个长长度、这个指针、
动态转换
,等等。第一个用于将汇编程序与编译器连接起来,第二个用于编译器互操作性。第三个问题是如何进行操作系统调用

ARM程序调用标准 本文档有助于理解一些ARM变体。基于四种不同的选择,共有16种变体

  • 32位vs 26位PC-所有2000年后版本将使用32位
  • 堆栈限制检查-可能重新表述为MMU或无MMU
  • 浮点运算-大约在2005年之后在大多数CPU上都支持
  • 可重入者与不可重入者——纯粹的软件选择;共享库
  • 因此,虽然有16种理论变体,但对于使用MMU的现代系统,只有两种。wiki提供了一些Linux/gcc发行版的信息。我猜Window-RT使用的是硬浮点,因为他们不想为支持过时的硬件而付出性能代价。最后,很难想象WindowsRT中不存在共享库或DLL支持。因此ARM过程调用标准似乎与Linux硬浮点ABI完全相同

    “C/C++”ABI 定义了语言如何将高级函数/方法映射到低级细节。名称损坏确保符号具有规范名称,从而可以进行交叉工具链接AAPCS工具理论上应该相互操作,但支持库和其他系统级接口可能会出现问题

    OABI/EABI wiki提供了一些关于这个标准的信息。使用MMU的操作系统将使用一些调用从用户模式转换到系统模式。通常,这些是仅用于库的功能,不属于编译器的一部分。但是,您肯定可以找到一些使用OABI约定的ARM系统。由于微软的ARM游戏已经晚了,他们要么使用EABI,要么发明新的东西。例如,使用gcc linux硬浮点编译器调用
    malloc()
    将无法工作,因为系统调用将完全不同。通常,您必须使用
    -nostlib
    进行编译,并创建自己的C库

    <>我已经搜索了一点,找到了VisualC++的细节。
    为了回答第二个问题,有很多编译器/系统会生成类似的序言/尾声。若VisualC++使用<强> AAPCS ,则可以与其他<强> AAPCS <强>编译器进行互操作。您可能必须创建自定义库才能让另一个编译器调用Windows RT系统调用。其他问题应在手册中回答

    编辑:选择ABI。aapcs linux是aapcs/EABI,apcs gnu是OABI定义和参数映射。编译器配置选择目标操作系统和指令/后端/CPU类型;因此,我们有不同名称的编译器,比如
    arm linux eabi gcc
    ,arm linux gnueabi gcc`,等等。

    与Windows CE(使用原始的aka旧ABI)不同,arm上的Windows RT使用eabi。更具体地说,使用浮点寄存器传递浮点数据和8字节堆栈/参数对齐的变体

    如果我采用以下功能:

    int g(float x) {
      return x;
    }
    
    并使用VS2012的ARM编译器进行编译,得到以下程序集:

    |g| PROC
        vcvt.s32.f32 s0,s0
        vmov        r0,s0
        bx          lr
        ENDP  ; |g|
    
    您可以看到它对参数使用的是
    S0
    ,而不是
    R0

    VS2008中的版本(可用于针对较旧的Windows CE版本)产生以下结果:

    str     lr, [sp,#-4]!
    ldr     r3, =__imp___stoi
    ldr     r3, [r3]
    mov     lr, pc
    bx      r3
    ldr     pc, [sp],#4
    
    此代码正在调用助手函数以执行转换

    Windows Compact 7附带的Windows CE编译器支持旧的调用约定(MS称为“cdecl”)和EABI。看


    <>强>编辑< /强>:刚才注意到你添加了一个关于C++的问题。微软不使用ItAIAL风格的C++ ABI,因为它们的实现早于它。您可以在我的OpenRCE文章(,)和后续文章中了解Microsoft的实现。另请参见设计师Jan Gray的原始描述:。

    感谢您提供有关ARM调用约定和ABI的一些信息,但如果我没有遗漏任何内容,您还没有真正回答我的任何问题。你基本上说VisualC++可以在AWC上编译Win RT时使用或不使用AAPCS,并且这些问题应该在“手册”中回答。这主要是正确的。我提供了一种方法来回答以下问题:ARM上的Windows RT使用的调用约定是否与其他(嵌入式)ARM Windows变体使用的调用约定不同?开场白/尾声很可能是相同的。语言ABI和系统接口可能不同。我想我是说打电话给大会有点过头了