DATA SEGMENT
STR1 DB 'Welcome!',0AH,0DH,'Please Input the Password: ','$'
STR2 DB 0AH,0DH,'Please Input: ','$'
STRPW DB '123456$'
STRPE_LEN EQU 6
STRERROR1 DB 0AH,0DH,'PASSWORD ERROR! You have',0AH,0DH,'$'
STRERROR2 DB ' Chances.Please Input the Right Password:','$'
STRLASTERROR DB 0AH,0DH,'PASSWORD ERROR! You have NO Chance.','$'
STRRIGHT DB 0AH,0DH,'PASSWORD RIGHT!','$'
STRMENU DB 0AH,0DH,'1.Return DOS',0AH,0DH,'2.Check the Balance',0AH,0DH,'3.Save Money',0AH,0DH,'4.Get Money',0AH,0DH,'Please Input the Number: ','$'
STRGETBALANCE DB 0AH,0DH,'The Balance is: ','$'
STROVERFLOW DB 0AH,0DH,'Operation Failed:The Number is Overflow','$'
STRZERO DB 0AH,0DH,'Operation Failed:The Number is Less than Zero','$'
BUFPW DB 40,?,40 DUP(?);缓冲密码(输入)
COUNT DB 3;计密码输入次数
;ASCII DB 5 DUP(?),'$' ;保存十进制无符号数的ASCII
ASCII DB 6 DUP(?),'$'
;ASCII_End DB '$' ;字符串结束标志
MONEY DB 40,?,40 DUP(?)
BALANCE DW 10000
RESULT DW 0
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE ,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,STACK
MOV SS,AX
STR1 DB 'Welcome!',0AH,0DH,'Please Input the Password: ','$'
STR2 DB 0AH,0DH,'Please Input: ','$'
STRPW DB '123456$'
STRPE_LEN EQU 6
STRERROR1 DB 0AH,0DH,'PASSWORD ERROR! You have',0AH,0DH,'$'
STRERROR2 DB ' Chances.Please Input the Right Password:','$'
STRLASTERROR DB 0AH,0DH,'PASSWORD ERROR! You have NO Chance.','$'
STRRIGHT DB 0AH,0DH,'PASSWORD RIGHT!','$'
STRMENU DB 0AH,0DH,'1.Return DOS',0AH,0DH,'2.Check the Balance',0AH,0DH,'3.Save Money',0AH,0DH,'4.Get Money',0AH,0DH,'Please Input the Number: ','$'
STRGETBALANCE DB 0AH,0DH,'The Balance is: ','$'
STROVERFLOW DB 0AH,0DH,'Operation Failed:The Number is Overflow','$'
STRZERO DB 0AH,0DH,'Operation Failed:The Number is Less than Zero','$'
BUFPW DB 40,?,40 DUP(?);缓冲密码(输入)
COUNT DB 3;计密码输入次数
;ASCII DB 5 DUP(?),'$' ;保存十进制无符号数的ASCII
ASCII DB 6 DUP(?),'$'
;ASCII_End DB '$' ;字符串结束标志
MONEY DB 40,?,40 DUP(?)
BALANCE DW 10000
RESULT DW 0
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE ,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,STACK
MOV SS,AX
;显示欢迎界面
MOV DX,OFFSET STR1
MOV AH,09H
INT 21H
MOV DX,OFFSET STR1
MOV AH,09H
INT 21H
;输入密码
REPW:
MOV BX,OFFSET BUFPW
MOV CL,0
REPW:
MOV BX,OFFSET BUFPW
MOV CL,0
MOV AH,08H;输入字符不显示,输入字符放到AL中
INT 21H
PW:
MOV [BX],AL
INC BX
INT 21H
PW:
MOV [BX],AL
INC BX
MOV DL,2AH;显示星号
MOV AH,02H
INT 21H
MOV AH,02H
INT 21H
MOV AH,08H;输入字符不显示,输入字符放到AL中
INT 21H
INT 21H
INC CL;密码计数
CMP AL,0DH;比较,改变标志位,输入结束判断标志
JNZ PW
JNZ PW
;输入串结束符
MOV CH,0
MOV DX,OFFSET BUFPW
ADD DX,CX
MOV BX,DX
MOV BYTE PTR[BX],'$'
MOV CH,0
MOV DX,OFFSET BUFPW
ADD DX,CX
MOV BX,DX
MOV BYTE PTR[BX],'$'
;比较
MOV BL,STRPE_LEN
MOV BL,STRPE_LEN
CMP CL,BL
JNZ PWERR;密码长度不等时跳转到"PWERR"
MOV DI,OFFSET STRPW
MOV SI,OFFSET BUFPW
REPZ CMPSB;检查两个字符串是否相等
JZ PWRIG;密码长度等时跳转到"PWEIG"
JNZ PWERR;密码长度不等时跳转到"PWERR"
JNZ PWERR;密码长度不等时跳转到"PWERR"
MOV DI,OFFSET STRPW
MOV SI,OFFSET BUFPW
REPZ CMPSB;检查两个字符串是否相等
JZ PWRIG;密码长度等时跳转到"PWEIG"
JNZ PWERR;密码长度不等时跳转到"PWERR"
;密码输错了
PWERR:
DEC COUNT;输入密码的次数减一
JZ LAST
PWERR:
DEC COUNT;输入密码的次数减一
JZ LAST
;显示strerror1
MOV DX,OFFSET STRERROR1
MOV AH,09H
INT 21H
;显示count
MOV DX,OFFSET STRERROR1
MOV AH,09H
INT 21H
;显示count
MOV DL,COUNT
ADD DL,30H;转换成ASCII码,输出字符需要用到ASCII码
MOV AH,02H
INT 21H
ADD DL,30H;转换成ASCII码,输出字符需要用到ASCII码
MOV AH,02H
INT 21H
;显示strerror2
MOV DX,OFFSET STRERROR2
MOV AH,09H
INT 21H
JNZ REPW;count不等于0的时候重新开始输入
MOV DX,OFFSET STRERROR2
MOV AH,09H
INT 21H
JNZ REPW;count不等于0的时候重新开始输入
;不可以再输入密码
LAST:
MOV DX,OFFSET STRLASTERROR
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
LAST:
MOV DX,OFFSET STRLASTERROR
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
;显示密码输入正确
PWRIG:
MOV DX,OFFSET STRRIGHT
MOV AH,09H
INT 21H
;显示菜单
MENU:
MOV DX,OFFSET STRMENU
MOV AH,09H
INT 21H
;读取菜单编号
MOV AH,01H
INT 21H
CMP AL,'2'
JZ GETBALANCE
CMP AL,'3'
JZ SAVE
CMP AL,'4'
JZ GET
JMP EXIT
GETBALANCE:
MOV DI,OFFSET ASCII
MOV AX,BALANCE
MOV BX,10000
MOV CX,5
PWRIG:
MOV DX,OFFSET STRRIGHT
MOV AH,09H
INT 21H
;显示菜单
MENU:
MOV DX,OFFSET STRMENU
MOV AH,09H
INT 21H
;读取菜单编号
MOV AH,01H
INT 21H
CMP AL,'2'
JZ GETBALANCE
CMP AL,'3'
JZ SAVE
CMP AL,'4'
JZ GET
JMP EXIT
GETBALANCE:
MOV DI,OFFSET ASCII
MOV AX,BALANCE
MOV BX,10000
MOV CX,5
DEC2ASC:;每一位变成ACSII码显示
XOR DX,DX
DIV BX
ADD AX,30H
MOV [DI],AX
INC DI
MOV SI,DX
;BX除以10
MOV AX,BX
MOV BX,10
XOR DX,DX
DIV BX
MOV BX,AX
MOV AX,SI
LOOP DEC2ASC
LEA DX,STRGETBALANCE
MOV AH,09H ;显示结果
INT 21H
MOV DX,OFFSET ASCII
MOV AH,09H
INT 21H
JMP MENU
MOV AH,09H ;显示结果
INT 21H
MOV DX,OFFSET ASCII
MOV AH,09H
INT 21H
JMP MENU
;存钱
SAVE:
CALL TRANSFORM
ADD BALANCE,SI
JNC MENU;判断是否溢出
SUB BALANCE,SI
LEA DX,STROVERFLOW
MOV AH,09H
INT 21H
JMP MENU
SAVE:
CALL TRANSFORM
ADD BALANCE,SI
JNC MENU;判断是否溢出
SUB BALANCE,SI
LEA DX,STROVERFLOW
MOV AH,09H
INT 21H
JMP MENU
;取钱
GET:
CALL TRANSFORM
SUB BALANCE,SI
JNC MENU
ADD BALANCE,SI
LEA DX,STRZERO
MOV AH,09H
INT 21H
JMP MENU
GET:
CALL TRANSFORM
SUB BALANCE,SI
JNC MENU
ADD BALANCE,SI
LEA DX,STRZERO
MOV AH,09H
INT 21H
JMP MENU
;输入钱数
TRANSFORM:
LEA DX,STR2
MOV AH,09H
INT 21H
LEA DX,MONEY
MOV AH,0AH;字符串输入
INT 21H
TRANSFORM:
LEA DX,STR2
MOV AH,09H
INT 21H
LEA DX,MONEY
MOV AH,0AH;字符串输入
INT 21H
MOV CL,MONEY+1 ;实际读入字符的个数
XOR CH,CH
ADD DX,CX
ADD DX,2
MOV BX,DX
MOV BYTE PTR[BX],'$'
MOV DI,OFFSET MONEY
ADD DI,CX
ADD DI,1 ;得到最后一位数的地址
MOV AX,1
MOV SI,0
XOR CH,CH
ADD DX,CX
ADD DX,2
MOV BX,DX
MOV BYTE PTR[BX],'$'
MOV DI,OFFSET MONEY
ADD DI,CX
ADD DI,1 ;得到最后一位数的地址
MOV AX,1
MOV SI,0
;钱数以十进制形式计算
TRANS1:
XOR BX,BX
MOV BL,[DI]
SUB BL,30H
XCHG AX,BX
MUL BX
ADD SI,AX ;加入DX总和
DEC DI
MOV AX,10
MUL BX
LOOP TRANS1
RET
TRANS1:
XOR BX,BX
MOV BL,[DI]
SUB BL,30H
XCHG AX,BX
MUL BX
ADD SI,AX ;加入DX总和
DEC DI
MOV AX,10
MUL BX
LOOP TRANS1
RET
;退出
EXIT:
MOV AH,4CH
INT 21H
CODE ENDS
END START
EXIT:
MOV AH,4CH
INT 21H
CODE ENDS
END START