2013-04-20 62 views
1

我正在學習使用編程學習asm,但我無法找到任何有關當前問題的幫助。ASM使用C編譯,ASM返回C語言

所以我做了3個文件(2個asm,1個c)。

我想讓我的C文件打印2個其他程序的輸出。 文件在C:

iclude <stdio.h> 

float a = 1; 
float b = 2; 
float c = 3; 

extern float asm1 (float a, float b, float c); 
extern float asm2 (float a, float b, float c); 


int main() 
{ 

float count1= 0; 
float count2= 0; 

count1= asm1 (a, b, c); 
count2= asm2 (a, b, c); 

printf("Output : %f and %f \n", count1, count2); 

return 0; 
} 

文件中ASM是幾乎相同的,文件號1產生X1,和文件編號2產生X2。文件編號1得到每個變量以1(e.x. a1,x1)結尾,並且文件編號2在asm中以2(e.x. a2,x2)結尾。

.align 32 
.data 

a1: .float 0 
b1: .float 0 
c1: .float 0 
buf1: .float 0 
x1: .float 0 

four1: .float 4 
two1: .float 2 

.text 
.global asm1 

asm1: 

xor %eax, %eax 
xor %ebx, %ebx 
xor %ecx, %ecx 

pushl %ebp 
movl %esp, %ebp 
movl 8(%ebp), %ecx 
movl 12(%ebp), %ebx 
movl 16(%ebp), %eax 
pushl %eax 
pushl %ebx 
pushl %ecx 

movl %eax, c1 
movl %ebx, b1 
movl %ecx, a1 

finit 
fld a1 
fld c1 

**more code** 

fstp x1 

movl %ebp, %esp 
popl %ebp 
ret 

我想這個文件有x1(x2)作爲返回值,它將在printf中的C文件中顯示。取而代之的是我得到了南。我怎樣才能做到這一點?

回答

1

要從函數中返回float值,需要在FPU堆棧上保留返回值。

像這樣

addf ... 
; leave the value one the FPU stack, don't fstp 
+0

我改變FSTP x1到ADDF X1,並得到了錯誤 「沒有這樣的指令」。我使用的是Ubuntu 32b。 @edit如果你的意思是faddp增加了一些東西,現在我不知道是什麼,爲什麼。 – 2013-04-20 12:55:58

+0

你能說得更清楚嗎?我應該在哪裏改變它(什麼代碼部分?)? – 2013-04-20 12:56:54

+0

好的男人,我明白了!謝謝 :) – 2013-04-20 13:03:21