汇编的常见操作
Posted persuit
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编的常见操作相关的知识,希望对你有一定的参考价值。
#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; }
以上是关于汇编的常见操作的主要内容,如果未能解决你的问题,请参考以下文章