首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows clang汇编程序和sysv_abi

Windows clang汇编程序和sysv_abi
EN

Stack Overflow用户
提问于 2022-11-17 07:34:24
回答 1查看 52关注 0票数 0

我有一个现有的Unix项目,我正在移植到Windows,其中包括少数汇编程序版本。例如:

blake3.c

代码语言:javascript
复制
extern void blake3_compress_xof_sse2(P1, P2, P3, P4, P5, P6);

static void blake3_caller( ... ) 
{
    blake3_compress_xof_sse2(P1, P2, P3, P4, P5, P6);
}

blake3.s

代码语言:javascript
复制
.intel_syntax noprefix
.global zfs_blake3_compress_xof_sse2

.p2align 6
blake3_compress_xof_sse2:
        movups  xmm0, xmmword ptr [rdi] # P1
        ...

因为所有的.s都来自Unix,所以我不得不转换从

Unix: rdi,rsi,rdx,rcx,r8,r9

窗口: rdx,rcx,r8,r9,rsp+0x28,rsp+0x30

(以及保存rdi、rsi、xmm6-xmm 15)

然后我偶然发现了__attribute__((sysv_abi))

如果我能告诉编译器使用Unix参数顺序: rdi,rsi,rdx,rcx,r8,r9,我会非常整洁。

因此,我在C中定义了汇编程序函数,如:

代码语言:javascript
复制
extern void __attribute__((sysv_abi)) blake3_compress_xof_sse2(P1, P2, P3, P4, P5, P6);

但我失望地看到,当我转储注册进入blake3_compress_xof_sse2: P1仍在rdx,而不是我所希望的rdi

有什么办法让这件事起作用吗?这将是非常有益的,不必调整所有的.s文件的视窗。(或拥有.s文件的单独副本)

编译时,我使用clang将所有源文件.c和.s编译成libkern.a。最后,将driver.c链接到MSVC和libkern.a作为最终驱动程序。哦,是的,这是内核模式。但是,既然blake3.c和blake3.s都在libkern.a中,我就不会认为这应该重要了。

EN

回答 1

Stack Overflow用户

发布于 2022-11-20 03:18:41

例如,事实证明这种方法运行得相当好。

代码语言:javascript
复制
void __attribute__((sysv_abi)) sysv_abi_func(int p1, int p2, int p3, int p4, int p5, int p6, int p7);

void call_sysv_abi(int p1, int p2, int p3, int p4, int p5, int p6, int p7) {
    sysv_abi_func(p1, p2, p3, p4, p5, p6, p7);
}
代码语言:javascript
复制
       0: 56                            pushq   %rsi
       1: 57                            pushq   %rdi
       2: 48 81 ec c8 00 00 00          subq    $200, %rsp
       9: 44 0f 29 bc 24 b0 00 00 00    movaps  %xmm15, 176(%rsp)
      12: 44 0f 29 b4 24 a0 00 00 00    movaps  %xmm14, 160(%rsp)
      1b: 44 0f 29 ac 24 90 00 00 00    movaps  %xmm13, 144(%rsp)
      24: 44 0f 29 a4 24 80 00 00 00    movaps  %xmm12, 128(%rsp)
      2d: 44 0f 29 5c 24 70             movaps  %xmm11, 112(%rsp)
      33: 44 0f 29 54 24 60             movaps  %xmm10, 96(%rsp)
      39: 44 0f 29 4c 24 50             movaps  %xmm9, 80(%rsp)
      3f: 44 0f 29 44 24 40             movaps  %xmm8, 64(%rsp)
      45: 0f 29 7c 24 30                movaps  %xmm7, 48(%rsp)
      4a: 0f 29 74 24 20                movaps  %xmm6, 32(%rsp)
      4f: 8b 84 24 10 01 00 00          movl    272(%rsp), %eax
      56: 8b 84 24 08 01 00 00          movl    264(%rsp), %eax
      5d: 8b 84 24 00 01 00 00          movl    256(%rsp), %eax
      64: 44 89 4c 24 1c                movl    %r9d, 28(%rsp)
      69: 44 89 44 24 18                movl    %r8d, 24(%rsp)
      6e: 89 54 24 14                   movl    %edx, 20(%rsp)
      72: 89 4c 24 10                   movl    %ecx, 16(%rsp)
      76: 8b 84 24 10 01 00 00          movl    272(%rsp), %eax
      7d: 44 8b 8c 24 08 01 00 00       movl    264(%rsp), %r9d # P6
      85: 44 8b 84 24 00 01 00 00       movl    256(%rsp), %r8d # P5
      8d: 8b 4c 24 1c                   movl    28(%rsp), %ecx  # P4
      91: 8b 54 24 18                   movl    24(%rsp), %edx  # P3
      95: 8b 74 24 14                   movl    20(%rsp), %esi  # P2
      99: 8b 7c 24 10                   movl    16(%rsp), %edi  # P1
      9d: 89 04 24                      movl    %eax, (%rsp)
      a0: e8 00 00 00 00                callq   0xa5 <call_sysv_abi+0xa5>

我的问题是我过去为使它用MSVC++编译头而做的事情:

代码语言:javascript
复制
#ifdef _MSC_VER
#define __attribute__(X)

因为MSC不能理解他们。叹一口气。

很大程度上要感谢mstorsjo在llvm的演讲。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74471705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档