Denis Yurichev的逆向工程挑战#10 https://challenges.re/10/中有这样一段asm代码
优化GCC 4.8.2:
这段代码很短,但很棘手。它是做什么的?它在低级编程中大量使用,并且为许多低级程序员所熟知。有几种方法可以计算它,这是其中之一。
f:
lea eax, [rdi-1+rsi]
neg esi
and eax, esi
ret
在C中,这段代码看起来像这样:
(a+b-1) & (-b)
请帮我弄清楚这段代码是做什么的,在哪里使用
我对a和B运行了几个测试值,我没有看到一个模式
2条答案
按热度按时间hi3rlvi21#
正如Peter Cordes在评论中所暗示的,表达式
(a+b-1) & (-b)
可能只在b
是2的幂时有用。在这种情况下,结果是a
四舍五入为b
的倍数。例如,a=33,B=32,结果是64。
这样的表达式在内存分配或对齐计算中可能很有用(C标准规定对齐对于每个类型都是2的幂)。
wz3gfoph2#
这段代码定义了一个标记为“f”的函数,它接受两个输入参数:RDI和RSI,它们可能是x86汇编语言中的64位寄存器。如果没有额外的上下文,这个函数的目的并不清楚,因为它是一小段代码,对输入参数执行一些按位操作。
更详细地分解代码,执行以下步骤:
莱亚eax,[rdi-1+rsi]:莱亚指令执行存储器地址计算,在本例中计算rdi和rsi-1的和,并将结果存储在eax寄存器中。neg指令对esi寄存器的值取反。eax,esi:and指令在eax和esi寄存器中的值之间执行按位AND运算,并将结果存储在eax. ret中:ret指令将eax寄存器中的值返回给调用函数。