汇编代码生成 SEGMENTATION FAULT

Assembly code generates SEGMENTATION FAULT

我有以下功能:

int max(int num1, int num2)
{
    int retval;
    __asm__("maxii_start:;"
        "movl %1, %%eax;" 
        "subl [=10=], %%eax;" 
        "movl %2, %%edx;"
        "subl [=10=], %%edx;"
        "cmpl %%edx, %%eax;"
        "jle maxii0;"
        "addl [=10=], %%eax;"
        "jmp maxii1;"
        "maxii0:;"
        "movl %%edx, %%eax;"
        "maxii1:;"
        "movl %%eax, %0;"
        "ret;"
        :"=r"(retval)
        :"r"(num1), "r"(num2)
        );
    return retval;
}

当我使用它时,例如。像 int m = max(5, 10); 我看到 分段错误(核心已转储)。

我认为我的使用方式有问题cmpl。这个函数有什么问题?

  1. 您需要让编译器知道您在汇编代码中更改了哪些寄存器(称为“clobbers”)。

在asm的右括号前,添加

: “eax”, “edx”

实际上让编译器选择要使用的寄存器会更好,但这需要重写整个东西。

  1. 不要把“ret”放在asm语句中。您需要让编译器生成函数尾声。