gpt4 book ai didi

C/C++ 索引跳转到一组 NOP

转载 作者:太空宇宙 更新时间:2023-11-04 04:13:17 31 4
gpt4 key购买 nike

我想产生一个时钟分辨率的延迟,所以我的想法是一个接一个地有 255 个 NOP,然后跳到最后一个减去所需的延迟。所以 0 会跳过最后一个 NOP,1 会跳过最后一个 NOP,255 会跳过第一个 NOP。

我以前使用过索引函数调用,但在索引 goto 上找不到任何像这样的东西。我也想过使用 switch 语句,但似乎还有其他指令。

任何建议都非常感谢。

最佳答案

Nick ODell 有一个很好的解决方案,但是编译器无法知道您的所有案例都只有一个字节的代码。在汇编程序通过之前,这将是未知的。因此,无论在每种情况下生成多少代码,编译器都必须生成可以工作的东西,而间接跳转表确实是唯一的方法。

因此,我认为为了获得每个 nop 一个字节的“理想”代码,您还必须在汇编中编写跳转逻辑。

这是我想出的(用于 Linux 上的 gcc/amd64/gas)。 Here it is on godbolt .

#include <stdlib.h>

#define N 1000

#define xstr(s) str(s)
#define str(s) #s


void delay(unsigned ticks) {
if (ticks <= N) {
asm("movq $1f, %%rax \n"
"addq %0, %%rax \n"
"jmp *%%rax \n"
"1: \n"
".rept " xstr(N) " \n"
"nop \n"
".endr \n"
: : "g" ((unsigned long)(N-ticks)): "ax");
} else {
abort();
}
}

int main(void) {
delay(4);
return 0;
}

注意必须用-no-pie编译。如果您希望它作为与位置无关的可执行文件工作,您可能需要像 call 2f 这样的技巧; 2f: popq %rax 将程序绝对地址存入寄存器。

当然,实际获取此代码的开销是否会扰乱延迟时间的准确性总是存在的问题......

关于C/C++ 索引跳转到一组 NOP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54857340/

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