首页
论坛
课程
招聘
雪    币: 161
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝

[求助]mov eax, 38E38E39

2008-7-19 16:20 30567

[求助]mov eax, 38E38E39

2008-7-19 16:20
30567
006A0200  /$  8B41 04       mov     eax, dword ptr [ecx+4]  ;  0F0C78A8
006A0203  |.  85C0          test    eax, eax
006A0205  |.  75 01         jnz     short 006A0208
006A0207  |.  C3            retn
006A0208  |>  8B49 08       mov     ecx, dword ptr [ecx+8]  ;  0F0C7938
006A020B  |.  2BC8          sub     ecx, eax
006A020D  |.  B8 398EE338   mov     eax, 38E38E39
006A0212  |.  F7E9          imul    ecx
                    ;  EAX*ECX 低位放EAX  高位放EDX
006A0214  |.  C1FA 03       sar     edx, 3                  ;  右移3位,相当于/8
006A0217  |.  8BC2          mov     eax, edx                ;  4 10
006A0219  |.  C1E8 1F       shr     eax, 1F
006A021C  |.  03C2          add     eax, edx
006A021E  \.  C3            retn

请问将mov     eax, 38E38E39 这个有什么用??

[看雪官方培训]《安卓高级研修班(网课)》9月班开始招生!顶尖技术、挑战极限、工资翻倍!

最新回复 (60)
雪    币: 208
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wqrsksk 活跃值 2008-7-19 16:35
2
0
38E38E39是常量值吧...
雪    币: 161
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
davidcui 活跃值 2008-7-19 16:45
3
0
恩,是一个常量值,不知是否有什么特别的含义,也许没有
雪    币: 2362
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zapline 活跃值 2008-7-19 18:11
4
0
006A0212  |.  F7E9          imul    ecx                     ;  EAX*ECX 低位放EAX  高位放EDX
都写出来了  38E38E39*ECX
雪    币: 11003
活跃值: 活跃值 (85)
能力值: ( LV12,RANK:758 )
在线值:
发帖
回帖
粉丝
readyu 活跃值 12 2008-7-19 18:51
5
0
这个是编译器优化后的汇编代码,把除法优化为乘法。
实际上就是除以9.
因为:
x / 9  = ( x * 38E38E39 / 2 ^33)
雪    币: 11003
活跃值: 活跃值 (85)
能力值: ( LV12,RANK:758 )
在线值:
发帖
回帖
粉丝
readyu 活跃值 12 2008-7-19 19:13
6
0
来个VC 6的例子:
#include <stdio.h>
int main()
{
int a;
int b;

b = rand();
a = b/9;

printf("b = %d, a= %d", b , a);
getchar();
}

.text:00401000                   ; int __cdecl main(int argc, const char **argv, const char *envp)
.text:00401000                   _main proc near ; CODE XREF: start+AFp
.text:00401000 E8 0E 02 00 00        call _rand
.text:00401005 8B C8                 mov ecx, eax
.text:00401007 B8 39 8E E3 38        mov eax, 38E38E39h
.text:0040100C F7 E9                 imul ecx
.text:0040100E D1 FA                 sar edx, 1
.text:00401010 8B C2                 mov eax, edx
.text:00401012 C1 E8 1F              shr eax, 1Fh
.text:00401015 03 D0                 add edx, eax
.text:00401017 52                    push edx
.text:00401018 51                    push ecx
.text:00401019 68 30 70 40 00        push offset ??_C@_0O@DGOM@b?5?$DN?5?$CFd?0?5a?$DN?5?$CFd?$AA@ ; "b = %d, a= %d"
.text:0040101E E8 BF 01 00 00        call _printf
雪    币: 161
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
davidcui 活跃值 2008-7-20 14:55
7
0
不错,学了点东西。
雪    币: 2362
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zapline 活跃值 2008-7-20 15:03
8
0
厉害  佩服!
雪    币: 359
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
petnt 活跃值 12 2008-7-20 15:07
9
0
挖!娃!瓦!哇!
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
guoqianyi 活跃值 2008-7-20 15:10
10
0
上面的人真强大~~~~~
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yagumo 活跃值 2008-7-20 15:13
11
0
有运算规则吗
雪    币: 11003
活跃值: 活跃值 (85)
能力值: ( LV12,RANK:758 )
在线值:
发帖
回帖
粉丝
readyu 活跃值 12 2008-7-20 16:56
12
0
规则就是:
除数扩大X倍得到一个2^N。
除法就变为:被除数乘以X,再右移N位了。

A/B =  AX /BX = AX >> N  

