作者在 2008-07-18 22:44:59 发布以下内容
经常反汇编的话,在调用子程序开始的地方,都会看到:
push ebp
mov ebp,esp
add esp,FFFFFFF8 ;也可能是其它的值
... ...
push ebp
mov ebp,esp
add esp,FFFFFFF8 ;也可能是其它的值
... ...
这种情况的指令形式。
编译器采用的是“+”的方法来开辟局部变量的空间的。
其实,我们要知道FFFFFFF8真正的值的话,就得采用“补码取反加1”才知道它的“绝对值”,是8。
有没有更加方便的方法呢?有!
我们知道,正数+负数=0(前提是两者绝对值相等),所以,我们用“0-负数”的方法也可以得到“正数”,即“绝对值”。
00000000-FFFFFFF8=8
00000000-FFFFFFAC=54
当然,这种算法涉及到最后一位的借位问题,把这点忽略掉是不会影响我们得到“绝对值”的。
编译器采用的是“+”的方法来开辟局部变量的空间的。
其实,我们要知道FFFFFFF8真正的值的话,就得采用“补码取反加1”才知道它的“绝对值”,是8。
有没有更加方便的方法呢?有!
我们知道,正数+负数=0(前提是两者绝对值相等),所以,我们用“0-负数”的方法也可以得到“正数”,即“绝对值”。
00000000-FFFFFFF8=8
00000000-FFFFFFAC=54
当然,这种算法涉及到最后一位的借位问题,把这点忽略掉是不会影响我们得到“绝对值”的。