У меня есть программа на 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.
С наилучшими пожеланиями и приятных выходных!
Спасибо. Я сделал то, что вы мне сказали, но теперь я получаю ошибку сегментации в процедуре asm. Я узнал, что ошибка исходит из этой строки: FST QWORD [EDX] –
Пришлось немного опечатать. Он работает сейчас. –