我有以下功能:
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
的方式不正确。这个功能出了什么问题?
在asm的右括号之前,添加
: “eax”, “edx”
实际上让编译器选择要使用的寄存器会更好,但这需要重写整个事情。