【问题标题】:Segmentation fault when passing arrays from C to nasm将数组从 C 传递到 nasm 时出现分段错误
【发布时间】:2013-04-26 18:58:53
【问题描述】:

我有一个 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 过程后数组没有被填充。

最好的问候,周末愉快!

【问题讨论】:

    标签: c arrays nasm procedure fault


    【解决方案1】:

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

    当前代码:

    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

    【讨论】:

    • 谢谢。我按照你告诉我的做了,但现在我在 asm 过程中遇到了分段错误。我发现,错误来自这一行:FST QWORD [EDX]
    猜你喜欢
    • 2014-12-10
    • 1970-01-01
    • 2019-04-20
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多