这段代码的作用和使用地点

Dmi*_*riy 2 c algorithm assembly reverse-engineering x86-64

Denis Yurichev 的逆向工程挑战 #10 https://challenges.re/10/中有这样一段 asm 代码片段

优化 GCC 4.8.2:

这段代码很短,但是很棘手。它有什么作用?它在低级编程中大量使用,并且为许多低级程序员所熟知。有多种计算方法,这就是其中之一。

f:
lea eax, [rdi-1+rsi]
neg esi
and eax, esi
ret
Run Code Online (Sandbox Code Playgroud)

在 C 语言中,这段代码看起来像这样:

(a+b-1) & (-b)
Run Code Online (Sandbox Code Playgroud)

请帮我弄清楚这段代码的作用以及它的用途

我对 a 和 b 运行了几个测试值,但没有看到模式

Joh*_*nck 6

正如 Peter Cordes 在评论中暗示的那样,该表达式(a+b-1) & (-b)可能仅在b是 2 的幂时才有用。在这种情况下,结果将a向上舍入为 的倍数b

例如,a=33 且 b=32,结果为 64。

这样的表达式在内存分配或对齐计算中可能很有用(C 标准指定对齐对于每种类型都是 2 的幂)。