您的位置:首页 > 其它

透过现象看本质。。。

2009-11-12 11:03 573 查看
在高级语言的赋值操作,把它用ASM 来表示真的是很奇妙的一件事。。。

现在让我来分析一下它的变量的赋值操作吧。

double sum=0, item=1;

对于这样的定义,大家应该很熟悉了,但是如果换成这个样子,你还能认出它吗?

11: double sum=0, item=1;

004015A8 mov dword ptr [ebp-8],0

004015AF mov dword ptr [ebp-4],0

004015B6 mov dword ptr [ebp-10h],0

004015BD mov dword ptr [ebp-0Ch],3FF00000h //程序中怎么没有变量1 呀 ?为此,我也困惑了好久,还有就是,为什么只定义了两个变量,ASM 中却有 四次的初始化?

带着这一个个的疑问,我们来看看程序执行时的内存模型吧。。。

对于 sum = 0, 程序执行时,先是初始化高位的地址空间,然后才是低位的,

所以一条 double 的赋值语句对应两条 ASM 的初始化,它们对应的是高位和低位的操作

float 的类型就只有一条。。。

现在我们知道了为什么 在高级语言中为什么 double 对应两条的 ASM 语句。。。

最后,我们来看看,它的赋值规则,这个事最让人困惑的地方了。。。

对于赋值,就要知道 编码的规则了,从计组中,我们知道,最高位0 表 +, 1 表 -;

double指数偏移基数:3FFH

也就是说 当 double i = 1;

它在ASM中就是004015BD mov dword ptr [ebp-0Ch],3FF00000h

具体逆向的时候,可以通过动态跟踪得到其值。。。

当然也可以通过浮点数的运算的到。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: