我有一个现有的Unix项目,我正在移植到Windows,其中包括少数汇编程序版本。例如:
blake3.c
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
.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中定义了汇编程序函数,如:
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中,我就不会认为这应该重要了。
发布于 2022-11-20 03:18:41
例如,事实证明这种方法运行得相当好。
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);
} 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++编译头而做的事情:
#ifdef _MSC_VER
#define __attribute__(X)因为MSC不能理解他们。叹一口气。
很大程度上要感谢mstorsjo在llvm的演讲。
https://stackoverflow.com/questions/74471705
复制相似问题