gpt4 book ai didi

c - 有没有办法以编程方式生成内联汇编?

转载 作者:行者123 更新时间:2023-11-30 19:57:14 26 4
gpt4 key购买 nike

在我的程序中,我需要将 NOP 作为内联汇编插入到循环中,并且 NOP 的数量可以通过参数控制。像这样的事情:

char nop[] = "nop\nnop";

for(offset = 0; offset < CACHE_SIZE; offset += BLOCK_SIZE) {

asm volatile (nop
:
: "c" (buffer + offset)
: "rax");

}

有没有办法告诉编译器将上面的内联汇编转换成下面的?

   asm volatile ("nop\n"
"nop"
:
: "c" (buffer + offset)
: "rax");

最佳答案

那么,你可以使用这个技巧:

#define NOPS(n) asm volatile (".fill %c0, 1, 0x90" :: "i"(n))

该宏将所需数量的 nop 指令插入指令流中。请注意,n 必须是编译时常量。您可以使用 switch 语句来选择不同的长度:

switch (len) {
case 1: NOPS(1); break;
case 2: NOPS(2); break;
...
}

您还可以这样做以节省代码大小:

if (len & 040) NOPS(040);
if (len & 020) NOPS(020);
if (len & 010) NOPS(010);
if (len & 004) NOPS(004);
if (len & 002) NOPS(002);
if (len & 001) NOPS(001);

请注意,对于此类事情,您确实应该考虑使用 pause 指令而不是 nop 指令,因为 pause 是一种语义提示,您可以只是想打发时间。这将宏的定义更改为:

#define NOPS(n) asm volatile (".fill %c0, 2, 0x90f3" :: "i"(n))

关于c - 有没有办法以编程方式生成内联汇编?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50439907/

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