运行用SSE4.2指令在程序集中编写的strlen()时程序崩溃

时间:2015-11-29 13:53:54

标签: assembly sse strlen

我的程序在下面,我想用它来计算字符串的长度。

.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

运行时总会崩溃。是什么造成的? enter image description here

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),编译时没有任何错误。

如何修复此错误?

1 个答案:

答案 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