2013-05-30 32 views
0

我想將指針傳遞給C和ASM代碼之間的數組。我有一個四個double值的數組,我需要將它們傳遞給asm,將它們加載到xmm,乘以並將指針返回到C的四個值。我在將數據加載到xmm0時出錯。將指針從c傳遞到asm並將值添加到sse寄存器

如何將此指針傳遞給ASM並返回C? 如何將所有四個數字加載到xmm0?

下面是代碼:

.text 

.globl calkasse 
.type calkasse, @function 

calkasse: 
pushq %rbp 
movq %rsp, %rbp 

movq 8(%rbp), %rax 
movaps 16(%rax), %xmm0 
mulps %xmm0,%xmm0 

movq %rbp, %rsp 
popq %rbp 
ret 

和C代碼:

double (*calkasse(double (*)[4]))[4]; 

int main(void) { 

double suma=0.0; 
double poczatek=1.0; 
double koniec=5.0; 
double step=0.001; 
double i=poczatek; 
double array[4]; 
double (*wynik)[4]; 

    array[0] = i; 
    array[1] = i+step; 
    array[2] = i+(2*step); 
    array[3] = i+(3*step); 
    wynik = calkasse(&array); 
    suma+=*wynik[0]+*wynik[1]+*wynik[2]+*wynik[3]; 
return 1; 
} 
+1

可能不是這樣的。在Linux和Windows(64位)上,前幾個參數傳入寄存器(但不同的寄存器和不同的寄存器)。這是什麼平臺?此外,他們是雙打的,但你用它們作爲浮游物。其中四個不適合xmm寄存器。 – harold

+0

這是linux ubuntu。所以指針會在正常的寄存器中?然後我會改變爲浮動。 – Gravian

+1

那麼參數將在'rdi'中。 – harold

回答

0

你需要編譯您的項目作爲一個組件文件,然後再做出這些改變。如果您使用內聯彙編,會發生什麼情況是您的C代碼和內聯彙編之間的系統更改有TON(並且我的意思是我在測試中看到的一噸)。基本上,它會在進入組裝部分之前破壞系統的狀態。這顯然是爲什麼這是因爲你的C代碼將不得不使用C庫來甚至找出內聯彙編的含義。因此,在此期間,您的持久性將被破壞,並且值將被推入並彈出。

爲了在進入程序集之前不破壞您的寄存器,您可以嘗試在創建它之後在目標文件中添加程序集。在開始添加代碼之前,您可以使用GDB計算出您的代碼正在執行的操作,並且您應該能夠手動獲取要查找的地址,然後您可以將其放入一個變量中。我會把它放在一個變量中,因爲如果你將它插入寄存器中,你必須在添加代碼後追蹤程序集,以確保在正確的時間將它放入正確的寄存器。如果你把它放在一個變量中,你可以使用mov指令(或leal IIRC)將指針值存入變量,然後在你的C代碼中,你可以將這個變量設置爲null。然後,您可以在實際編寫程序集之前編寫C代碼(基本上變量是模擬的)。希望這會有所幫助,祝你好運。

0

你必須讓你的編譯器表現出可預測性。 C函數可以用許多方式編譯。它也是操作系統和平臺的依賴。因此,例如,允許通過寄存器/寄存器優化/操作系統禁止寄存器傳遞函數參數......這些將改變編譯。嘗試寫優化關閉的函數,並查看編譯器的彙編輸出。這樣,你將有一個更多編譯的受控情況,至少在一個操作系統和平臺上將保持一致...然後,您可以將內聯彙編添加到該函數。始終關注裝配輸出...這需要中等的逆向工程。