2013-04-26 3 views
0

У меня есть программа на C, которая вызывает функцию, реализованную в nasm. 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 

Я получаю ошибку сегментации в функции PRINTF в C-коде. Мне кажется, что так или иначе массивы не заполняются после вызова процедуры 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] –

+0

Пришлось немного опечатать. Он работает сейчас. –

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