一、實驗目的 ??????????????
1.熟悉匯編語言編程環境和DEBUG調試程序的使用。
2.掌握鍵盤輸入字符串的方法和分支程序的設計。
二、實驗內容
編程實現:從鍵盤分別輸入兩個字符串,然后進行比較,若兩個字符串的長度和對應字符都完全相同,則顯示“MATCH”,否則顯示“NO MATCH”。
三、實驗程序(必須加注釋)和結果
程序代碼:
; 定義一個名為crlf的宏,用于輸出回車(0DH)和換行(0AH)
crlf??? macro
??????? ; 功能:輸出回車符
??????? mov ah,2
??????? mov dl,0dh
??????? int 21h
??????? ; 功能:輸出換行符
??????? mov ah,2
??????? mov dl,0ah
??????? int 21h
??????? endm
; 定義數據段
DATAS SEGMENT
??? ; 定義一個字符串常量,表示匹配成功的消息
??? MESS1 DB 'MATCH',0DH,0AH,'$'
??? ; 定義一個字符串常量,表示匹配失敗的消息
??? MESS2 DB 'NO MATCH',0DH,0AH,'$'
??? ; 定義一個字符串常量,用于提示輸入第一個字符串
??? MESS3 DB 'INPUT STRING1:',0DH,0AH,'$'
??? ; 定義一個字符串常量,用于提示輸入第二個字符串
??? MESS4 DB 'INPUT STRING2:',0DH,0AH,'$'
??? ; 定義一個包含個人信息的字符串常量
??? MESS5 DB 'GUOZHIHONG? Kruanjian221 2022900624',0DH,0AH,'$'
??? ; 定義一個字符串常量,用于提示按任意鍵繼續或按ESC鍵退出
??? MESS6 DB 'Press any key to continue or press ESC exit',0DH,0AH,'$'
??? ; 定義一個緩沖區用于存儲輸入的第一個字符串,最多21個字符
??? STR1? DB 21,?,21 DUP(0)
??? ; 定義一個緩沖區用于存儲輸入的第二個字符串,最多21個字符
??? STR2? DB 21,?,21 DUP(0)
??? ; 此處可添加更多數據段相關代碼,如果有的話
DATAS ENDS
; 定義代碼段
CODES SEGMENT
??? ASSUME CS:CODES,DS:DATAS,es:datas
START:
again: ; 循環開始的標簽,用于實現多次執行字符串比較操作
??? MOV AX,DATAS
??? MOV DS,AX
??? ; 輸出包含個人信息的字符串
??? mov ah,9
??? mov dx,offset mess5
??? int 21h
??? ; 輸出提示輸入第一個字符串的消息
??? mov ah,9
??? mov dx,offset mess3
??? int 21h
??? ; 輸入第一個字符串到STR1緩沖區
??? mov ah,0ah
??? mov dx,offset str1
??? int 21h
??? crlf ; 調用crlf宏,輸出回車換行
??? ; 輸出提示輸入第二個字符串的消息
??? mov ah,9
??? mov dx,offset mess4
??? int 21h
??? ; 輸入第二個字符串到STR2緩沖區
??? mov ah,0ah
??? mov dx,offset str2
??? int 21h
??? crlf ; 調用crlf宏,輸出回車換行
??? ; 比較兩個輸入字符串的長度(第一個字符為實際長度)
??? mov cl,str1 + 1
??? cmp cl,str2 + 1
??? jnz noequ ; 如果長度不相等,跳轉到noequ標簽
??? mov ch,0
??? mov si,offset str1+2
??? mov di,offset str2 + 2
next:
??? mov al,[si]
??? cmp al,[di]
??? jnz noequ ; 如果對應字符不相等,跳轉到noequ標簽
??? inc si
??? inc di
??? loop next
??? ; 如果字符串完全匹配,輸出匹配成功的消息
??? mov ah,9
??? mov dx,offset mess1
??? int 21h
??? jmp post_judgment
noequ:
??? ; 如果字符串不匹配,輸出不匹配的消息
??? mov ah,9
??? mov dx,offset mess2
??? int 21h
??? jmp post_judgment
post_judgment:
??? ; 輸出按任意鍵繼續或按ESC鍵退出的提示消息
??? mov ah,9
??? mov dx,offset mess6
??? int 21h
??? mov ah, 0
??? int 16h ; 讀取鍵盤輸入
??? cmp al, 1BH ; 比較輸入是否為ESC鍵(ASCII碼為1BH)
??? je exit ; 如果是ESC鍵,跳轉到exit標簽退出程序
??? jmp again ; 如果不是ESC鍵,跳轉到again標簽開始下一輪循環
exit:
??? MOV AH,4CH
??? INT 21H
CODES ENDS
END START