簡體   English   中英

將指針從c傳遞到asm並將值添加到sse寄存器

[英]Passing pointer from c to asm and add value to sse register

我想將指針傳遞給C和ASM代碼之間的數組。 我有一個由四個double值組成的數組,我需要將它們傳遞給asm,將它們加載到xmm,乘以並將指向四個值的指針返回給C。將數據加載到xmm0時出現錯誤。

如何將此指針傳遞給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;
}

您需要將項目編譯為程序集文件,然后進行這些更改。 如果您使用內聯匯編,則會發生C代碼和內聯匯編之間的系統更改(TON,我的意思是我在測試中看到的一噸)。 基本上,它會破壞您進入組裝部件之前所看到的系統狀態。 這很明顯的原因是因為您的C代碼將不得不使用C庫甚至弄清楚內聯匯編的含義。 因此,您的持久性將在此期間被破壞,值將被推送和彈出。

為了在進入程序集之前不破壞寄存器,可以嘗試在創建程序集后將其添加到目標文件中。 您可以使用GDB在開始添加代碼之前先弄清楚代碼在做什么,並且應該能夠手動獲取所需的地址,然后將其放入變量中即可。 我將其放置在變量中,因為如果將其插入寄存器中,則必須在添加代碼后跟蹤程序集,以確保在正確的時間將其放置在正確的寄存器中。 如果將其放置在變量中,則可以使用mov指令(或leal IIRC)將指針值獲取到變量中,然后在C代碼中,只需將此變量設置為null。 然后,您可以在實際手動編寫程序集之前編寫C代碼(基本上,該變量是模擬的)。 希望這會有所幫助,並祝你好運。

您必須使編譯器的行為可預測。 AC函數可以通過多種方式進行編譯。 它還取決於操作系統和平台。 因此,例如,允許通過寄存器/寄存器優化/禁止的操作系統寄存器傳遞功能參數...這些將改變編譯。 嘗試在關閉優化的情況下編寫函數,然后查看編譯器的匯編輸出。 這樣一來,您將具有更加可控的編譯情況,至少在一個操作系統和平台上,該情況是一致的...然后,您可以將內聯程序集添加到該函數中。 始終注意裝配輸出...這需要中等反向工程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM