gcc - 汇编代码生成 SEGMENTATION FAULT
问题描述
我有以下功能:
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
。这个功能有什么问题?
解决方案
- 您需要让编译器知道您在汇编代码中更改了哪些寄存器(称为“clobbers”)。
在 asm 的右括号之前,添加
: “eax”, “edx”
实际上,让编译器选择要使用的寄存器会更好,但这需要重写整个事情。
- 不要将“ret”放在 asm 语句中。您需要让编译器生成函数结尾。
推荐阅读
- firebase - 在 Xamarin 中更改推送通知图标 (FCM)
- python - Python中的按键
- sql - 当属性和参数是相同的数据类型时,从字符串转换日期和/或时间时转换失败
- python - 如何使用 pytourch、opengl 在 python 中打开/渲染 .obj 文件
- javascript - 按下按钮后如何延迟删除课程?
- angular12 - Angular 12 kendo-datepicker 禁用过去的日期
- javascript - React 美丽的 Dnd - 不变量失败:找不到带有 id 的可删除条目
- linux - fdisk 是否为创建的分区划分地址空间?
- apache - .httaccess mod_rewrite 首先隐藏 .php 扩展名,然后查询字符串变量
- c++ - clang 格式换行符在错误的位置