nasm astrncmp函数 x86

xxx.asm:

%define p1 ebp+8
%define p2 ebp+12
%define p3 ebp+16

section .text
  global dllmain
  export astrncmp

dllmain:
  mov eax,1
  ret 12

;------------------------------------------------;
;	比较最多两个字符串的指定字符数。
;------------------------------------------------;
astrncmp:
  push ebp
  mov ebp,esp
  push ebx

  mov ecx,[p1]	; const char *string1
  mov eax,[p2]	; const char *string2
  mov edx,[p3]	; size_t count
  
  .for:
  test edx,edx
  jz .identical
  mov bl,[ecx]
  cmp bl,[eax]
  jc .less
  jne .greater
  inc ecx
  inc eax
  dec edx
  jmp .for

  ;-----------------------------------------------------;
  ; <0 string1 less than string2
  ;-----------------------------------------------------;
  .less:
  xor eax,eax
  not eax
  jmp .return
  
  
  ;-----------------------------------------------------;
  ; 0 string1 identical to string2
  ;-----------------------------------------------------;
  .identical:
  xor eax,eax
  jmp .return

  ;-----------------------------------------------------;
  ; >0 string1 greater than string2
  ;-----------------------------------------------------;
  .greater:
  mov eax,1
  jmp .return
  
  .return:
  pop ebx
  mov esp,ebp
  pop ebp
  ret 12

c++:

#include <iostream>
#include <Windows.h>

typedef int (CALLBACK* astrncmp_t)(const char* string1, const char* string2, size_t count);

astrncmp_t astrncmp;

int main()
{
  HMODULE myDLL = LoadLibraryA("xxx.dll");
  astrncmp = (astrncmp_t)GetProcAddress(myDLL, "astrncmp");
  
  printf("%d\n", strncmp( "a1", "a2", 0));  // 0
  printf("%d\n", astrncmp("a1", "a2", 0));  // 0

  printf("%d\n", strncmp( "a1", "a2", 1));  // 0
  printf("%d\n", astrncmp("a1", "a2", 1));  // 0

  printf("%d\n", strncmp( "a1", "a2", 2));  // -1
  printf("%d\n", astrncmp("a1", "a2", 2));  // -1

  return 0;
}
posted @ 2020-09-27 23:13  Ajanuw  阅读(141)  评论(0编辑  收藏  举报