关于汇编8086中字符串比较的问题 repe cmpsb

LeoMessi_xy 2016-11-15 11:16:07
首先是PBUF DB 8 DUP(?)
然后设定密码 PASWD DB "00000000"


这里是密码比较段落
DISP2:
MOV AH,9
MOV DX,OFFSET MSG3
INT 21H
MOV BX,OFFSET PBUF ;BX作为存储指针

PSWDIN:
MOV AH,07H

INT 21H

CMP AL,0DH ;用户是否输入了回车
JZ CMP_PSWD ;用户输入了回车,则跳转到密码判断部分
MOV AL,PBUF ;用户输入不是回车,保存到密码缓冲区
MOV AL,'*'
MOV DL,AL
MOV AH,2 ;显示一个字符 调用参数DL=待输出字符的ASCII码
INT 21H


INC BX ;调整密码保存指针
JMP PSWDIN


CMP_PSWD:
LEA SI,PASWD
LEA DI,PBUF
MOV CX,PLEN ;设置比较次数
CLD
REPE CMPSB
JNZ Error2 ;跳转到密码出错提示
JMP WELCOME ;登入成功,跳转到欢迎信息显示

ERRor2:
DEC RETRY
JZ ERREXIT
MOV AH,9
MOV DX,OFFSET MSG3_1
INT 21H
JMP DISP2


ERREXIT:
MOV AH,9
MOV DX,OFFSET MSG4
INT 21H
MOV AL,0 ;错误退出,程序返回0给操作系统
JMP EXIT

程序无误 只是比较老是出错 即输入正确的密码但是跳转到出错的界面
...全文
1423 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
LeoMessi_xy 2016-11-15
  • 打赏
  • 举报
