求字符串长度理论(不是简单的用循环的)
求字符串长度理论
不用判断语句,不用循环语句,只有顺序,如何求得字符串长度,请各位赐教~!!!!
[解决办法]
C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\intel\strlen.asm
- Assembly code
page ,132 title strlen - return the length of a null-terminated string;***;strlen.asm - contains strlen() routine;; Copyright (c) Microsoft Corporation. All rights reserved.;;Purpose:; strlen returns the length of a null-terminated string,; not including the null byte itself.;;******************************************************************************* .xlist include cruntime.inc .listpage;***;strlen - return the length of a null-terminated string;;Purpose:; Finds the length in bytes of the given string, not including; the final null character.;; Algorithm:; int strlen (const char * str); {; int length = 0;;; while( *str++ ); ++length;;; return( length );; };;Entry:; const char * str - string whose length is to be computed;;Exit:; EAX = length of the string "str", exclusive of the final null byte;;Uses:; EAX, ECX, EDX;;Exceptions:;;******************************************************************************* CODESEG public strlenstrlen proc \ buf:ptr byte OPTION PROLOGUE:NONE, EPILOGUE:NONE .FPO ( 0, 1, 0, 0, 0, 0 )string equ [esp + 4] mov ecx,string ; ecx -> string test ecx,3 ; test if string is aligned on 32 bits je short main_loopstr_misaligned: ; simple byte loop until string is aligned mov al,byte ptr [ecx] add ecx,1 test al,al je short byte_3 test ecx,3 jne short str_misaligned add eax,dword ptr 0 ; 5 byte nop to align label below align 16 ; should be redundantmain_loop: mov eax,dword ptr [ecx] ; read 4 bytes mov edx,7efefeffh add edx,eax xor eax,-1 xor eax,edx add ecx,4 test eax,81010100h je short main_loop ; found zero byte in the loop mov eax,[ecx - 4] test al,al ; is it byte 0 je short byte_0 test ah,ah ; is it byte 1 je short byte_1 test eax,00ff0000h ; is it byte 2 je short byte_2 test eax,0ff000000h ; is it byte 3 je short byte_3 jmp short main_loop ; taken if bits 24-30 are clear and bit ; 31 is setbyte_3: lea eax,[ecx - 1] mov ecx,string sub eax,ecx retbyte_2: lea eax,[ecx - 2] mov ecx,string sub eax,ecx retbyte_1: lea eax,[ecx - 3] mov ecx,string sub eax,ecx retbyte_0: lea eax,[ecx - 4] mov ecx,string sub eax,ecx retstrlen endp end