汇编代码生成SEGMENTATION FAULT

时间:2019-03-05 12:41:33

标签: gcc inline-assembly

我具有以下功能:

int max(int num1, int num2)
{
    int retval;
    __asm__("maxii_start:;"
        "movl %1, %%eax;" 
        "subl $0, %%eax;" 
        "movl %2, %%edx;"
        "subl $0, %%edx;"
        "cmpl %%edx, %%eax;"
        "jle maxii0;"
        "addl $0, %%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 个答案:

答案 0 :(得分:2)

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

在asm的右括号之前,添加

: “eax”, “edx”

实际上,最好让编译器选择要使用的寄存器,但这将需要重写整个内容。

  1. 请勿在“ asm”语句中添加“ ret”。您需要让编译器生成函数结尾。