strlen的sse做法
org 100hmacro 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
有更快的吗(如果前面不对齐,用普通做法或这个的改版,花不了多长时间) lek:
movapsxmm1, xmm0
add bx, 16
psubb xmm1,
pmovmskb eax, xmm1
test ax, ax
jz lek 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 现在都进入64位时代了,楼上还写16位的代码?
16位代码只限于学习汇编和交作业,在实践中意义不大,下面的链接给出一个大牛写的2个32位版本的代码。一个是普通版本,一个是使用SSE2指令的版本。
http://bbs.emath.ac.cn/forum.php?mod=redirect&goto=findpost&ptid=5977&pid=56769
liangbch 发表于 2015-1-15 13:39
现在都进入64位时代了,楼上还写16位的代码?
16位代码只限于学习汇编和交作业,在实践中意义不大,下面的 ...
另外,这个貌似效率更高
L0: lodsd
L1: leaecx,
noteax
andeax, ecx
andeax, 80808080H
jz L0 惊呆了!!!!!!!!就像我的头像一样~~~~
页:
[1]