2012-01-14 81 views
1

從我的asm項目調用C函數。從nasm調用c函數x86-64

我試圖將整數值推入c函數。

我的代碼

mov rdi, [input] 
push rdi     ;push rdi into stack for c function to work with 
call dtoch 
pop rdi     ;to keep stack balanced 

「 我在移動輸入了錯誤的寄存器?

運行在Linux Ubuntu操作系統上,沒有收到錯誤,只是沒有打印出正確的值。

當我在C environement中運行該函數它工作正常,但與我的nasm項目打印出錯誤的數字....?

c函數:

void dtoch(int d) 
{ 
int n , r[10], i = 0, number, j = 0; 
while (number > 0) 
{ 
r[i] = number%16; 
number = number/16; 
i++; 
j++; 
} 
printf ("It's hexadecimal equivalent is: "); 
for (i = j -1; i > = 0; i--) 
{ 
if (r[i] == 10) 
printf("A"); 
else if (r[i] == 11) 
printf("B"); 
else if (r[i] == 12) 
printf("C"); 
else if (r[i] == 13) 
printf("D"); 
else if (r[i] == 14) 
printf("E"); 
else if (r[i] == 15) 
printf("F"); 
else 
printf("%d", r[i]); 
} 

} 
+0

被調用的函數並不關心你使用哪個寄存器將參數推送到堆棧。 C函數的調用約定是什麼?你有錯誤嗎?你需要提供更多信息。 – 2012-01-14 17:22:50

+0

哪個操作系統? – zvrba 2012-01-14 17:29:10

+0

顯示C函數原型。 – 2012-01-14 17:37:00

回答

1

64使用__fastcall,對於Linux的AMD64 ABI時,看到的分歧或這個漂亮的夏日表on wikipedia昂納霧的optimization manuals(在Windows上,看到this(微軟ABI))。

對於Linux下運行你的榜樣,你想讓它在RDI沒有PUSH S(以及配對POP的)需要。您可以查看完整的AMD64 ABI here,它包括一些編碼思路(在Windows中,您希望單個參數可以進入RCX,再次,不需要PUSH)。

一個簡單的提示:你可以使用程序集輸出編譯你的c調用,看看編譯器生成了什麼代碼,GCC上的選項-Wa,-adhln -g應該可以做到。

+0

我試圖刪除push和pops,我也分配了被帶入的數字函數爲「數字」變量,但它的唯一給我在每次運行的通用數字2 .... – user1050632 2012-01-14 18:41:41