找回密码
 欢迎注册
查看: 11506|回复: 7

[擂台] strlen的sse做法

[复制链接]
发表于 2015-1-15 13:11:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
org 100h
macro align value { rb (value-1)-($+value-1) mod value }

movaps  xmm0,   [b]
mov     si,     d
lea     bx,     [si-16]
lek:
movaps  xmm1,   xmm0
add     bx,     16
psubb   xmm1,   [bx]
pmovmskb eax,   xmm1
test    ax,     ax
jz      lek
sub     bx,     si
bsf     ax,     ax
add     ax,     bx

mov     dx,     ax
mov     ah,     2
int     $21
ret

align 16
b:db 16 dup 128
d:db "1234567890123456789012345678901234567890",0           

循环部分为
lek:
movaps  xmm1,   xmm0
add     bx,     16
psubb   xmm1,   [bx]
pmovmskb eax,   xmm1
test    ax,     ax
jz      lek
有更快的吗(如果前面不对齐,用普通做法或这个的改版,花不了多长时间)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2015-1-15 13:11:40 | 显示全部楼层
  1. lek:
  2. movaps  xmm1,   xmm0
  3. add     bx,     16
  4. psubb   xmm1,   [bx]
  5. pmovmskb eax,   xmm1
  6. test    ax,     ax
  7. jz      lek
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2015-1-15 13:11:52 | 显示全部楼层
  1. org 100h
  2. macro align value { rb (value-1)-($+value-1) mod value }

  3. movaps  xmm0,   [b]
  4. mov     si,     d
  5. lea     bx,     [si-16]
  6. lek:
  7. movaps  xmm1,   xmm0
  8. add     bx,     16
  9. psubb   xmm1,   [bx]
  10. pmovmskb eax,   xmm1
  11. test    ax,     ax
  12. jz      lek
  13. sub     bx,     si
  14. bsf     ax,     ax
  15. add     ax,     bx

  16. mov     dx,     ax
  17. mov     ah,     2
  18. int     $21
  19. ret

  20. align 16
  21. b:db 16 dup 128
  22. d:db "1234567890123456789012345678901234567890",0           
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2015-1-15 13:39:41 | 显示全部楼层
现在都进入64位时代了,楼上还写16位的代码?
16位代码只限于学习汇编和交作业,在实践中意义不大,下面的链接给出一个大牛写的2个32位版本的代码。一个是普通版本,一个是使用SSE2指令的版本。
http://bbs.emath.ac.cn/forum.php ... =5977&pid=56769

点评

pcmpeqb xmm1, xmm0 比我的好,循环里bsf edx, edx 就不要吧,bsf还是相对慢  发表于 2015-1-15 15:30
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2015-1-15 16:15:18 | 显示全部楼层
liangbch 发表于 2015-1-15 13:39
现在都进入64位时代了,楼上还写16位的代码?
16位代码只限于学习汇编和交作业,在实践中意义不大,下面的 ...

另外,这个貌似效率更高
  1. L0:     lodsd
  2. L1:     lea  ecx, [eax-01010101H]
  3.                 not  eax
  4.                 and  eax, ecx
  5.                 and  eax, 80808080H
  6.                 jz   L0
复制代码

点评

差不多吧  发表于 2015-1-15 16:24
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2015-3-25 16:09:28 | 显示全部楼层
惊呆了!!!!!!!!就像我的头像一样~~~~
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-23 17:38 , Processed in 0.023654 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表