l4m2 发表于 2015-1-15 13:11:24

strlen的sse做法

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

movapsxmm0,   
mov   si,   d
lea   bx,   
lek:
movapsxmm1,   xmm0
add   bx,   16
psubb   xmm1,   
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:
movapsxmm1,   xmm0
add   bx,   16
psubb   xmm1,   
pmovmskb eax,   xmm1
test    ax,   ax
jz      lek
有更快的吗(如果前面不对齐,用普通做法或这个的改版,花不了多长时间)

l4m2 发表于 2015-1-15 13:11:40

lek:
movapsxmm1,   xmm0
add   bx,   16
psubb   xmm1,   
pmovmskb eax,   xmm1
test    ax,   ax
jz      lek

l4m2 发表于 2015-1-15 13:11:52

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

movapsxmm0,   
mov   si,   d
lea   bx,   
lek:
movapsxmm1,   xmm0
add   bx,   16
psubb   xmm1,   
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         

liangbch 发表于 2015-1-15 13:39:41

现在都进入64位时代了,楼上还写16位的代码?
16位代码只限于学习汇编和交作业,在实践中意义不大,下面的链接给出一个大牛写的2个32位版本的代码。一个是普通版本,一个是使用SSE2指令的版本。
http://bbs.emath.ac.cn/forum.php?mod=redirect&goto=findpost&ptid=5977&pid=56769

l4m2 发表于 2015-1-15 16:15:18

liangbch 发表于 2015-1-15 13:39
现在都进入64位时代了,楼上还写16位的代码?
16位代码只限于学习汇编和交作业,在实践中意义不大,下面的 ...

另外,这个貌似效率更高
L0:   lodsd
L1:   leaecx,
                noteax
                andeax, ecx
                andeax, 80808080H
                jz   L0

neluzyy1 发表于 2015-3-25 16:09:28

惊呆了!!!!!!!!就像我的头像一样~~~~
页: [1]
查看完整版本: strlen的sse做法