首页 > 解决方案 > 汇编代码生成 SEGMENTATION FAULT

问题描述

我有以下功能:

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。这个功能有什么问题?

标签: gccinline-assembly

解决方案


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

在 asm 的右括号之前,添加

: “eax”, “edx”

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

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

推荐阅读