8086汇编登录注册系统无法比对登录与注册密码问题求解
8086汇编登录注册系统密码比对失败修复方案
核心问题点
- 比对逻辑依赖的循环寄存器未初始化:
LOOPE指令需要CX寄存器指定循环次数、BX寄存器作为索引偏移,原代码进入密码比对段CHECKP前未对两个寄存器赋值,导致比对流程完全失控。 - 未记录实际输入的密码长度:原代码仅预留了10字节的密码存储空间,未记录用户实际输入的密码位数,无法确定正确的比对长度。
- 输入循环逻辑错误:注册密码输入段错误使用
LOOP指令却未初始化CX,存在内存越界风险;登录密码输入段每次循环都重置BX、CX,破坏计数逻辑。 - 内存模型与栈未正确配置:原代码
.model未指定内存模型、.stack未指定栈大小,汇编阶段就会出现报错。
修复步骤
- 补全程序基础配置,指定小内存模型与栈大小
- 在数据段新增变量
PASS_LEN存储用户实际输入的密码长度 - 注册密码输入完成后,将输入位数存入
PASS_LEN - 所有密码比对逻辑执行前,统一初始化
BX=0、CX=PASS_LEN,指定比对的起始索引和长度 - 修正密码输入循环逻辑,删除冗余的寄存器重置代码,添加输入长度限制避免越界
修复后完整代码
.model small .stack 100h .data fMenu DB 10,13,"************************************" DB 10,13,"***** Welcome TO Our System *****" DB 10,13,"***** +---------------------+ *****" DB 10,13,"***** | 1. Register | *****" DB 10,13,"***** | 2. Login | *****" DB 10,13,"***** | 3. Exit | *****" DB 10,13,"***** +---------------------+ *****" DB 10,13,"************************************" DB 10,13," Enter Your Selection : $" NUM1 DB ? PASS_LEN DB 0 ; 存储实际输入的密码长度 ;MSG STR3 db 10,13,"Failed to register$" STR4 DB 10,13,"SUCCESS to REgister$" STR5 DB 10,13,"Not register yet.$" STR6 DB 10,13,"Password wrong.$" STR7 DB 10,13,"Login successfully.$" ;-----user login and register msg STR1 DB 10,13,10,13,10,13,"*****LOGIN PAGE*****$" STR2 DB 10,13,10,13,10,13,"*****REGISTER PAGE*****$" USER DB 10,13,"*****USERNAME : $" PASS DB 10,13,"*****PASSWORD : $" ;user input RUSER DB 13 DUP(?) ;register user RPASS DB 10 DUP(?) ;register password CPASS DB 10 DUP(?) ;compare register password LUSER DB 13 DUP(?) ;login user LPASS DB 10 DUP(?) ;login password .code main proc mov ax,@data mov ds,ax Start: mov ah, 09h lea dx, fMenu int 21h mov ah,01h ;let user prompt 1 number int 21h mov NUM1,al cmp NUM1,'1' JE REGISTER cmp NUM1,'2' JE HI cmp NUM1,'3' JE BYE REGISTER: mov ah,09h lea dx,STR2 int 21h mov ah,09h lea dx,USER int 21h mov ah,3fh mov bx,0 mov cx,13 lea dx,RUSER int 21h JMP Dispass BYE: jmp exit Hi: jmp login DisPass: mov ah,09h lea dx,Pass int 21h mov si,0 setpass: MOV AH,08H INT 21H CMP AL,0DH JE Comfirm MOV [RPASS+SI],AL MOV DL,'*' MOV AH,02H INT 21H INC SI CMP SI,9 ; 限制最多输入9位密码 JB setpass Comfirm: mov PASS_LEN,si ; 保存实际密码长度 mov ah,09h lea dx,Pass int 21h mov si,0 DisC: MOV AH,08H INT 21H CMP AL,0DH JE compare MOV [CPASS+SI],AL MOV DL,'*' MOV AH,02H INT 21H INC SI CMP SI,PASS_LEN ; 确认密码长度和第一次输入一致 JB DisC compare: mov bx,0 mov cl,PASS_LEN mov ch,0 comp_loop: mov al,RPASS[bx] cmp al,CPASS[bx] jne FAIl inc bx loop comp_loop je success LOGIN: MOV AH,09H LEA DX,STR1 INT 21H MOV AH,09H LEA DX,USER INT 21H mov ah, 3Fh MOV CX,13 MOV BX,0 lea dx, LUSER int 21h MOV CX,13 MOV BX,0 ;-----compare user input with register's input CHECKU: MOV AL,LUSER[BX] INC BX CMP AL,RUSER[BX-1] LOOPE CHECKU JE DIPAS JNE NOREG DIPAS: mov ah,09h lea dx,Pass int 21h mov si,0 inpass: MOV AH,08H INT 21H CMP AL,0DH JE CHECKP MOV [LPASS+SI],AL MOV DL,'*' MOV AH,02H INT 21H INC SI CMP SI,9 JB inpass CHECKP: ;compare login password with register password mov bx,0 mov cl,PASS_LEN mov ch,0 checkp_loop: mov al,LPASS[bx] cmp al,RPASS[bx] jne WroPa inc bx loop checkp_loop je LOSUCCESS FAIl: mov ah,09h lea dx,str3 int 21h jmp Start success: mov ah,09h lea dx,str4 int 21h JMP LOGIN NOREG: ;not register yet mov ah,09h lea dx,str5 int 21h jmp start WroPa: ;wrong password mov ah,09h lea dx,str6 int 21h jmp LOGIN LOSUCCESS: mov ah,09h lea dx,str7 int 21h exit: mov ah,4ch int 21h main endp end main
内容的提问来源于stack exchange,提问作者YING WEI CHAN
相关产品推荐
相关产品推荐

