2013-04-20 2 views
1

Я изучаю использование программирования с нуля, чтобы узнать asm, но я не могу найти никакой помощи в моей текущей проблеме.ASM компиляция с C и возвращаемое значение на C из ASM

Итак, я сделал 3 файла (2 в asm, 1 в c).

Я хочу, чтобы мой файл на C выводил вывод двух других программ. файла в 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) в качестве возвращаемого значения, которое будет показано в файле C в Printf. Вместо этого я получаю -nan. Как я могу это сделать?

ответ

1

Чтобы вернуть значение float из функции, вам необходимо оставить возвращаемое значение в стеке FPU.

Как это

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

Я изменил FSTP x1 на addf x1, и не получил ошибку "нет такой инструкции". Я использую ubuntu 32b. @edit Если вы имеете в виду faddp, что-то добавляет, и теперь я не знаю, что и почему. –

+0

Не могли бы вы сказать это более четко, пожалуйста? Где я должен его изменить (какая часть кода?)? –

+0

ОК, я понял! благодаря :) –

Смежные вопросы