我具有以下功能:
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
的方式有些错误。此功能有什么问题?
答案 0 :(得分:2)
在asm的右括号之前,添加
: “eax”, “edx”
实际上,最好让编译器选择要使用的寄存器,但这将需要重写整个内容。