2015-05-25 3 views
1

Это часть моего кода:Ассамблея - число из стека

.data 

.text 
.global fx 
fx: 
    pushl %ebp 
    movl %esp,%ebp 

    finit 
    fldl 8(%ebp) 

Я называю эту функцию от С. Так как 8 байт должно быть значение, которое я назвал, я прав? Но то, что я вижу в gdb:

(gdb) info float 
=>R7: Valid 0x3bf2bd04000000000000 +1.00272590169167575e-312 
    R6: Empty 0x00000000000000000000 
    R5: Empty 0x00000000000000000000 
    R4: Empty 0x00000000000000000000 
    R3: Empty 0x00000000000000000000 
    R2: Empty 0x00000000000000000000 
    R1: Empty 0x00000000000000000000 
    R0: Empty 0x00000000000000000000 

Status Word:   0x3802  DE          
         TOP: 7 
Control Word:  0x037f IM DM ZM OM UM PM 
         PC: Extended Precision (64-bits) 
         RC: Round to nearest 
Tag Word:   0x3fff 
Instruction Pointer: 0x00:0x0804849b 
Operand Pointer:  0x00:0xffffcbb0 
Opcode:    0xdd45 

Это сразу после fldl 8 (% ebp). Мой друг сделал ту же программу, и это сработало. Что я сделал не так?

И ниже моей полной функции C:

#include <stdio.h> 
float fx(float x); 
float gx(float x); 

int main(){ 

float x; 
printf("Podaj wartosc x: "); 
scanf("%f",&x); 
float wynik1 = fx(x); 
float wynik2 = gx(x); 

printf("\nWynik funkcji f(x)=%f\nWynik funkcji g(x)=%f\n",wynik1,wynik2); 
return 0; 
} 

ответ

2

Вы загружаете двойной (fldl) вместо поплавка (flds).

+0

Это было так просто ... Спасибо! – DzikiChrzan