回复
改用dos oah就能正确运行 不知道为什么 这里是用0ah : .486 DATA SEGMENT USE16 NBUFFER DB 100,?,100 DUP(?) ;用户名缓冲区 PBUFFER DB 100,?,100 DUP(?) ;密码缓冲区 相当于数组 8个 具体值不知道 MESG1 DB 0dh,0ah,"WELCOME TO LOGIN SYSTEM",0dh,0ah,'$' ;DOS的九号功能调用 MESG2 DB 0dh,0ah,"YourName:",0dh,0ah,'$' MESG2_1 DB 0dh,0ah,"ID Error! Please retry!!",0dh,0ah,'$' MESG3 DB 0dh,0ah,"Password: ",'$' MESG3_1 DB 0dh,0ah,"Password Error! Please retry...",0dh,0ah,'$' MESG4 DB 0dh,0ah,"Log in failed.",0dh,0ah,'$' MESG5 DB 0dh,0ah,"YOU GOT !!",0dh,0ah,'$' ID DB "xy" IDLEN EQU $-ID ; ULEN为UID的长度 PASSWD DB "123321213" PLEN EQU $-PASSWD RETRY DB ? ;最多重试次数? DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA,ES:DATA BEG: MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,0003H ;设置显示模式,清屏 INT 10H MOV AH,9 ;显示欢迎信息,等待输入用户名 MOV DX,OFFSET MESG1 INT 21H MOV RETRY,3;设置错误次数 FIRST: MOV AH,9 ;显示输入用户名提示信息 MOV DX,OFFSET MESG2 INT 21H MOV DX,OFFSET NBUFFER MOV AH,0AH ;调用0AH功能,输入用户名字符串 INT 21H MOV AL,NBUFFER+1 ;取用户输入字符个数 CMP AL,IDLEN JNZ ERROR1 ;非0转移,跳转到用户名错误提示 LEA SI,ID ;将源操作数的偏移地址传送给16位寄存器,使用重复串比较指令比较用户名 LEA DI,NBUFFER+2;字符串首 MOV CX,IDLEN CLD;CLD指令功能:将标志寄存器Flag的方向标志位DF清零。 ;在字串操作中使变址寄存器SI或DI的地址指针自动增加,字串处理由前往后。 REPE CMPSB ;串操作指令能对存贮区中一块(串)字节或字进行操作,其块的长度可达64K字节。 ;任一个这样的基本操作指令前还能用一个重复前缀(repe)使它们重复地操作 ;每重复一次ECX的值就减一 一直到CX为0或ZF为0时停止。 ;cmpsb是字符串比较指令,把ESI指向的数据与EDI指向的数一个一个的进行比较。 JNZ ERROR1 ;跳转到用户名错误提示 JMP SECOND ;用户名比较正确,跳转到设置重复次数 ERROR1: DEC RETRY ;用户名错误提示前先判断错误是否已到三次 JZ ERREXIT ;已重试了三次,跳转到出错退出 MOV AH,9 ;重试未满三次,提示后重试 MOV DX,OFFSET MESG2_1 INT 21H JMP FIRST SECOND: MOV AH,9 MOV DX,OFFSET MESG3 INT 21H MOV DX,OFFSET PBUFFER;BX作为存储指针 PSWDIN: MOV AH,0AH INT 21H MOV AL,PBUFFER+1 ;取用户输入字符个数 CMP AL,PLEN JNZ ERROR2 LEA SI,PASSWD LEA DI,PBUFFER+2 MOV CX,PLEN ;设置比较次数 CLD REPE CMPSB JNZ ErrOR2 ;跳转到密码出错提示 JMP WELCOME ;登入成功,跳转到欢迎信息显示 ERROR2: DEC RETRY JZ ERREXIT MOV AH,9 MOV DX,OFFSET MESG3_1 INT 21H JMP SECOND ERREXIT: MOV AH,9 MOV DX,OFFSET MESG4 INT 21H MOV AL,0 ;错误退出,程序返回0给操作系统 JMP EXIT WELCOME: MOV AH,9 MOV DX,OFFSET MESG5 INT 21H MOV AL,1 ;正确退出,程序返回1给操作系统 EXIT: MOV AH,4CH INT 21H CODE ENDS END BEG 这里是出错的07h : .486 DATA SEGMENT USE16 RETRY DB ? ;最多重试次数? UBUF DB 10,0,10 DUP(?) ;用户名缓冲区 PBUF DB 8 DUP(?) ;密码缓冲区 相当于数组 8个 具体值不知道 MSG1 DB 0dh,0ah,"====EXP2:LOG IN System====",0dh,0ah,'$' ;DOS的九号功能调用? MSG2 DB 0dh,0ah,"UserName:",'$' MSG2_1 DB 0dh,0ah,"UserName Error!Retry...",'$' MSG3 DB 0dh,0ah,"Password: ",'$' MSG3_1 DB 0dh,0ah,"Password Error!Retry...",'$' MSG4 DB 0dh,0ah,"Login failed...: (",'$' MSG5 DB 0dh,0ah,"==== Login ok,Welcome!====",0dh,0ah,'$' UID DB "ztt" ULEN EQU $-UID ; ULEN为UID的长度 PASWD DB "00000000" PLEN EQU $-PASWD DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA,ES:DATA BEG: MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,0003H ;设置显示模式,清屏 INT 10H MOV AH,9 ;显示欢迎信息,等待输入用户名 MOV DX,OFFSET MSG1 INT 21H MOV RETRY,3;设置错误次数 DISP1: MOV AH,9 ;显示输入用户名提示信息 MOV DX,OFFSET MSG2 INT 21H MOV DX,OFFSET UBUF MOV AH,0AH ;调用0AH功能,输入用户名字符串 INT 21H MOV AL,UBUF+1 ;取用户输入字符个数 CMP AL,ULEN JNZ ERR1 ;非0转移,跳转到用户名错误提示 LEA SI,UID ;将源操作数的偏移地址传送给16位寄存器,使用重复串比较指令比较用户名 LEA DI,UBUF+2;字符串首 MOV CX,ULEN CLD;CLD指令功能:将标志寄存器Flag的方向标志位DF清零。 ;在字串操作中使变址寄存器SI或DI的地址指针自动增加,字串处理由前往后。 REPE CMPSB ;串操作指令能对存贮区中一块(串)字节或字进行操作,其块的长度可达64K字节。 ;任一个这样的基本操作指令前还能用一个重复前缀(repe)使它们重复地操作 ;每重复一次ECX的值就减一 一直到CX为0或ZF为0时停止。 ;cmpsb是字符串比较指令,把ESI指向的数据与EDI指向的数一个一个的进行比较。 JNZ ERR1 ;跳转到用户名错误提示 JMP DISP2 ;用户名比较正确,跳转到设置重复次数 ERR1: DEC RETRY ;用户名错误提示前先判断错误是否已到三次 JZ ERREXIT ;已重试了三次,跳转到出错退出 MOV AH,9 ;重试未满三次,提示后重试 MOV DX,OFFSET MSG2_1 INT 21H jmp DISP1 DISP2: MOV AH,9 MOV DX,OFFSET MSG3 INT 21H MOV BX,OFFSET PBUF ;BX作为存储指针 PSWDIN: MOV AH,07H INT 21H CMP AL,0DH ;用户是否输入了回车 JZ CMP_PSWD ;用户输入了回车,则跳转到密码判断部分 MOV AL,PBUF ;用户输入不是回车,保存到密码缓冲区 MOV AL,'*' MOV DL,AL MOV AH,2 ;显示一个字符 调用参数DL=待输出字符的ASCII码 INT 21H INC BX ;调整密码保存指针 JMP PSWDIN CMP_PSWD: LEA SI,PASWD LEA DI,PBUF MOV CX,PLEN ;设置比较次数 CLD REPE CMPSB JNZ Error2 ;跳转到密码出错提示 JMP WELCOME ;登入成功,跳转到欢迎信息显示 ERRor2: DEC RETRY JZ ERREXIT MOV AH,9 MOV DX,OFFSET MSG3_1 INT 21H JMP DISP2 ERREXIT: MOV AH,9 MOV DX,OFFSET MSG4 INT 21H MOV AL,0 ;错误退出,程序返回0给操作系统 JMP EXIT WELCOME: MOV AH,9 MOV DX,OFFSET MSG5 INT 21H MOV AL,1 ;正确退出,程序返回1给操作系统 EXIT: MOV AH,4CH INT 21H CODE ENDS END BEG
LeoMessi_xy 2016-11-15
  • 打赏
  • 举报
回复
感谢楼上 改成mov [bx],AL 以后就可以了 bx是指针 【bx】是指针所指的位置 是这个意思吧。。 谢谢了
zara 2016-11-15
  • 打赏
  • 举报
回复
引用
MOV AL,PBUF ;用户输入不是回车,保存到密码缓冲区
这里错了吧,首先是方向错了,其次,每次保存还要向后移一个字符的。

21,496

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