You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

8086汇编登录注册系统无法比对登录与注册密码问题求解

8086汇编登录注册系统密码比对失败修复方案

核心问题点

  • 比对逻辑依赖的循环寄存器未初始化:LOOPE指令需要CX寄存器指定循环次数、BX寄存器作为索引偏移,原代码进入密码比对段CHECKP前未对两个寄存器赋值,导致比对流程完全失控。
  • 未记录实际输入的密码长度:原代码仅预留了10字节的密码存储空间,未记录用户实际输入的密码位数,无法确定正确的比对长度。
  • 输入循环逻辑错误:注册密码输入段错误使用LOOP指令却未初始化CX,存在内存越界风险;登录密码输入段每次循环都重置BX、CX,破坏计数逻辑。
  • 内存模型与栈未正确配置:原代码.model未指定内存模型、.stack未指定栈大小,汇编阶段就会出现报错。

修复步骤

  1. 补全程序基础配置,指定小内存模型与栈大小
  2. 在数据段新增变量PASS_LEN存储用户实际输入的密码长度
  3. 注册密码输入完成后,将输入位数存入PASS_LEN
  4. 所有密码比对逻辑执行前,统一初始化BX=0、CX=PASS_LEN,指定比对的起始索引和长度
  5. 修正密码输入循环逻辑,删除冗余的寄存器重置代码,添加输入长度限制避免越界

修复后完整代码

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 17:48:03