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
", strcspn(str1, str2)); // 4
printf("%d
", astrcspn(str1, str2)); // 4
return 0;
}