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;
}
posted @ 2020-09-26 13:40  Ajanuw  阅读(145)  评论(0编辑  收藏  举报