ユーザーログイン認証プログラムの実装

2 番目の実験をコンパイルします:
本の P186 の例 4.23 の 2 つのソリューションを参照して、ユーザー名の比較を実現します; 本の
P157 の例 4.3 のプログラム リストを参照して、色付きの文字列の出力を実現します;
注: 例 4.23 のソリューションを使用する場合追加セクションが設定されている場合、色文字列を出力しようとすると、ES:BP は BIOS の 13H 関数を呼び出す前に、表示する文字列の最初のアドレスを指す必要があります。(文字列定義の場所を検討してください。追加セクション 13H で問題なく見つけることができます。コード セクションにある場合は、MOV AX、1301H の前に MOV AX、DATA および MOV ES、AX の 2 つの命令を追加する必要があります。 AH=13H、AL=01H の場合、INT 10H を確実に実行するため。)

.586
DATA SEGMENT USE16
MESG1	DB 'Please enter your username:$'
MESG2	DB 'Please enter your password:$'
BUF		DB 30
		DB ?
		DB 30 DUP(?)					;输入字符串缓冲区
WRONG	    DB 'Wrong Username!',0DH, 0AH,'$'
WRONG2	DB 'Wrong Password!',0DH, 0AH,'$'
RIGHT 	DB '----------WELCOME----------'
LL		EQU $-RIGHT
CHOICE	DB 3
USER	DB '030915'						;用户名
COUNT	EQU $-USER						;统计串长度
CIPHER	DB 'as12'						;密码
COUNT2	EQU $-CIPHER
DATA ENDS

CODE SEGMENT USE16
     ASSUME CS:CODE,DS:DATA,ES:DATA
BEG:
     MOV AX,DATA			;DS<-DATA
     MOV DS,AX
     MOV ES,AX				;ES<-DATA
     MOV AX,0003H			;80*25行彩色文本方式
     INT 10H
AGA:						;循环确认用户名是否正确
	 MOV AH,9
     MOV DX,OFFSET MESG1	;显示黑白字符串
     INT 21H
     MOV CX,COUNT
     MOV AH,0AH  			;从键盘键入用户名
	 MOV DX,OFFSET BUF
     INT 21H     
	 MOV CL,BUF+1			;输入用户名长度->CX
     MOV CH,0
	 CMP CX,COUNT			;比较长度是否相等
	 JNZ AGA2
	 MOV SI,OFFSET BUF+2	;原串首址->SI
	 MOV DI,OFFSET USER		;目标串首址->DI
	 CLD					;D标志为0,增址型     
LOAD:
	 REPE CMPSB				;两字符串比较
	 JNZ AGA2				;不相等,提示
     MOV AH,2
     MOV DL,0AH  			;换行
     INT 21H
     MOV CHOICE,3			;尝试次数重新置3
	 JMP CHECK
AGA2:
	 MOV AH,2
     MOV DL,0AH  			;换行
     INT 21H
	 MOV AH,09H
     MOV DX,OFFSET WRONG
     INT 21H
     DEC CHOICE				;尝试次数减一
     JZ EXIT
     JMP AGA  				;再输入一次用户名
CHECK:
	 MOV AH,09H
	 MOV DX,OFFSET MESG2
	 INT 21H
     MOV CX,COUNT2
     MOV BX,OFFSET BUF	  
AGA3:						;判断密码是否错误
     MOV AH,08H  			;O8H,不回显字符,响应Ctrl+C
     INT 21H     			;光标下移一行
     MOV [BX],AL 			;按键的ASCII码传给BX
     INC BX      			;BX后移一位,一共移COUNT2次
     LOOP AGA3
     MOV DI,OFFSET BUF
     MOV SI,OFFSET CIPHER
     CLD
     MOV CX,COUNT2
     REPE CMPSB  			;字符串比较
     JZ  LAST   			;一致则跳转
     MOV AH,2
     MOV DL,0AH
     INT 21H
     MOV AH,09H
     MOV DX,OFFSET WRONG2
     INT 21H
     DEC CHOICE  			;尝试次数减一
     JZ EXIT
     JMP CHECK
LAST:
	 MOV AX,1301H			;显示彩色字符串
     MOV BH,0
     MOV BL,01001111B
     MOV CX,LL
     MOV DH,12
	 MOV DL,(80-LL)/2
     MOV BP,OFFSET RIGHT
     INT 10H
