我的程序在下面,我想用它来计算字符串的长度。
.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)
,编译时没有任何错误。
如何修复此错误?
答案 0 :(得分:1)
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