gpt4 book ai didi

c - 将数组从 C 传递到 nasm 时出现段错误

转载 作者:行者123 更新时间:2023-11-30 17:52:22 25 4
gpt4 key购买 nike

我有一个 C 程序,它调用在 nasm 中实现的函数。C 调用:

    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
}

纳斯姆:

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 过程后,不知何故数组没有被填充。

致以诚挚的问候,祝周末愉快!

最佳答案

您忘记了返回地址存储在堆栈中。

当前代码:

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

此外,您正在使用 float ,在您的架构上它们可能是 32 位,但您正在使用 QWORD(64 位)来操作它们。并将 4 声明为 4 而不是 4.0

关于c - 将数组从 C 传递到 nasm 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16243425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com