두 문자열을 입력받고, 같은지 비교합니다. |
풀이코드
풀이에 사용한 알고리즘은 간단하므로 생략하겠습니다.
.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
'지난 학기들의 기록 > 어셈블리어' 카테고리의 다른 글
[8086 어셈블리어] AND,OR,XOR,NOT 연산기 구현하기 (0) | 2020.12.14 |
---|---|
[어셈블리어] 정수의 음수표현과 캐리 & 오버플로우 - (carry and overflow) (11) | 2020.10.08 |
댓글