2017-01-02 66 views
1

我必須寫在asm函數,以及i在C原型如何使用asm獲取指向輸出緩衝區的指針?

void fdct(float *in, float *out, unsigned int n); 

其中:

  • in:指針輸入數據緩衝器
  • out:指針outcoming數據緩衝器
  • n:數據矩陣的數量。

函數不會返回任何內容,但會與輸出數據的數組一起使用,並且必須根據結果進行更改。

據我瞭解,在CDECL棧看起來像:

esp: ret 
esp+4: *in - address 
esp+8: *out - address 
esp+12: value of n 

我,怎麼能和進入緩衝ASM工作,但我不明白如何outcoming緩衝區返回新地址 - 只是將新地址放入esp+8不是結果,它不會更改*out的值。我怎樣才能解決這個問題?

+0

什麼操作系統您使用的?與Windows相比,cdecl調用約定在* nix上略有不同。 –

+0

窗戶,我忘了注意這一點。 –

回答

4

這不是這應該如何工作。

你的彙編函數確實out分配float(或float陣列)和返回它。

相反,呼叫者應該分配這樣的陣列(例如,使用malloc()calloc() - 或任何功能他或她的語言提供 - 或簡稱爲在棧上的本地變量)和通過第一的地址元素在out。您的功能只需填充該陣列具有合適的float值,可能高達n元素。

例子:

float a[16] = ... ; /* fill it up with suitable values */ 
float b[16] = { 0 }; /* receives result values */ 

fdct(a, b, 16); 
+0

如果您希望函數分配內存,您需要將'out'參數更改爲指針指針。但我同意你提出的設計是可取的,因爲它讓所有權更容易推理。 –

+0

非常感謝您的幫助! –

相關問題