首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等价于GCC的裸属性

问等价于GCC的裸属性
EN

Stack Overflow用户
提问于 2011-12-04 17:38:05
回答 3查看 6.4K关注 0票数 10

我有一个用纯C编写的应用程序,其中混合了一些包含纯ASM的函数。裸属性不适用于x86 (为什么?为什么?!)我的asm函数不喜欢当prologue和epilogue打乱堆栈的时候。有没有可能创建一个可以从C代码部分引用的纯汇编函数?我只需要这样的ASM函数的地址。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-04 20:53:22

只需在函数块外使用asm()即可。编译器简单地忽略asm()的参数,并将其直接传递给汇编程序。对于复杂的函数,单独的汇编源文件是避免笨拙语法的更好选择。

示例:

代码语言:javascript
复制
#include <stdio.h>

asm("_one:              \n\
        movl $1,%eax    \n\
        ret             \n\
");

int one();

int main() {
        printf("result: %d\n", one());
        return 0;
}

PS:确保你了解你的平台的调用约定。很多时候,你不能仅仅复制/复制汇编代码。

PPS:如果您关心性能,请改用extended asm。扩展asm本质上是将汇编代码内联到C/C++代码中,并且速度快得多,特别是对于较短的汇编函数。对于较大的汇编函数,最好使用单独的汇编源文件,因此对于极少数情况下,需要一个指向小汇编函数的函数指针,这个答案确实是一种技巧。

票数 16
EN

Stack Overflow用户

发布于 2017-08-01 06:43:52

好消息是大家。最终,GCC开发人员为x86实现了attribute((naked))。该功能将在GCC 8中提供。

票数 7
EN

Stack Overflow用户

发布于 2011-12-04 18:01:29

当然,只需创建一个.s文件(汇编源),该文件通过gas (汇编器)运行即可创建一个普通的目标文件。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8374449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档