我在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?
3条答案
按热度按时间xpszyzbs1#
你需要一个裸函数,例如:
字符串
omhiaaxx2#
在C++源文件中没有可移植的方式使用内联asm。一些编译器支持它。有些编译器不支持它。支持它的编译器大多有不同的语法来这样做(并且支持甚至可能不同的编译器的32和64位版本-例如)。
一旦你使用asm,你就把可移植性抛在了后面,你要处理你所选择的工具链/平台的实现细节,所以你必须查找每个平台/工具链如何做到这一点,并为每个平台/工具链使用所需的语法。
nvbavucw3#
一个更好的方法是将ASM函数放在.S文件中并编译它(GCC将在编译过程中包含它时将其放在汇编中,即。
g++ main.cpp func.S -o app
)。只是不要忘记声明你的函数为extern "C"
,这样它的名字不会被篡改,它将被链接器正确地拾取。范例:
main.cpp:
字符串
功能:
型