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”。您需要让编译器生成函数尾声