2014-10-19 111 views
0

我需要编译在GNU汇编程序中编写的汇编文件。 使用汇编程序在Linux中正确编译该文件。 程序集文件包含接收2个参数的函数的全局减速,这应该从C/C++ visual studio 2013中调用。将GNU汇编程序编译为windows

我该怎么做?

这里是.s文件的一部分:

.globl func 
func: 
pushq %rbp 
pushq %r12 
pushq %r15 
pushq %r13 
pushq %r14 
subq $40,%rsp 

movq %rdi,%rbp //the first param 
movq %rsi,%r12 //the second param 

//real code starts here... 


//restore stack and return 

addq $40,%rsp 
popq %r14 
popq %r13 
popq %r15 
popq %r12 
popq %rbp 
ret 

谢谢大家!

+0

我不太确定你可以指望兼容ABI的这个东西。 – 2014-10-19 11:13:03

回答

1

微软调用约定与sysv abi不同,几乎世界其他地方都使用它。如果从问题中省略的代码是独立的,那么基本上只需要担心参数传递和保存寄存器。

幸运的是,访问参数你就必须分别rcxrdx,更换两个寄存器rdirsi

至于保存寄存器,代码大概不会修改rbx,因为需要保留,并且没有匹配push。此外,这两个约定保留r12r15,所以我们不需要担心这些。但是,Microsoft常规还要求保留rdirsi,这些参数用于sysv abi下的参数,否则被视为易失性。因此,您需要为这些对添加push/pop对。

你没有提到函数体是否使用任何SIMD或FPU的东西,所以我不打算覆盖这些。另外,我假设你的函数返回void

因此,修改后的组件可能看起来像:

.globl func 
func: 
pushq %rbp 
pushq %r12 
pushq %r15 
pushq %r13 
pushq %r14 
pushq %rdi 
pushq %rsi 
subq $40,%rsp 

movq %rcx,%rbp //the first param 
movq %rdx,%r12 //the second param 

//real code starts here... 


//restore stack and return 

addq $40,%rsp 
popq %rsi 
popq %rdi 
popq %r14 
popq %r13 
popq %r15 
popq %r12 
popq %rbp 
ret 

在C面,你只需要把它声明为extern void func(int a, int b)或同等学历。从C++调用时,应该使用extern "C"