gpt4 book ai didi

c - 在程序集中搜索 2 个不同值的最快方法

转载 作者:太空宇宙 更新时间:2023-11-04 03:24:19 25 4
gpt4 key购买 nike

我想在汇编缓冲区中搜索两个给定值之一,仅相差一位。假设 0xfefefeff0xfefefefe(换句话说 - lsb 与搜索无关)

缓冲区的长度变化。

我想到了完成该任务的两种可能方法:

方式一:

mov eax, 0xfefefeff
test eax, eax
repne scasd
...
mov eax, 0xfefefefe
test eax, eax
repne scasd

方式#2:

mov eax, 0xfefefefe
lblSearch:
mov esi, [edi] ; edi - the buffer
and si, 0fffeh
cmp eax, esi
...
add edi, 4
loop lblSearch

我尝试使用 QueryPerformanceCountervisual studio 诊断工具C 中的那些 __asm 片段上测量执行时间但找不到一致的结果。在这个问题上的表现非常重要。

有什么想法可以更好地实现这一目标?

谢谢。

最佳答案

按照你的方式 #2 和 si,imm16 是一个问题,它是部分 16b 写入 esi 然后下一个 cmp eax,esi 需要返回组合的 32b 值,这将导致严重破坏注册别名和依赖项。

而不是 和 esi,0xfffffffe,它仅适用于 esi,因此内部不需要别名/复制/组合。

并且您可能想要展开它,尤其是当缓冲区的大小可以被某个不错的数字整除时,否则做一些序言来对齐它。

并且不要使用 loop,它会人为地变慢。

另外,根据您在 found/not_found 情况下所做的操作,可以在不在内循环内部分支的情况下编写它(例如计算此类值的数量)。

所以方法 #2 重写了:

    ; search for values 0xfefefefe and 0xfefefeff
mov eax, 0xfefefefe
mov edx, 0xfffffffe
; edi = buffer
; ecx = number of elements in buffer
lblSearch:
mov esi, [edi] ; edi - the buffer
add edi, 4
and esi, edx
cmp esi, eax
jne lblNotFound
... one of values found
lblNotFound:
dec ecx
jnz lblSearch

这绝不是把它逼到极限,因为你没有透露足够的信息。如果性能非常重要,那么展开这个等可能是值得的。

或者甚至检查整体架构,看看是否可以在生产者处捕获这些值,而无需任何搜索。

这只是比您的“方式 #2”快得多,仅此而已。

关于c - 在程序集中搜索 2 个不同值的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42470887/

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