首页
社区
课程
招聘
x*40>>32,下面哪种代码执行效率最高?
发表于: 2010-9-10 11:25 6571

x*40>>32,下面哪种代码执行效率最高?

2010-9-10 11:25
6571
x*40>>32

asm1:
MOV EAX,x
MOV EBX,40
MUL EBX
MOV EAX,EDX

asm2:
MOV EAX,x
SHR EAX,24
LEA EAX,[EAX+EAX*4]
SHR EAX,5

asm3:
MOV EAX,x
SHR EAX,25
LEA EAX,[EAX+EAX*4]
SHR EAX,4

asm1比起asm2、asm3,哪个要快一些?
asm2和asm3的执行效率一样吗?

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
个人感觉啊。
asm2,asm3应该是一样的哦。
好像比asm1还快些啊。
优化都是用移位代替乘法的。
2010-9-10 12:42
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
1、asm1用到了mul指令,该指令执行效率是比较慢的,好像mul指令在硬件层是使用加法器或者之类的东东叠加起来的,该指令没有移位速度快!
2、asm3的话,本人猜测(不知道对不对),合起来将会涉及5个字节的操作,而asm2将只涉及4个字节操作!
第二条,纯属猜测!
忘达人解答!
2010-9-10 12:44
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
查INTEL指令手册,各指令执行时钟如下
asm1:
MOV EAX,x                        1
MOV EBX,40                        1
MUL EBX                                10
MOV EAX,EDX                        1

asm2:
MOV EAX,x                        1
SHR EAX,24                        1
LEA EAX,[EAX+EAX*4]                1
SHR EAX,5                        1

asm3:
MOV EAX,x                        1
SHR EAX,25                        1
LEA EAX,[EAX+EAX*4]                1
SHR EAX,4                        1

第一个肯定是慢很多
2010-9-10 18:56
0
雪    币: 209
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
asm2和asm3一样吗?
2010-9-11 19:50
0
雪    币: 187
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
只能大概分析下,而且情况复杂性远非我们所及。实际开发中,实时性高的程序段可以用专门软件测试。给你个开源软件。用法见附件中testp.txt。
上传的附件:
2010-9-11 22:46
0
雪    币: 209
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
鸟语学得不太好。。能说明一下大致怎么用不?
2010-9-12 00:40
0
雪    币: 440
活跃值: (87)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
8
asm2 asm3的计算结果都不对,即使再快也没有任何意义。

给出我的代码
#include <stdio.h>

unsigned int _declspec(naked) Fun0(unsigned int x)
{
_asm
{
enter 0, 0;
push esi;
push edi;

mov eax, [ebp+8h];
xor edx, edx;

shld edx, eax, 3;
shl eax, 3;
mov edi, edx;
mov esi, eax;
shld edx, eax, 2;
shl eax, 2;
add eax, esi;
adc edx, edi;

mov eax, edx;

pop edi;
pop esi;
leave;
ret;
}
}

int main()
{
unsigned int x, y1, y2;

for (x=0x00000000; x<0xFFFFFFFF; x++)
{
y1 = unsigned __int64(x) * 40 >> 32;
y2 = Fun0(x);
if ( y1 != y2)
{
printf("x=%08X y1= %08X y2=%08X\n", x, y1, y2);
break;
}
}
return 0;
}


仔细计算指令周期和,发现好像比MUL慢。。。。。
2010-9-12 12:35
0
雪    币: 209
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
计算结果没有错误。。。谢谢
2010-9-12 14:05
0
雪    币: 209
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
版主果然威武!!!我自作聪明,今天用的时候才发现自己的错误。。。但不太清楚究竟是什么原因。。。
2010-9-17 11:23
0
雪    币: 215
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
溢出了吧吧吧~~~
2013-4-8 11:42
0
雪    币: 264
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
k4b
12
MUL要10个周期?!那为什么做CPU的工程师不把实现MUL的逻辑硬件撤掉,节省出几个晶体管补强下别的功能?
2013-4-8 18:46
0
雪    币: 209
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
谢谢8楼和11楼,两年半前没能明白为什么结果不正确,现在回头一看,终于发现了- -b
2013-6-6 20:49
0
雪    币: 517
活跃值: (35)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
14
这么早的帖子,这么好玩?
2013-6-7 12:26
0
游客
登录 | 注册 方可回帖
返回
//