본문 바로가기
코스웨어/13년 스마트컨트롤러

MASM 문자열 비교

by 알 수 없는 사용자 2013. 10. 15.
728x90
반응형

 

 

 

 

 cmp(문자열 비교)

 ESI 에 비교될 문자열의 주소를 넣음

 EDI 에 비교할 문자열의 주소를 넣음

 ECX 에 비교할 카운트 수를 넣음 

 Element size와 반복적인 비교를 할지 말지를 결정하여 아래의 Figure7.7에서 명령어를 골라 사용하면 됨

 .386
.MODEL FLAT

.STACK 4096

.DATA
trgtLength   DWORD   ?
keyLength   DWORD   ?
lastPosn     DWORD   ?

PUBLIC _StrSch        
.CODE
_StrSch   PROC NEAR32 
                    push  EBP
                    mov  EBP, ESP

                    mov  eax, [EBP+8]      ; 비교될 문자열의 주소를 EAX에 넣음
                    push   eax  
                    call   strlen                 ;strlen를 이용하여 문자열의 길이를 trgtLength에 저장
                    mov   trgtLength, eax 
     
                    mov  eax, [EBP+12]     ; 비교할 문자열의 주소를 EAX에 넣음
                    push   eax  
                    call   strlen                 ;strlen를 이용하여 문자열의 길이를 keyLength에 저장
                    mov   keyLength, eax 

                    mov   eax, trgtLength
                    sub   eax, keyLength
                    inc   eax 
                    mov   lastPosn, eax     lastPosn 에   trgtLength -  keyLength + 1 값을 넣음

                    cld                            ; 주소이동 방향 결정
                    mov   eax,1 
whilePosn: 
                    cmp   eax, lastPosn    ; lastPosn 와 eax를 비교    
                    jnle   endWhilePosn     lastPosn을 지나갔다면... 점프    
                    mov  esi, [EBP+8]       ; 비교될 문자열의 주소를 ESI에 넣음
                    add   esi, eax             ; ESI에 EAX(position)의 값을 더하고 다시 1을 빼서 비교될 주소를 이동시킴
                    dec   esi 
                    mov  edi, [EBP+12]     ; 비교할 문자열의 주소를 EDI에 넣음

                    mov   ecx, keyLength  ; 비교할 문자열의 길이를 ECX에 넣음
                    repe   cmpsb             ; 1바이트씩 반복적으로 문자열 비교
                    jz     found                ; 같다면 found로 점프, 아니면 eax(position)을 증가시켜 다시 비교
                    inc   eax 
                    jmp   whilePosn 

endWhilePosn:                            ; lastPosn을 지날때까지도 찾지못했다면 리턴값으로 

                                                 ; EAX에 -1을 넣고 리턴                        
                   mov  eax, -1             
                   jmp   quit 
found: 
                   jmp  quit                   ; 찾으면 여기로 점프해와서 바로 리턴하도록 함
    
quit:
                   MOV  ESP, EBP
                   POP   EBP
                   RET
_StrSch    ENDP



strlen     PROC NEAR32

                   push   ebp 
                   mov   ebp, esp
                   pushf 
                   push   ebx 
                   sub   eax, eax 
                   mov   ebx, [ebp+8

whileChar: 
                   cmp   BYTE PTR [ebx], 0 
                   je   endWhileChar 
                   inc   eax
                   inc   ebx 
                   jmp   whileChar 

endWhileChar:
                   pop   ebx 
                   popf
                   pop   ebp
                   ret   4 

strlen     ENDP


END

 

----------------------------------------------------------------------------------------------

 

#include <stdio.h>

extern int    StrSch(char *, char *);

int main()
{
  char STR[128] ;
  char KEY[128];
  int iRet;

  printf("input target string\n"); // 비교될 문자열 입력받음
  iRet = read(0, STR, sizeof(STR));
  STR[iRet-1= 0;
  
  printf("input key string\n");  // 비교할 문자열 입력받음
  iRet = read(0, KEY, sizeof(KEY));
  KEY[iRet-1= 0;

  
  iRet = StrSch(STRKEY); // Call
StrSch

  // STR은 비교될 문자열의 주소

  // KEY는 비교할 문자열의 주소


  printf("key position : %d\n"iRet); // StrSch()의 리턴값(일치하는 문자열을 찾은 위치)을 출력 
  
  return 0;
}


※ target string에서 key string과 같은 문자열을  찾아서 그 위치를 반환해 줌

찾을수 없으면 -1을 반환하도록 하였음

 

 

____________________________________________________________________________________________

728x90