gpt4 book ai didi

gcc - 如何在 GCC C++ 中编写多行内联汇编代码?

转载 作者:行者123 更新时间:2023-12-04 06:11:42 34 4
gpt4 key购买 nike

这看起来不太友好:

__asm("command 1"
"command 2"
"command 3");

我真的必须在每一行周围加上双引号吗?

另外...由于多行字符串文字在 GCC 中不起作用,我也无法作弊。

最佳答案

我总是在 Internet 上找到一些示例,该人手动插入制表符和换行符而不是\t 和\n,但是它对我不起作用。不太确定您的示例是否可以编译..但这就是我的做法:

asm volatile(           // note the backslash line-continuation
"xor %eax,%eax \n\t\
mov $0x7c802446, %ebx \n\t\
mov $1000, %ax \n\t\
push %eax \n\t\
call *%ebx \n\t\
add $4, %esp \n\t\
"
: "=a"(retval) // output in EAX: function return value
:
: "ecx", "edx", "ebx" // tell compiler about clobbers
// Also x87 and XMM regs should be listed.
);
或者在每一行周围加上双引号,而不是使用 \线路延续。 C 字符串文字仅由空格(包括换行符)单独连接成一个长字符串文字。 (这就是为什么你需要在其中使用 \n,所以当它被汇编器看到时它是单独的行)。
这不那么难看,并且可以在每一行上放置 C 注释。
asm volatile(
"xor %eax,%eax \n\t"
"mov $0x7c802446, %ebx \n\t"
"mov $1000, %ax \n\t"
"push %eax \n\t" // function arg
"call *%ebx \n\t"
"add $4, %esp \n\t" // rebalance the stack: necessary for asm statements
: "=a"(retval)
:
: "ecx", "edx", "ebx" // clobbers. Function calls themselves kill EAX,ECX,EDX
// function calls also clobber all x87 and all XMM registers, omitted here
);

关于gcc - 如何在 GCC C++ 中编写多行内联汇编代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3666013/

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