Gcc 汇编代码生成分段错误

Gcc 汇编代码生成分段错误,gcc,inline-assembly,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;" "ad

我有以下功能:

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;
}
当我使用它时,例如,像
intm=max(5,10)我看到分段错误(堆芯转储)。

我认为我使用cmpl的方式有点不正确。这个函数有什么问题

  • 您需要让编译器知道您在汇编代码中更改了哪些寄存器(称为“clobbers”)
  • 在asm的右括号之前,添加

    : “eax”, “edx”
    
    实际上,最好让编译器选择要使用的寄存器,但这需要重写整个过程

  • 不要在asm语句中添加“ret”。您需要让编译器生成函数尾声
  • 您需要让编译器知道您在汇编代码中更改了哪些寄存器(称为“clobbers”)
  • 在asm的右括号之前,添加

    : “eax”, “edx”
    
    实际上,最好让编译器选择要使用的寄存器,但这需要重写整个过程

  • 不要在asm语句中添加“ret”。您需要让编译器生成函数尾声