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