- 注册时间
- 2007-12-28
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 12785
- 在线时间
- 小时
|
发表于 2009-2-11 23:29:53
|
显示全部楼层
终于将C版改为汇编语言版本了,测试发现,速度仅仅提高约10%,计算2^28次平方根,用时从 7902.3ms 提高到7192.7 ms。
函数原型:
extern "C" DWORD __fastcall UintSqrt(DWORD n);
汇编源代码:-
- .486P
- .387
- OPTION DOTNAME
- _TEXT SEGMENT DWORD PUBLIC FLAT 'CODE'
- ALIGN 004H
- _TEXT ENDS
-
- _DATA SEGMENT DWORD PUBLIC FLAT 'DATA'
- ALIGN 004H
- _DATA ENDS
-
- _BSS SEGMENT DWORD PUBLIC FLAT 'BSS'
- ALIGN 004H
- _BSS ENDS
-
- _RDATA SEGMENT DWORD PUBLIC FLAT 'DATA'
- ALIGN 004H
- _RDATA ENDS
-
- _TEXT1 SEGMENT DWORD PUBLIC FLAT 'CODE'
- ALIGN 004H
- _TEXT1 ENDS
-
- _DATA1 SEGMENT DWORD PUBLIC FLAT 'DATA'
- ALIGN 004H
- _DATA1 ENDS
-
- ASSUME CS:FLAT,DS:FLAT,SS:FLAT
-
- _DATA SEGMENT DWORD PUBLIC FLAT 'DATA'
- ALIGN 4
- _sqrtTab DB 00H
- DB 01H
- DB 01H
- DB 01H
- DB 02H
- DB 02H
- DB 02H
- DB 02H
- DB 02H
- DB 03H
- DB 03H
- DB 03H
- DB 03H
- DB 03H
- DB 03H
- DB 03H
- DB 04H
- DB 04H
- DB 04H
- DB 04H
- DB 04H
- DB 04H
- DB 04H
- DB 04H
- DB 04H
- DB 05H
- DB 05H
- DB 05H
- DB 05H
- DB 05H
- DB 05H
- DB 05H
- DB 05H
- DB 05H
- DB 05H
- DB 05H
- DB 06H
- DB 06H
- DB 06H
- DB 06H
- DB 06H
- DB 06H
- DB 06H
- DB 06H
- DB 06H
- DB 06H
- DB 06H
- DB 06H
- DB 06H
- DB 07H
- DB 07H
- DB 07H
- DB 07H
- DB 07H
- DB 07H
- DB 07H
- DB 07H
- DB 07H
- DB 07H
- DB 07H
- DB 07H
- DB 07H
- DB 07H
- DB 07H
- DB 080H
- DB 080H
- DB 081H
- DB 082H
- DB 083H
- DB 084H
- DB 085H
- DB 086H
- DB 087H
- DB 088H
- DB 089H
- DB 08aH
- DB 08bH
- DB 08cH
- DB 08dH
- DB 08eH
- DB 08fH
- DB 090H
- DB 090H
- DB 091H
- DB 092H
- DB 093H
- DB 094H
- DB 095H
- DB 096H
- DB 096H
- DB 097H
- DB 098H
- DB 099H
- DB 09aH
- DB 09bH
- DB 09bH
- DB 09cH
- DB 09dH
- DB 09eH
- DB 09fH
- DB 0a0H
- DB 0a0H
- DB 0a1H
- DB 0a2H
- DB 0a3H
- DB 0a3H
- DB 0a4H
- DB 0a5H
- DB 0a6H
- DB 0a7H
- DB 0a7H
- DB 0a8H
- DB 0a9H
- DB 0aaH
- DB 0aaH
- DB 0abH
- DB 0acH
- DB 0adH
- DB 0adH
- DB 0aeH
- DB 0afH
- DB 0b0H
- DB 0b0H
- DB 0b1H
- DB 0b2H
- DB 0b2H
- DB 0b3H
- DB 0b4H
- DB 0b5H
- DB 0b5H
- DB 0b6H
- DB 0b7H
- DB 0b7H
- DB 0b8H
- DB 0b9H
- DB 0b9H
- DB 0baH
- DB 0bbH
- DB 0bbH
- DB 0bcH
- DB 0bdH
- DB 0bdH
- DB 0beH
- DB 0bfH
- DB 0c0H
- DB 0c0H
- DB 0c1H
- DB 0c1H
- DB 0c2H
- DB 0c3H
- DB 0c3H
- DB 0c4H
- DB 0c5H
- DB 0c5H
- DB 0c6H
- DB 0c7H
- DB 0c7H
- DB 0c8H
- DB 0c9H
- DB 0c9H
- DB 0caH
- DB 0cbH
- DB 0cbH
- DB 0ccH
- DB 0ccH
- DB 0cdH
- DB 0ceH
- DB 0ceH
- DB 0cfH
- DB 0d0H
- DB 0d0H
- DB 0d1H
- DB 0d1H
- DB 0d2H
- DB 0d3H
- DB 0d3H
- DB 0d4H
- DB 0d4H
- DB 0d5H
- DB 0d6H
- DB 0d6H
- DB 0d7H
- DB 0d7H
- DB 0d8H
- DB 0d9H
- DB 0d9H
- DB 0daH
- DB 0daH
- DB 0dbH
- DB 0dbH
- DB 0dcH
- DB 0ddH
- DB 0ddH
- DB 0deH
- DB 0deH
- DB 0dfH
- DB 0e0H
- DB 0e0H
- DB 0e1H
- DB 0e1H
- DB 0e2H
- DB 0e2H
- DB 0e3H
- DB 0e3H
- DB 0e4H
- DB 0e5H
- DB 0e5H
- DB 0e6H
- DB 0e6H
- DB 0e7H
- DB 0e7H
- DB 0e8H
- DB 0e8H
- DB 0e9H
- DB 0eaH
- DB 0eaH
- DB 0ebH
- DB 0ebH
- DB 0ecH
- DB 0ecH
- DB 0edH
- DB 0edH
- DB 0eeH
- DB 0eeH
- DB 0efH
- DB 0f0H
- DB 0f0H
- DB 0f1H
- DB 0f1H
- DB 0f2H
- DB 0f2H
- DB 0f3H
- DB 0f3H
- DB 0f4H
- DB 0f4H
- DB 0f5H
- DB 0f5H
- DB 0f6H
- DB 0f6H
- DB 0f7H
- DB 0f7H
- DB 0f8H
- DB 0f8H
- DB 0f9H
- DB 0f9H
- DB 0faH
- DB 0faH
- DB 0fbH
- DB 0fbH
- DB 0fcH
- DB 0fcH
- DB 0fdH
- DB 0fdH
- DB 0feH
- DB 0feH
- DB 0ffH
- _DATA ENDS
-
-
- _TEXT SEGMENT DWORD PUBLIC FLAT 'CODE'
- ALIGN 4
-
- PUBLIC _sqrtTab
- PUBLIC @UintSqrt@4
-
- @UintSqrt@4 PROC NEAR ; COMDAT
- ; _n = ecx
-
- ; if (n<64)
- xor eax,eax
- cmp ecx, 64
- jae SHORT L25237
- mov al, BYTE PTR _sqrtTab[ecx]
- ret 0
-
- L25237:
- push ebx
-
- ; bc=log2(n)/2;
- bsr eax, ecx
- shr eax, 1
- jmp DWORD PTR L25370[eax*4]
-
- L25242:
- ; case 3:
- ; r=(sqrtTab[n]>>4);
- mov al, BYTE PTR _sqrtTab[ecx]
- shr eax, 4
-
- ; r1=r+1;
- ; if (r1*r1>=n) r++;
- lea ebx, DWORD PTR [eax+1]
- mov edx, ebx
- imul edx, ebx
- cmp ecx, edx
- sbb eax,-1
- pop ebx
- ret 0
-
- L25244:
- ; case 4:
- ; r=(sqrtTab[n>>2]>>3);
- mov ebx, ecx
- shr ebx, 2
- mov al, BYTE PTR _sqrtTab[ebx]
- shr eax, 3
-
- ; r1=r+1;
- ; if (r1*r1>=n) r++;
- lea ebx, DWORD PTR [eax+1]
- mov edx, ebx
- imul edx, ebx
- cmp ecx, edx
- sbb eax,-1
- pop ebx
- ret 0
-
- L25246:
- ; case 5:
- ; r=(sqrtTab[n>>4]>>2);
- mov ebx, ecx
- shr ebx, 4
- mov al, BYTE PTR _sqrtTab[ebx]
- shr eax, 2
-
- ; r1=r+1;
- ; if (r1*r1>=n) r++;
- lea ebx, DWORD PTR [eax+1]
- mov edx, ebx
- imul edx, ebx
- cmp ecx, edx
- sbb eax,-1
- pop ebx
- ret 0
-
- L25248:
- ; case 6:
- ; r=(sqrtTab[n>>6]>>1);
- mov ebx, ecx
- shr ebx, 6
- mov al, BYTE PTR _sqrtTab[ebx]
- shr eax, 1
-
- ; r1=r+1;
- ; if (r1*r1>=n) r++;
- lea ebx, DWORD PTR [eax+1]
- mov edx, ebx
- imul edx, ebx
- cmp ecx, edx
- sbb eax,-1
- pop ebx
- ret 0
-
-
- L25250:
- ; case 7:
- ; r=(sqrtTab[n>>8]);
- mov ebx, ecx
- shr ebx, 8
- mov al, BYTE PTR _sqrtTab[ebx]
-
- ; r1=r+1;
- ; if (r1*r1>=n)
- lea ebx, DWORD PTR [eax+1]
- mov edx, ebx
- imul edx, ebx
- cmp ecx, edx
- sbb eax,-1
- pop ebx
- ret 0
-
- L25252:
- ; case 8:
- ; r=(sqrtTab[n>>10]<<1);
- mov eax,ecx
- xor ebx,ebx
- shr eax, 10
- mov bl, BYTE PTR _sqrtTab[eax]
- add ebx, ebx ;r=(sqrtTab[n>>10]<<1);
-
- ;r= (n/r + r)/2;
- xor edx,edx
- mov eax,ecx
- div ebx
- add eax, ebx
- shr eax, 1
-
- ; if (r*r>n) r--;
- mov edx,eax
- imul edx,eax
- cmp ecx,edx
- sbb eax,0
- pop ebx
- ret 0
-
- L25254:
- ; case 9:
- ; r=(sqrtTab[n>>12]<<2);
-
- mov eax,ecx
- xor ebx,ebx
- shr eax, 12
- mov bl, BYTE PTR _sqrtTab[eax]
- shl ebx, 2
-
- ;r= (n/r + r)/2;
- xor edx,edx
- mov eax,ecx
- div ebx
- add eax, ebx
- shr eax, 1
-
- ; if (r*r>n) r--;
- mov edx,eax
- imul edx,eax
- cmp ecx,edx
- sbb eax,0
- pop ebx
- ret 0
-
- L25256:
- ; case 10:
- ; r=(sqrtTab[n>>14]<<3);
-
- mov eax,ecx
- xor ebx,ebx
- shr eax, 14
- mov bl, BYTE PTR _sqrtTab[eax]
- shl ebx, 3
-
- ;r= (n/r + r)/2;
- xor edx,edx
- mov eax,ecx
- div ebx
- add eax, ebx
- shr eax, 1
-
- ; if (r*r>n) r--;
- mov edx,eax
- imul edx,eax
- cmp ecx,edx
- sbb eax,0
- pop ebx
- ret 0
- L25258:
-
- ; case 11:
- ; r=(sqrtTab[n>>16]<<4);
- mov eax,ecx
- xor ebx,ebx
- shr eax, 16
- mov bl, BYTE PTR _sqrtTab[eax]
- shl ebx, 4
-
- ;r= (n/r + r)/2;
- xor edx,edx
- mov eax,ecx
- div ebx
- add eax, ebx
- shr eax, 1
-
- ; if (r*r>n) r--;
- mov edx,eax
- imul edx,eax
- cmp ecx,edx
- sbb eax,0
- pop ebx
- ret 0
-
- L25260:
- ; case 12:
- ; r=(sqrtTab[n>>18]<<5);
- mov eax,ecx
- xor ebx,ebx
- shr eax, 18
- mov bl, BYTE PTR _sqrtTab[eax]
- shl ebx, 5
-
- ;r= (n/r + r)/2;
- xor edx,edx
- mov eax,ecx
- div ebx
- add eax, ebx
- shr eax, 1
-
- ; if (r*r>n) r--;
- mov edx,eax
- imul edx,eax
- cmp ecx,edx
- sbb eax,0
- pop ebx
- ret 0
-
-
- L25262:
- ; case 13:
- ; r=(sqrtTab[n>>20]<<6);
- mov eax,ecx
- xor ebx,ebx
- shr eax, 20
- mov bl, BYTE PTR _sqrtTab[eax]
- shl ebx, 6
-
- ;r= (n/r + r)/2;
- xor edx,edx
- mov eax,ecx
- div ebx
- add eax, ebx
- shr eax, 1
-
- ; if (r*r>n) r--;
- mov edx,eax
- imul edx,eax
- cmp ecx,edx
- sbb eax,0
- pop ebx
- ret 0
-
- L25264:
- ; case 14:
- ; r=(sqrtTab[n>>22]<<7);
- mov eax,ecx
- xor ebx,ebx
- shr eax, 22
- mov bl, BYTE PTR _sqrtTab[eax]
- shl ebx, 7
-
- ;r= (n/r + r)/2;
- xor edx,edx
- mov eax,ecx
- div ebx
- add ebx, eax
- shr ebx, 1
-
- ;r= (n/r + r)/2;
- xor edx,edx
- mov eax,ecx
- div ebx
- add eax, ebx
- shr eax, 1
-
- ; if (r*r>n) r--;
- mov edx,eax
- imul edx,eax
- cmp ecx,edx
- sbb eax,0
- pop ebx
- ret 0
-
- L25266:
- ; case 15:
- ; r=(sqrtTab[n>>24]<<8);
-
- mov eax,ecx
- xor ebx,ebx
- shr eax, 24
- mov bh, BYTE PTR _sqrtTab[eax]
-
- ;r= (n/r + r)/2;
- xor edx,edx
- mov eax,ecx
- div ebx
- add ebx, eax
- shr ebx, 1
-
- ;r= (n/r + r)/2;
- xor edx,edx
- mov eax,ecx
- div ebx
- add eax, ebx
- shr eax, 1
-
- ; if (r*r>n) r--;
- mov edx,eax
- imul edx,eax
- cmp ecx,edx
- sbb eax,0
- pop ebx
- ret 0
-
- align 4
- L25370:
- DD 0
- DD 0
- DD 0
- DD L25242
- DD L25244
- DD L25246
- DD L25248
- DD L25250
- DD L25252
- DD L25254
- DD L25256
- DD L25258
- DD L25260
- DD L25262
- DD L25264
- DD L25266
- @UintSqrt@4 ENDP
- _TEXT ENDS
- END
复制代码 |
|