簡體   English   中英

運行以SSE4.2指令匯編編寫的strlen()時,程序崩潰

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM