![](/img/trans.png)
[英]How much faster are SSE4.2 string instructions than SSE2 for memcmp?
[英]The program crashes when running strlen() written in assembly with SSE4.2 instructions
我的程序在下面,我想用它來計算字符串的長度。
.CODE
EQUAL_EACH = 1000b
strlen_sse PROC
string equ [esp+4]
mov ecx, string
;ecx = string
mov eax, -16
mov edx, ecx
pxor xmm0, xmm0
STRLEN_LOOP:
add eax, 16
PcmpIstrI xmm0, xmmword ptr [edx+eax], EQUAL_EACH
jnz STRLEN_LOOP
add eax, ecx
ret
strlen_sse ENDP
END
main
內容如下:
#include<stdio.h>
#include<windows.h>
extern "C" int strlen_sse(const char* src);
int main(){
DWORD start,stop;
char* str = "asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdf";
start = GetTickCount();
for (; i < 100000000; i++) {
strlen_sse(str);
}
stop = GetTickCount();
printf("%lld ms\n",stop-start);
}
我的工作環境是visual studio 2015 community
,項目的平台是x64(active)
,編譯時沒有任何錯誤。
如何解決此錯誤?
C代碼可能已編譯為64位代碼,而匯編則為32位代碼。 在64位代碼段中包含32位代碼將不起作用。
將程序集更改為此(我也刪除了不必要的代碼):
.CODE
EQUAL_EACH = 1000b
strlen_sse PROC
mov rax, -16
mov rdx, [rsp + 8]
pxor xmm0, xmm0
STRLEN_LOOP:
add rax, 16
PcmpIstrI xmm0, xmmword ptr [rdx+rax], EQUAL_EACH
jnz STRLEN_LOOP
add rax, rcx
ret
strlen_sse ENDP
END
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.