汇编代码生成 SEGMENTATION FAULT
Assembly code generates SEGMENTATION FAULT
我有以下功能:
int max(int num1, int num2)
{
int retval;
__asm__("maxii_start:;"
"movl %1, %%eax;"
"subl [=10=], %%eax;"
"movl %2, %%edx;"
"subl [=10=], %%edx;"
"cmpl %%edx, %%eax;"
"jle maxii0;"
"addl [=10=], %%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
。这个函数有什么问题?
- 您需要让编译器知道您在汇编代码中更改了哪些寄存器(称为“clobbers”)。
在asm的右括号前,添加
: “eax”, “edx”
实际上让编译器选择要使用的寄存器会更好,但这需要重写整个东西。
- 不要把“ret”放在asm语句中。您需要让编译器生成函数尾声。
我有以下功能:
int max(int num1, int num2)
{
int retval;
__asm__("maxii_start:;"
"movl %1, %%eax;"
"subl [=10=], %%eax;"
"movl %2, %%edx;"
"subl [=10=], %%edx;"
"cmpl %%edx, %%eax;"
"jle maxii0;"
"addl [=10=], %%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
。这个函数有什么问题?
- 您需要让编译器知道您在汇编代码中更改了哪些寄存器(称为“clobbers”)。
在asm的右括号前,添加
: “eax”, “edx”
实际上让编译器选择要使用的寄存器会更好,但这需要重写整个东西。
- 不要把“ret”放在asm语句中。您需要让编译器生成函数尾声。