匯編的常見操作
阿新 • • 發佈:2017-10-13
lods ret bsp windows size ++ () asm 設置
#include <stdio.h> #include <windows.h> int sal_asm(int x,int y) { __asm{ mov eax,x; mov cl,byte ptr y; sal eax,cl; } } int shl_asm(int x,int y) { __asm{ mov eax,x; mov cl,byte ptr y; shl eax,cl; } } void strncpy_asm(char *dst ,char*src ,size_t len) { __asm{ mov edi,[ebp+8]; mov esi,[ebp+0xc]; mov ecx,[ebp+0x10]; cld; 設置DF = 0,ESI,EDI++ rep movs byte ptr[edi],byte ptr[esi]; } } unsigned int strlen_asm(char *s) { __asm{ xor eax,eax; xor ebx,ebx; mov esi,s; L0: lodsb; 把[esi]種的一個字節放到al中,esi++ cld; test al,al; 判斷esi是否已經指向字符串s的‘\0‘ jz L1; INC ebx; jmp L0; L1: mov eax,ebx } } int strncmp_asm(const char *s1,const char *s2,size_t len) { __asm{ mov ecx,len; mov esi,s1; mov edi,s2; repz cmpsb; 當ecx不為零並且zf=1 jecxz L1; ecx為0,前len個字節比較完畢 js L2; jns L2; L1: js L2; 最後一個字符不相等 jns L2; 最後一個字符不相等 xor eax,eax; 最後一個字符串相等 jmp L4; L2: xor eax,eax; xor ebx,ebx; mov al, byte ptr[esi-1]; mov bl, byte ptr[edi-1]; sub eax,ebx; jmp L4 L4: } } int strcmp_asm(const char *s1,const char *s2) { __asm{ xor eax,eax; mov esi,s1; mov edi,s2; L2: lodsb; scasb; jne L1; test al,al;判斷是否為‘\0‘ jne L2; xor eax,eax; jmp L3; L1: xor ebx,ebx; mov bl,byte ptr[edi-1]; sub eax,ebx; 不相等字符做差返回 L3: } } int main() { char buf[128] = {0}; char *str = "hello"; char *str1 = "hello"; int len = 0; len = strlen_asm(str); strncpy_asm(buf,str,len); printf("strncpy_asm buf: %s and len : %d\n",buf,len); printf ("shl_asm :10 << 5 = %d \n",shl_asm(10,5)); printf ("sal_asm :10 << 5 = %d \n",sal_asm(10,5)); printf("s1 %s s2 \n",strncmp_asm(str,str1,8)==0?"==":"!="); printf("s1 %s s2 \n",strcmp_asm(str,str1)==0?"==":"!="); system("pause"); return 0; }
匯編的常見操作