EXIT:
     MOV AH,4CH
     INT 21H  				;返回 DOS
     
CODE ENDS
     END BEG


WELCOME が 09H で表示される場合 (つまり、白黒で表示される場合)、文字列の末尾を示すために $ を忘れずに追加してください。

.586
DATA SEGMENT USE16
MESG1	DB 'Please enter your username:$'
MESG2	DB 'Please enter your password:$'
BUF		DB 30
		DB ?
		DB 30 DUP(?)					;输入字符串缓冲区
WRONG	DB 'Wrong Username!',0DH, 0AH,'$'
WRONG2	DB 'Wrong Password!',0DH, 0AH,'$'
RIGHT 	DB '----------WELCOME----------'
LL		EQU $-RIGHT
CHOICE	DB 3
USER	DB '030915'						;用户名
COUNT	EQU $-USER						;统计串长度
CIPHER	DB 'as12'						;密码
COUNT2	EQU $-CIPHER
DATA ENDS

CODE SEGMENT USE16
     ASSUME CS:CODE,DS:DATA,ES:DATA
BEG:
     MOV AX,DATA			;DS<-DATA
     MOV DS,AX
     MOV ES,AX				;ES<-DATA
     MOV AX,0003H			;80*25行彩色文本方式
     INT 10H
AGA:						;循环确认用户名是否正确
	 MOV AH,9
     MOV DX,OFFSET MESG1	;显示黑白字符串
     INT 21H
     MOV CX,COUNT
     MOV AH,0AH  			;从键盘键入用户名
	 MOV DX,OFFSET BUF
     INT 21H     
	 MOV CL,BUF+1			;输入用户名长度->CX
     MOV CH,0
	 CMP CX,COUNT			;比较长度是否相等
	 JNZ AGA2
	 MOV SI,OFFSET BUF+2	;原串首址->SI
	 MOV DI,OFFSET USER		;目标串首址->DI
	 CLD					;D标志为0,增址型     
LOAD:
	 REPE CMPSB				;两字符串比较
	 JNZ AGA2				;不相等,提示
     MOV AH,2
     MOV DL,0AH  			;换行
     INT 21H
     MOV CHOICE,3			;尝试次数重新置3
	 JMP CHECK
AGA2:
	 MOV AH,2
     MOV DL,0AH  			;换行
     INT 21H
	 MOV AH,09H
     MOV DX,OFFSET WRONG
     INT 21H
     DEC CHOICE				;尝试次数减一
     JZ EXIT
     JMP AGA  				;再输入一次用户名
CHECK:
	 MOV AH,09H
	 MOV DX,OFFSET MESG2
	 INT 21H
     MOV CX,COUNT2
     MOV BX,OFFSET BUF	  
AGA3:						;判断密码是否错误
     MOV AH,08H  			;O8H,不回显字符,响应Ctrl+C
     INT 21H     			;光标下移一行
     MOV [BX],AL 			;按键的ASCII码传给BX
     INC BX      			;BX后移一位,一共移COUNT2次
     LOOP AGA3
     MOV DI,OFFSET BUF
     MOV SI,OFFSET CIPHER
     CLD
     MOV CX,COUNT2
     REPE CMPSB  			;字符串比较
     JZ  LAST   			;一致则跳转
     MOV AH,2
     MOV DL,0AH
     INT 21H
     MOV AH,09H
     MOV DX,OFFSET WRONG2
     INT 21H
     DEC CHOICE  			;尝试次数减一
     JZ EXIT
     JMP CHECK
LAST:
	 MOV AX,1301H			;显示彩色字符串
     MOV BH,0
     MOV BL,01001111B
     MOV CX,LL
     MOV DH,12
	 MOV DL,(80-LL)/2
     MOV BP,OFFSET RIGHT
     INT 10H
EXIT:
     MOV AH,4CH
     INT 21H  				;返回 DOS
     
CODE ENDS
     END BEG


実行結果: (これらの写真は私が提出したものなので、同じではありません)

ここに画像の説明を挿入

ここに画像の説明を挿入

これらの写真を提出しました

参考資料:https://wonzwang.blog.csdn.net/article/details/80863047

おすすめ

転載: blog.csdn.net/m0_51928767/article/details/120919932