比如 除以3,
会先乘以 0xAAAAAAAB ,再移位

雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhangfuhai 活跃值 2008-7-20 18:41
13
0

!开眼界了。。
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yagumo 活跃值 2008-7-20 19:58
14
0
但是你的除以9的例子中是算术右移1次,逻辑右移31次呀,跟公式的2^33的33次右移不一样呀~
雪    币: 504
活跃值: 活跃值 (13)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 活跃值 14 2008-7-21 00:04
15
0
这个贴,不得不拜
雪    币: 202
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
writer15 活跃值 2008-7-21 00:19
16
0
真佩服  readyu !

膜拜一下。
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ytnb 活跃值 2008-7-21 10:40
17
0
顶。强贴留名
雪    币: 335
活跃值: 活跃值 (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
人很老实 活跃值 2 2008-7-21 11:22
18
0
我觉得以上问题主要在于38E38E39这个值,原理是z = x/y = x*(1/y)。其中1/y是编译器自己算好加入代码。公式是x=(uint64(z)*M)>>33 ,其中M的计算公式为M=((1<<33)+1)/y 比如y=9的时候 200000001/ 9 = 38E38E39。
雪    币: 504
活跃值: 活跃值 (13)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 活跃值 14 2008-7-21 12:01
19
0
昨天找人用VC6试过了,例如除数是821的时候,就不止移33位了。这个是近似算法,只是因为整数寄存器显示不了小数,所以得出正确的答案。具体算法不明

VS2005已经没有这种“优化”了。昨天跟朋友讨论的结果是将IDIV分成这么多条指令,事实上是降低CPU效率的。

VC6有这个优化估计是因为早期CPU除法比乘法慢很多。
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yancker 活跃值 2008-7-21 14:42
20
0
学习了,顶!!
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
nichos 活跃值 2008-7-24 10:29
21
0
《加密与解密》这本书里整数的除法那一章有讲这个

[QUOTE=davidcui;483454]006A0200  /$  8B41 04       mov     eax, dword ptr [ecx+4]  ;  0F0C78A8
006A0203  |.  85C0          test    eax, eax
006A0205  |.  75 01         jnz...[/QUOTE]
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
nichos 活跃值 2008-7-24 10:31
22
0
顺便贴一下minimize size选项下的汇编:
00401000   push        esi
00401001   call        _rand (0040105c)
00401006   mov         ecx,eax
00401008   push        9
0040100A   cdq
0040100B   pop         esi
0040100C   idiv        eax,esi
0040100E   push        eax
0040100F   push        ecx
00401010   push        offset string "b = %d, a= %d\n" (00407030)
00401015   call        _printf (00401021)
0040101A   add         esp,0Ch
0040101D   xor         eax,eax
0040101F   pop         esi
00401020   ret

maximize speed下的是
00401000   call        _rand (0040106b)
00401005   mov         ecx,eax
00401007   mov         eax,38E38E39h
0040100C   imul        ecx
0040100E   sar         edx,1
00401010   mov         eax,edx
00401012   shr         eax,1Fh
00401015   add         edx,eax
00401017   push        edx
00401018   push        ecx
00401019   push        offset string "b = %d, a= %d\n" (00407030)
0040101E   call        _printf (00401030)
00401023   add         esp,0Ch
00401026   xor         eax,eax
00401028   ret

minimize下由于用idiv指令,节省了8个字节

雪    币: 215
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
惜雪 活跃值 2008-7-24 10:35
23
0
受教了!  谢谢!
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
nichos 活跃值 2008-7-24 10:36
24
0
由于乘法结果的高32位存在edx中,低32位存在eax中,所以取出edx就相当于把结果右移了32位,再算术右移1位,总共是33位
至于后面的逻辑右移31位,是要把MSB符号位取出来,是负数的话就把除法的结果加1

雪    币: 2025
活跃值: 活跃值 (15)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
sessiondiy 活跃值 4 2008-7-24 12:16
25
0
还好没有了.
不然注册机会写得莫明其妙
雪    币: 310
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
stalker 活跃值 8 2008-7-24 12:59
26
0
《黑客反汇编揭秘》里也有这么一说
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
DebugYT 活跃值 2008-8-6 21:43
27
0
受教了!

心中一切疑云都已散去!!
雪    币: 225
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
okyzx 活跃值 2008-10-27 11:17
28
0
readyu强~~~
雪    币: 1829
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
Bughoho 活跃值 8 2009-1-31 04:40
29
0
含精量这么高的贴,不得不顶.
by the way:VS2005我不知道,2008仍然有这种"优化",也许是你的参数没设置好吧
雪    币: 504
活跃值: 活跃值 (13)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 活跃值 14 2009-1-31 07:39
30
0
那就不清楚了。。。不过你想想流水线。。。一条变N条指令,还占用3个寄存器。。。怎么也觉得是慢了的
雪    币: 2058
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
书呆彭 活跃值 6 2009-1-31 08:16
31
0
硬件除法器的效率,不用说比加减,就是比乘法,也至少慢几倍。

硬件乘法器目前的研究已经相当成熟,比如十分常见的化莱氏树并行加法快速乘法器,对于设计好的乘法器,比如很多DSP中的乘加单元,在流水中可以一个周期完成一条乘法(当然是乘法器流水线处于理想状态下),在通常情况下,一条乘法指令可以在4~8个周期内完成。

但除法器要完成一次除法运算,在当今极度优化的硬件上,也至少需要十几个周期。

用乘法替换除法的近似算法,在库和编译器里随处可见。如果配置编译器按最大速度优化,那么编译器很可能会执行这种优化。而如果按最小体积优化,可能就使用硬件的除法指令了。

想起个有意思的事,大家在分析时经常见到51eb851f 这个值吧,这是编译器优化常见的一个值,再配合几次移位可以实现对进制100的除法。

我记得有一次看到一篇破文,作者不明白这个用法,说“这个操作数比较有意思,将它变为十进制为1374389535,不知是不是软件作者的手机号”,着实让我笑了一笑,觉得这个人太可爱,想像力真是太丰富了,可惜手机号是十一位,还差一位啊。
雪    币: 2151
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
shellwolf 活跃值 10 2009-1-31 09:55
32
0
编译优化很神奇,据说对付vm也要用这个东西
雪    币: 203
活跃值: 活跃值 (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qdk 活跃值 2009-1-31 13:12
33
0
楼上的,不会是反汇编之后,再编译一次吧。

数学库里面还有很多莫名其妙的常量。
雪    币: 29
活跃值: 活跃值 (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
sungy 活跃值 1 2009-2-1 11:11
34
0
高深啊呀,读懂你
雪    币: 203
活跃值: 活跃值 (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qdk 活跃值 2009-2-1 13:50
35
0
只可惜,编译器的优化动作并不工作在这么靠后的位置上
雪    币: 263
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
烁皓 活跃值 2009-2-1 17:57
36
0
这个贴,不得不拜
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
guoqianyi 活跃值 2009-2-2 16:59
37
0
这个贴,不得不拜
雪    币: 1264
活跃值: 活跃值 (13)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
AsmDebuger 活跃值 1 2009-2-6 14:10
38
0
拜读过,边看书边泡坛子还真的不错。
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wangyumeng 活跃值 2009-2-6 15:43
39
0
学习了,感謝分享~~~~~
雪    币: 221
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
evilight 活跃值 1 2009-2-23 14:25
40
0
牛!!!!
我说我咋老看见些很奇怪的值。。
原来有的是函数指针,有的是有如此特效呀。
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
DecoderEx 活跃值 2009-8-5 10:19
41
0
立即数嘛。。
雪    币: 49
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
人与人 活跃值 2009-11-27 10:50
42
0
在这迷湖了很久,受教了
雪    币: 265
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
听听雨吧 活跃值 2009-12-13 13:24
43
0
可能是因为没有好的除法器,但有很好的乘法器,速度很彪悍
雪    币: 555
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:16 )
在线值:
发帖
回帖
粉丝
kinglord 活跃值 2009-12-13 16:25
44
0
看雪果然大虾云集
而且乐于助人啊,气氛真好
以后继续关注
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
baiyunbian 活跃值 2010-1-22 14:42
45
0
高人,不点拨打死也想不出来了http://bbs.pediy.com/images/smilies/confused.gif
雪    币: 2145
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
LiXMX 活跃值 2010-1-22 14:55
46
0
长见识了,
一直对机器的除法运算不明白
雪    币: 270
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SIsIa 活跃值 2010-1-29 23:27
47
0
占位,学习,我今天貌似还遇到了呢!现在知道咋回事了,原来是除法运算。
雪    币: 18
活跃值: 活跃值 (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ayunaa 活跃值 2010-1-30 01:39
48
0
这谁想出来的?我靠
雪    币: 214
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
柯睡 活跃值 2010-2-13 09:10
49
0
高   这个还真没看出来啊
雪    币: 100
活跃值: 活跃值 (11)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
nbw 活跃值 24 2010-2-15 19:29
50
0
这个是编译器优化,除以10也有类似的东西
游客
登录 | 注册 方可回帖
返回