2014-10-19 145 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"