一个密码核对小程序,高手们帮忙看下(菜鸟提问)

Stefine 2005-05-10 01:06:44
要求:就是在终端输入一个8位的密码,正确便提示right错误便重新输入!
我写的东东:
;testpwd.asm

stack segment stack
dw 512 dup(?)
stack ends

data segment
password db '19850924'
hidepass db '*'
abc db 16 dup(?)
rightresult db 'right',0dh,0ah,'$'
wrongresult db 'wrong',0dh,0ah,'$'
data ends

code segment 'code'
assume cs:code,ds:data,ss:stack,es:data

input: mov ax,data
mov ds,ax
mov es,ax

mov cx,8
cld

mov si,offset password
mov di,offset abc

mov ah,7 ;调用7号功能,每输入一个密码用*显示
int 21h
mov dx,offset hidepass
mov ah,9
int 21h
stosb
cmpsb
jnz unmat
dec cx
jnz input
mov bl,12h
jmp output


unmat: mov bl,0ffh

output: cmp bl,12h
je right
jne wrong

right: mov dx,offset rightresult
mov ah,9
int 21h
jmp exit

wrong: mov dx,offset wrongresult
mov ah,9
int 21h


exit: mov ax,4c00h
int 21h

code ends
end input

现在随便输入一个就显示(right 下一行显示 wrong)
我想应该是中间的跳转有问题,可我没有解决,特来请教

...全文
114 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Stefine 2005-05-10
  • 打赏
  • 举报
回复
太感谢了
明白了

接分
zhang_jiang 2005-05-10
  • 打赏
  • 举报
回复
初始:
+-+-+-+-+-+---
| | | | | |...
+-+-+-+-+-+---
^
|
di

输入'1', 并执行stosb后,(` 代表空格, 不知道如何输入空格 ;-( )
stosb: es:[di] = al, di=di+1 (因为执行过cld)
+-+-+-+-+-+---
|1| | | | |...
+-+-+-+-+-+---
``^
``|
``di

此时与password比较的话, 比较的'1'后面的一个byte,
执行完cmpsb后,
cmpsb: cmp ds:[si], es:[di], si=si+1, di=di+1
+-+-+-+-+-+---
|1| | | | |...
+-+-+-+-+-+---
````^
````|
````di
Stefine 2005-05-10
  • 打赏
  • 举报
回复
修改了DI寄存器
难道我输入的字符串不都是存在DI里面了吗?
不可能吧

如果是存在DI里面的话,那在比较的时候就是对的啊

不太懂这个修改的意思,麻烦再讲一下,

无尽感激
zhang_jiang 2005-05-10
  • 打赏
  • 举报
回复
写错了, 你这边是di寄存器.
di扩展到32位-->EDI
Stefine 2005-05-10
  • 打赏
  • 举报
回复
能解释下EDI吗?
小弟我刚学不久,书上没有看到这个东东
zhang_jiang 2005-05-10
  • 打赏
  • 举报
回复
stosb 修改了EDI
你在CMPSB的时候EDI就不对了.
Stefine 2005-05-10
  • 打赏
  • 举报
回复
unmat: mov bl,0ffh
dec cx
jnz next

在这里加了后面两句,让在不正确时也继续输入完毕,输入8个再验证

为何把那句换成stosb就不行了,
帮忙再看看

3Q
Stefine 2005-05-10
  • 打赏
  • 举报
回复
非常感谢上面的这位兄弟
问题基本解决

我是想问下
我把这个mov [di], al换成stosb

密码就不对了,不管我输入的是正确的还是错误的

我修改后的东东:
;testpwd.asm

stack segment stack
dw 512 dup(?)
stack ends

data segment
please db 'Please input your password!',0dh,0ah,'$'
password db '19850924'
hidepass db '*'
abc db 16 dup(?)
rightresult db 0dh,0ah,'Password is right!',0dh,0ah,'$'
wrongresult db 0dh,0ah,'Password is wrong,please retry!',0dh,0ah,'$'
data ends

code segment 'code'
assume cs:code,ds:data,ss:stack,es:data

start: mov ax,data
mov ds,ax
mov es,ax
mov dx,offset please
mov ah,9
int 21h


input: mov cx,8
cld

mov si,offset password
mov di,offset abc


next: mov ah,7
int 21h
mov [di],al
;stosb
mov dl,[hidepass]
mov ah,2
int 21h
cmpsb
jnz unmat
dec cx
jnz next
mov bl,0h
jmp output


unmat: mov bl,0ffh
dec cx
jnz next

output: cmp bl,0h
je right
jne wrong

right: mov dx,offset rightresult
mov ah,9
int 21h
jmp exit

wrong: mov dx,offset wrongresult
mov ah,9
int 21h
jmp input


exit: mov ax,4c00h
int 21h

code ends
end start
zhang_jiang 2005-05-10
  • 打赏
  • 举报
回复
;testpwd.asm

stack segment stack
dw 512 dup(?)
stack ends

data segment
password db '19850924'
hidepass db '*'
abc db 16 dup(?)
rightresult db 'right',0dh,0ah,'$'
wrongresult db 'wrong',0dh,0ah,'$'
data ends

code segment 'code'
assume cs:code,ds:data,ss:stack,es:data

input: mov ax,data
mov ds,ax
mov es,ax

mov cx,8
cld

mov si,offset password
mov di,offset abc

next:
mov ah,7 ;调用7号功能,每输入一个密码用*显示
int 21h
mov [di], al ;;;
mov dl,[hidepass]
mov ah,2
int 21h
;;stosb
cmpsb
jnz unmat
dec cx
jnz next
mov bl,12h
jmp output


unmat: mov bl,0ffh

output: cmp bl,12h
je right
jne wrong

right: mov dx,offset rightresult
mov ah,9
int 21h
jmp exit

wrong: mov dx,offset wrongresult
mov ah,9
int 21h


exit: mov ax,4c00h
int 21h

code ends
end input

21,453

社区成员

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

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