是否可以在c++文件中定义一个完整汇编函数

ttisahbt  于 2023-08-09  发布在  其他
关注(0)|答案(3)|浏览(112)

我在windows上使用vscode和gcc。我知道可以写一个c函数并使用asm(“代码”),但是我遇到了下面的yt视频:https://www.youtube.com/watch?v=7Xe9pCrzH98,作者展示了以下c代码:

__asm int sum4(int a,int b,int c,int d){
PUSH {r4, lr}
MOV r4, r0
ADD r4, r4, r1
ADD r4, r4, r2
ADD r0, r4, r3
POP {r4, pc}
}

字符串
它定义了一个完整的asm函数,而不是定义一个c函数,里面有asm关键字,但是我还没有能够复制这一点。这是可能的吗?这有什么区别吗?我会想象编译器可能会为c函数添加一些东西

extern "C" int ret100(void);
__asm(
"ret100:\n"
"  mov $100,%rax\n"
"  ret\n"
);


所以我尝试了各种各样的变化

__asm int ret100(){
"mov $100,%rax\n"
"ret"
}


无济于事
编辑:解决方案:我不知道是否仍然可以定义一个完整的asm函数,但是你可以让函数裸露,这意味着它不会创建一个pro和-epilogue,这可以用__delspec( naked )来完成,因此下面的函数:__declspec( naked ) int ret100(void){asm("mov $100, %eax\nret\n");}创建一个asm函数,函数体中只有两条asm语句。饰Jester
裸函数wiki:learn.microsoft.com/en-us/cpp/cpp/naked-cpp?

xpszyzbs

xpszyzbs1#

你需要一个裸函数,例如:

__attribute__((naked))
int ret100(void)
{
    __asm__(
        "mov $100, %eax\n"
        "ret\n"
    );
}

字符串

omhiaaxx

omhiaaxx2#

在C++源文件中没有可移植的方式使用内联asm。一些编译器支持它。有些编译器不支持它。支持它的编译器大多有不同的语法来这样做(并且支持甚至可能不同的编译器的32和64位版本-例如)。
一旦你使用asm,你就把可移植性抛在了后面,你要处理你所选择的工具链/平台的实现细节,所以你必须查找每个平台/工具链如何做到这一点,并为每个平台/工具链使用所需的语法。

nvbavucw

nvbavucw3#

一个更好的方法是将ASM函数放在.S文件中并编译它(GCC将在编译过程中包含它时将其放在汇编中,即。g++ main.cpp func.S -o app)。只是不要忘记声明你的函数为extern "C",这样它的名字不会被篡改,它将被链接器正确地拾取。
范例:
main.cpp:

#include <iostream>

extern "C"
{
extern int func();
}

int main()
{
    auto val = func();
    std::cout << val << std::endl;
    return 0;
}

字符串
功能:

.global func

func:
    mov $100, %eax
    ret

相关问题