我正在学习逆向工程。所以我正在编写一些程序并尝试理解它们的程序集。我偶然发现了一个奇怪的案例,我认为我无法单独解决它。
这是c代码:
#include <stdio.h>
int main(){
char *texto = "O numero e %d\n";
int i = 10;
while(i){
printf(texto, i--);
}
return 0;
}
IDA 生产的程序集如下:
mov eax, [esp+28]
lea edx, [eax-1] ; The part i don't understand
mov [esp+28], edx
mov [esp+4], eax
mov eax, [esp+18h]
mov [esp], eax ; char *
call _printf
我能理解的是它将旧值存储在 eax 中并推送到堆栈(我故意没有打开优化)然后推送格式。虽然这发生在中间i--
,但我无法理解它是如何工作的。所以它获取eax-1
和存储的地址,edx
然后将它存储在中i
,但eax
不保存地址而是一个值。
提前致谢。