最近敲代码,发现这个程序的效率确实是一个很大的问题,在配置高的电脑上没感觉,低配置的就不行了,研究研究,写了几个函数. //////////////////////////////////////////////////////////////// // MyAsmFunc.h // 默认调用约定为cdecl #if !defined(S_MYASMFUNC_H__INCLUDED_) #define S_MYASMFUNC_H__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #ifndef S_ASM_DEFINE #define S_ASM_DEFINE #define ASM __asm //避免假死 #define ASMAPI __declspec(naked) typedef char CHAR, *PCHAR; typedef unsigned long ULONG, DWORD; typedef void *PVOID; typedef unsigned short WORD, WCHAR, *PWCHAR; #endif void Asm_memcpy(PVOID pDst, PVOID pSrc, DWORD dwSize); void Asm_memset(PVOID pAddr, CHAR chrSet, DWORD dwSize); #define Asm_ZeroMemory(pAddr, dwSize) Asm_memset(pAddr, 0, dwSize) DWORD Asm_strlenA(PCHAR pstr); DWORD Asm_strlenW(PWCHAR pwstr); #ifdef UNICODE #define Asm_strlen Asm_strlenW //判断非0双字节数 #else #define Asm_strlen Asm_strlenA //判断非0字节数 #endif void Asm_strcpyA(PCHAR pStrDst, PCHAR pStrSrc); void Asm_strcpyW(PWCHAR pStrDst, PWCHAR pStrSrc); #ifdef UNICODE #define Asm_strcpy Asm_strcpyW #else #define Asm_strcpy Asm_strcpyA #endif #endif //////////////////////////////////////////////////////////////// // MyAsmFunc.cpp #include "MyAsmFunc.h" void ASMAPI Asm_memcpy(PVOID pDst, PVOID pSrc, DWORD dwSize) { ASM { PUSH EBP; MOV EBP, ESP; MOV ECX, dwSize; MOV ESI, pSrc; MOV EDI, pDst; CMP dwSize, 0x400; //1KB JLE __GO_SMALL; PUSH ECX; SHR ECX, 2; //右移2位=除以4 REP MOVSD; POP ECX; AND ECX, 0x3; //00000011=与4取余 __GO_SMALL: REP MOVSB; MOV ESP, EBP; POP EBP; RETN; } } void ASMAPI Asm_memset(PVOID pAddr, CHAR chrSet, DWORD dwSize) { ASM { PUSH EBP; MOV EBP, ESP; MOV EAX, DWORD PTR [EBP + 0xC]; //靠,不让用chrSet MOV ECX, dwSize; MOV EDI, pAddr; CMP ECX, 0x400; //1KB JLE __GO_SMALL; PUSH ECX; SHR ECX, 2; REP STOSD; POP ECX; AND ECX, 0x3; __GO_SMALL: REP STOSB; MOV ESP, EBP; POP EBP; RETN; } } DWORD ASMAPI Asm_strlenA(PCHAR pstr) { ASM { PUSH EBP; MOV EBP, ESP; XOR EAX, EAX; OR ECX, 0xFFFFFFFF; MOV EDI, pstr; REPNE SCASB; NOT ECX; //取反 DEC ECX; //减一 MOV EAX, ECX; MOV ESP, EBP; POP EBP; RETN; } } DWORD ASMAPI Asm_strlenW(PWCHAR pwstr) { ASM { PUSH EBP; MOV EBP, ESP; XOR EAX, EAX; OR ECX, 0xFFFFFFFF; MOV EDI, pwstr; REPNE SCASW; NOT ECX; //取反 DEC ECX; //减一 MOV EAX, ECX; MOV ESP, EBP; POP EBP; RETN; } } void ASMAPI Asm_strcpyA(PCHAR pStrDst, PCHAR pStrSrc) { ASM { PUSH EBP; MOV EBP, ESP; MOV EAX, pStrSrc; PUSH EAX; CALL Asm_strlenA; ADD ESP, 0x4; INC EAX; //包括'/0' PUSH EAX; MOV EAX, pStrSrc; PUSH EAX; MOV EAX, pStrDst; PUSH EAX; CALL Asm_memcpy; ADD ESP, 0x4 * 3; MOV ESP, EBP; POP EBP; RETN; } } void ASMAPI Asm_strcpyW(PWCHAR pStrDst, PWCHAR pStrSrc) { ASM { PUSH EBP; MOV EBP, ESP; MOV EAX, pStrSrc; PUSH EAX; CALL Asm_strlenW; ADD ESP, 0x4; INC EAX; //包括'/0' SHL EAX, 1; //UNICODE,乘以2 PUSH EAX; MOV EAX, pStrSrc; PUSH EAX; MOV EAX, pStrDst; PUSH EAX; CALL Asm_memcpy; ADD ESP, 0x4 * 3; MOV ESP, EBP; POP EBP; RETN; } }