Chinaunix首页 | 论坛 | 博客
  • 博客访问: 570519
  • 博文数量: 97
  • 博客积分: 5090
  • 博客等级: 大校
  • 技术积分: 969
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-01 14:56
文章分类

全部博文(97)

文章存档

2011年(1)

2009年(1)

2008年(14)

2007年(37)

2006年(44)

我的朋友

分类: WINDOWS

2006-04-01 12:29:49

咱们没本事创造出汇编语言来,但是我坚信,只要愿意努力,想熟练使用汇编还是比较容易的,大家一起上,把汇编语言拿下!!!!!!!!!真诚期待与大家一起交流,QQ:344903855, E-MAIL:luojiafeng1984@sina.com

运行程序之前,在当前工作目录下建立一个名为success.dat的文件,里面存放"success!"这几个字符,如果密码输入正确,这几个字符就会被读出来显示。

/*
 * Copyright (c) 2006 All rights reserved.
 * 文件名:CheckPassword.asm
 *
 * 文件标识:CheckPassword
 * 摘要:一个简单的验证密码程序
 * 输入:一个密码串(5201314)
 * 输出:密码正确,从success.dat文件中读出内容,并显示,否则提示密码错误,并给二次重新输出的机会
 *
 * 当前版本 0.01
 * 作者:罗
 * 完成日期:2006年4月1日
 */

;============ 数据段 ===============
data segment
    pwfile db 'success.dat', 0
    input db 100 dup(?)                                 ;用户输入的密码的存储位置
    password db '5201314', '$'                          ;真实密码
    content db 256 dup(?)                               ;从文件里面读出的内容放在这个缓冲区里
    msgerror db 'Password Error!', '$'                  ;用户密码输入错误时显示的提示信息
    msgopenerror db 'File Open Error!', '$'             ;打开文件出错时的提示信息
    msgreaderror db 'Read File Error!', '$'             ;读文件出错时的提示信息
    msgcloseerror db 'File Close Error!', '$'
    prompt db 'Please Enter Your Password:', '$'        ;运行程序时提示输入密码
data ends


;=========== 堆栈段 =================
sseg segment stack
    db 256 dup(0)
sseg ends

;=========== 代码段 =================
code segment
    assume cs:code, ds:data, ss:sseg, es:data
start:
    mov ax, data
    mov ds, ax
    mov es, ax

    mov si, 0
    mov bh, 0                        ;计数器,用来计算用户密码输入错误的次数
    lea dx, prompt
    call dispstring                  ;输出提示信息,提示用户输出密码

pwinput:
    mov ah, 08h                      ;Dos 08号功能调用,不带回显输入一个字符
    int 21h
    cmp al, 0dh                      ;和回车符比较
    je finish
    push ax                          ;输入的密码字符在al寄存器里面,要保护好,因为输出*号时会改变ax的值
    mov dl, '*'
    mov ah, 02h
    int 21h
    pop ax
    mov input[si], al
    inc si
    jmp pwinput

finish:
    mov input[si], 24h               ;24h是字符串结束符'$'的ASCII码
    mov si, 0
    mov di, 0
    mov cx, 8

pwcheck:
    cmp cx, 0
    je pwright                       ;cx=0表示密码输入正确
    mov bl, input[si]
    mov dl, password[di]
    cmp dl, bl
    jnz pwerror
    inc si
    inc di
    dec cx
    jmp pwcheck

pwright:
    call outenter                    ;输出回车换行

    call readdoc                     ;从文件里面读出信息,并输出
    jmp exit                        

pwerror:
    call outenter                    ;输出一个回车换行
    lea dx, msgerror
    call dispstring                  ;输出密码错误时的提示信息
    inc bh
    cmp bh, 3
    jae exit
    call outenter                    ;输出一个回车换行
    lea dx, prompt
    call dispstring
    jmp pwinput

openerror:
    lea dx, msgopenerror
    call dispstring                  ;输出提示信息,提示文件打开出错并退出程序
    jmp exit

readerror:
    lea dx, msgreaderror             ;输出提示信息,提示读文件错误并退出程序
    call dispstring
    jmp exit

closeerror:
    lea dx, msgcloseerror            ;输出提示信息,提示关闭文件错误,并退出应用程序
    call dispstring

exit:
    mov ah, 4ch
    int 21h

;======= 输出回车换行的子程序 =======
;======= 入口参数:无================
;======= 出口参数:无================
outenter proc near
    mov dl, 0dh
    mov ah, 02h
    int 21h
    mov dl, 0ah
    mov ah, 02h
    int 21h
    ret
outenter endp

;======= 输出字符串的子程序 =========
;======= 入口参数:dx = 输出字符串缓冲区的首地址
;======= 出口参数:无 ===============
dispstring proc near
    mov ah, 09h
    int 21h
    ret
dispstring endp

;======= 将文件中的密码读到缓冲区的子程序 ========
;======= 入口参数:无 ============================
;======= 出口参数:Content里面存放从文件里面读出的8个字节内容 ======
readdoc proc near
    push ax
    push bx
    push cx
    push dx

    mov dx, offset pwfile
    mov ax, 3d00h                  ;3dh号DOS功能调用,打开文件
    int 21h
    jc openerror                   ;打开文件出错时转

    mov bx, ax
    mov dx, offset content
    mov cx, 8
    mov ah, 3fh                    ;3Fh号DOS功能调用,读文件到dx缓冲区
    int 21h
    jc readerror                   ;读文件出错时转
    mov byte ptr content[8], 24h

    mov ah, 3eh                    ;3Eh号DOS功能调用,关闭文件
    int 21h
    jc closeerror                  ;关闭文件时出错转

    mov dx, offset content
    call dispstring                ;显示从文件里面读出的字符串

    pop dx
    pop cx
    pop bx
    pop ax
    ret
readdoc endp

code ends
    end start

阅读(4512) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-08-08 11:11:28

恩,借鉴了,不过提出一个问题,就是程序也支持backspace输入哦,这样貌似不是很合理啊。