2013-04-26 87 views
0

我有一個調用在nasm中實現的函數的C程序。 的C-電話:將數組從C傳遞到nasm時出現分段錯誤

extern void calc(float *, float *, float *, float *); 
    //... 
    float *data1, *data2, *results1, *results2; 
    data1 = (float *)malloc(MAXLINES * sizeof(float)); 
    //... 
    calc(data1, data2, results1, results2); 
    /... 
    for(i=0;i<linesread;i++) { 
     printf ("Zeile %u: result1 = %f,\tresult2 = %f\n", i, results1[i], results2[i]); //Segmentation fault 
    } 

NASM:

segment .data 

constAir: dq 1.11330e-10 
constOil: dq 2.33656e-10 
pi:  dq 3.1415 
four:  dq 4 

SEGMENT .text 

GLOBAL calc 

calc: 

PUSH EBP 
PUSH EAX 
PUSH EBX 
PUSH ECX 
PUSH EDX 
MOV EBP, ESP 
ADD EBP, 20 
MOV EAX, [EBP]  ; data1 
MOV EBX, [EBP + 4] ; data2 
MOV ECX, [EBP + 8] ; results1 
MOV EDX, [EBP + 12] ; results2 

; results1/2 = data1/(4 * PI * constAir/Oil * data2 * data2) 

FLD QWORD [four] 
FMUL QWORD [pi] 
FMUL QWORD [constAir] 
FMUL QWORD [EBX] 
FMUL QWORD [EBX] 
FST ST1 
FLD QWORD [EAX] 
FDIV ST1 
FST QWORD [ECX] 

FLD QWORD [four] 
FMUL QWORD [pi] 
FMUL QWORD [constOil] 
FMUL QWORD [EBX] 
FMUL QWORD [EBX] 
FST ST1 
FLD QWORD [EAX] 
FDIV ST1 
FST QWORD [EDX] 

POP EDX 
POP ECX 
POP EBX 
POP EAX 
POP EBP 
RET 

我得到的C代碼printf函數分段錯誤。在我看來,在調用nasm過程之後,不知何故陣列沒有被填滿。

祝你週末愉快!

回答

0

您忘記了存儲在堆棧上的返回地址。

當前代碼:

MOV EAX, [EBP]  ; data1 
MOV EBX, [EBP + 4] ; data2 
MOV ECX, [EBP + 8] ; results1 
MOV EDX, [EBP + 12] ; results2 

更正代碼:

MOV EAX, [EBP + 4] ; data1 
MOV EBX, [EBP + 8] ; data2 
MOV ECX, [EBP + 12] ; results1 
MOV EDX, [EBP + 16] ; results2 

此外,您使用的花車,這對你的架構可能是32位,但您使用QWORD(64位)操縱他們。並聲明四個爲4而不是4.0

+0

謝謝。我做了你告訴我的,但是現在我在asm過程中出現了分段錯誤。我發現,錯誤來自這一行: FST QWORD [EDX] – 2013-04-27 05:00:30

+0

有一點錯字。它現在有效。 – 2013-04-27 05:06:48