能力值:
( LV2,RANK:10 )
|
-
-
2 楼
个人感觉啊。
asm2,asm3应该是一样的哦。
好像比asm1还快些啊。
优化都是用移位代替乘法的。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
1、asm1用到了mul指令,该指令执行效率是比较慢的,好像mul指令在硬件层是使用加法器或者之类的东东叠加起来的,该指令没有移位速度快!
2、asm3的话,本人猜测(不知道对不对),合起来将会涉及5个字节的操作,而asm2将只涉及4个字节操作!
第二条,纯属猜测!
忘达人解答!
|
能力值:
( 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
第一个肯定是慢很多
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
asm2和asm3一样吗?
|
能力值:
( LV4,RANK:50 )
|
-
-
6 楼
只能大概分析下,而且情况复杂性远非我们所及。实际开发中,实时性高的程序段可以用专门软件测试。给你个开源软件。用法见附件中testp.txt。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
鸟语学得不太好。。能说明一下大致怎么用不?
|
能力值:
( 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慢。。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
计算结果没有错误。。。谢谢
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
版主果然威武!!!我自作聪明,今天用的时候才发现自己的错误。。。但不太清楚究竟是什么原因。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
溢出了吧吧吧~~~
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
MUL要10个周期?!那为什么做CPU的工程师不把实现MUL的逻辑硬件撤掉,节省出几个晶体管补强下别的功能?
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
谢谢8楼和11楼,两年半前没能明白为什么结果不正确,现在回头一看,终于发现了- -b
|
能力值:
( LV6,RANK:90 )
|
-
-
14 楼
这么早的帖子,这么好玩?
|
|
|