본문 바로가기
지난 학기들의 기록/어셈블리어

[8086 어셈블리어] 두 문자열을 입력받고 같은지 비교

by 아메리카노와떡볶이 2020. 12. 14.
728x90
두 문자열을 입력받고, 같은지 비교합니다.

출력예시1
출력예시2

풀이코드

풀이에 사용한 알고리즘은 간단하므로 생략하겠습니다.

 

.model small
.stack
.data
;필요한 출력 메시지와 ,문자열을 담을 변수들을 선언합니다
msg1 db 100 DUP('?')
msg2 db 100 DUP('?')
msg3 db 'Enter the first string: $'
msg4 db 0ah,0dh,'Enter the second string: $'
msg5 db 0ah,0dh,'The two Strings are Equal','$'
msg6 db 0ah,0dh,'The two Strings are Not Equal','$'

.code
main proc
    mov ax,@data
    mov ds,ax
    
    mov bx,0 ; bx는 문자열1의 길이를 저장하기 위함    
    mov cx,0 ; cx는 문자열2의 길이를 저장하기 위함 
    
    ;console에  "Enter the first string" 출력
    mov ah,09h  
    mov dx,offset msg3
    int 21h
    
    ;문자열 1 입력( 문자입력 반복을 통해)
    mov ah,01h 
    mov si,offset msg1
    
    input1:
    int 21h ; 문자입력 (al에 저장됨)    
    mov [si],al ; 입력된값을 si인덱스 레지스터를 통해 msg1 배열에 저장
    inc si      ; si레지스터 값을 증가해서 msg1배열의 다음 공간으로 이동
    inc bx      ; bx레지스터 값 증가(현재 입력된 문자열의 길이를 나타냄)
    cmp al,'$' ;문자열의 끝인 달러사인을 입력받으면 종료
    jne input1  ; '$'이 아니라면 입력 반복
    
    ; console에 "Enter the Second string" 출력
    mov ah,09h
    mov dx,offset msg4
    int 21h
    
    ;문자열 2 입력( 문자입력 반복을 통해)
    mov ah,01h       
    mov si,offset msg2
    
    input2:
    int 21h     ; 문자입력 (al에 저장됨)
    mov [si],al ; 입력된값을 si인덱스 레지스터를 통해 msg2 배열에 저장
    inc si     ; si레지스터 값을 증가해서 msg2배열의 다음 공간으로 이동
    inc cx     ; cx레지스터 값 증가(현재 입력된 문자열의 길이를 나타냄)
    cmp al,'$' ; 문자열의 끝인 달러사인을 입력받으면 종료
    jne input2 ; '$'이 아니라면 입력 반복
    
    ;문자열 비교
    cmp bx,cx  
    je compare ; 길이가 같으면 비교
    jne print_dif ; 길이가 다르면 다름
    
    compare: ;둘은 같은 길이의 문자열이므로, 마지막 인덱스가 bx-1(==cx-1)
    sub bx,1 ; sub해주는 이유는, 마지막 달러사인은 비교할 필요 x
       loop1:
            cmp bx,0 ; bx와 0 비교
            je print_equ ; bx레지스터가 0이 될 때 까지 같다는것은 문자열이 같다는 것
            mov cl,msg1[bx-1] ; 비교를 위해 cl레지스터에 msg1[bx-1]의 값을 삽입
            cmp cl,msg2[bx-1] ; 즉 msg1[bx-1],msg2[bx-2] 비교   
            je compare        ; 같으면 반복 , 다르면 label 탈출할것
    
    ;문자열이 다를때 msg6에 저장된 문자열 출력        
    print_dif: 
    mov ah,09h
    mov dx,offset msg6
    int 21h
    jmp end ; 다르다는 문자열을 출력하고 바로 프로그램 종료
    
    ;문자열이 같을때 msg5에 저장된 문자열 출력
    print_equ:
    mov ah,09h
    mov dx,offset msg5
    int 21h
       
    end:
    mov ah,4ch
    int 21h
     
end main
end 
 

728x90

댓글