nasm astrcspn函数 x86
xxx.asm
%define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export astrcspn dllmain: mov eax,1 ret 12 ;---------------------------------------------------; ; 返回属于一组字符的字符在字符串中第一次出现的索引 ;---------------------------------------------------; astrcspn: push ebp mov ebp,esp sub esp,8 mov edx,[p1] ; char ptr 1 mov ecx,[p2] ; char ptr 2 xor eax,eax ; 保存str2指针,和ebx寄存器 mov [ebp-4],ecx mov [ebp-8],ebx ;-------------------------------------; ; 遍历 str1 ;-------------------------------------; .forStr1: mov bh,[edx] test bh,bh jz .return ;-------------------------------------; ; 遍历str2,如果相等退出函数 ;-------------------------------------; .forStr2: mov bl,[ecx] test bl,bl jz .forbreak cmp bh,bl je .return inc ecx jmp .forStr2 .forbreak: mov ecx,[ebp-4] inc edx inc eax jmp .forStr1 ;-------------------------------------; ; 恢复ebx寄存器,恢复堆栈 ;-------------------------------------; .return: mov ebx,[ebp-8] add esp,8 mov esp,ebp pop ebp ret 8
c++:
#include <iostream> #include <Windows.h> typedef size_t (CALLBACK* astrcspn_t)(const char* str1, const char* str2); astrcspn_t astrcspn; int main() { HMODULE myDLL = LoadLibraryA("xxx.dll"); astrcspn = (astrcspn_t)GetProcAddress(myDLL, "astrcspn"); const char* str1 = "fcba73"; const char* str2 = "1234567890"; printf("%d\n", strcspn(str1, str2)); // 4 printf("%d\n", astrcspn(str1, str2)); // 4 return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步