gpt4 book ai didi

c - GCC 汇编内联 : Function Body with Only Inlined Assembly Code

转载 作者:太空宇宙 更新时间:2023-11-04 01:20:20 25 4
gpt4 key购买 nike

我正在尝试在我的 C 项目中重用一些汇编代码。假设我有一系列指令,我想将它们组织为一个函数:

void foo() {
__asm__ (
"mov %eax, %ebx"
"push %eax"
...
);
}

但是,一个障碍是,在函数foo编译后的汇编代码中,除了内联汇编代码外,编译器还会为这个函数生成一些序言指令,整个汇编程序会变成喜欢:

foo:
push %ebp <---- routine code generated by compilers
mov %ebp, %esp <---- routine code generated by compilers
mov %eax, %ebx
push %eax

以我的使用场景来看,这样的套路代码实际上破坏了内联汇编的原有语义。

所以这是我的问题,有什么方法可以阻止编译器生成那些函数序言和结尾指令,并且只包含内联汇编代码?

最佳答案

您提到您使用 gcc 进行编译。在这种情况下,您可以使用 -O2 优化级别。这将导致编译器进行堆栈优化,如果您的内联汇编很简单,它不会插入序言和结语。虽然,这可能无法在每种情况下都得到保证,因为优化不断变化。 (我的 gcc 和 -O2 做到了)。

另一种选择是您可以将整个函数(包括 foo:)放在一个汇编 block 中,如

__asm__ (
"foo:\n"
"mov ..."
);

使用此选项,您需要知道名称修改规范(如果有)。如果您希望函数是非静态的,您还必须在函数开始之前添加 .globl foo

最后,您可以检查函数声明中的 gcc __attribute__ ((naked)) 属性。但正如MichaelPetch提到的, 这不适用于 X86 目标。

关于c - GCC 汇编内联 : Function Body with Only Inlined Assembly Code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45292634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com