汇编代码生成SEGMENTATION FAULT

问题描述 投票:0回答:1

我有以下功能:

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);我看到Segmentation fault(core dumped)。

我认为我使用cmpl的方式不正确。这个功能出了什么问题?

gcc inline-assembly
1个回答
2
投票
  1. 您需要让编译器知道您在汇编代码中更改的寄存器(称为“clobbers”)。

在asm的右括号之前,添加

: “eax”, “edx”

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

  1. 不要将“ret”放在asm语句中。您需要让编译器生成函数结尾。
© www.soinside.com 2019 - 2024. All rights reserved.