高分请教,如何用汇编语言实现密码校验?就是显示密码对话框,然后校验输入的密码!谢谢!

xinxxiny 2005-02-26 12:13:32
由于对汇编不是很熟悉,请教众位大虾,如何用用汇编程序实现以下功能:
1.显示密码校验对话框(可惜不是用VC啊!)
2.实现密码校验功能(关键是如何获取用户输入信息)
谢谢!
...全文
363 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kvci 2005-03-03
  • 打赏
  • 举报
回复
TO: tiancai1(ok)
oK
怎么聊啊?
当然QQ拉
我的:38833683
Kvci 2005-03-02
  • 打赏
  • 举报
回复
大虾称不上,我还是个学生
刚好我们也是在作个课程设计
只准用BIOS中断来实现DOS的一些命令接口
刚好写了些用BIOS中断显示和输入字符的函数。
不知道有没有问题
我运行的时候还是可以在TC2。0下编译通过,运行结果还好
不知道有没有潜在的错误
或者哪位大虾帮我看看
/******************TC 2。0编译通过***********************************/
#include<stdio.h>
#include<dos.h>
union REGS inregs,outregs;
int row=0,col=0; /* row:光标所在行;col:光标所在列 */
/**********************获取光标当前位置************************/
void get_cur_pos(int *row,int *col)
{
inregs.h.ah=3; /* BIOS 10H中断的入口参数 */
inregs.h.bh=0; /* BIOS 10H中断的入口参数 */
int86(0x10,&inregs,&outregs); /* 调用 BIOS 10H中断3H号功能*/
*row=outregs.h.dh; /* 将当前光标纵坐标值给row */
*col=outregs.h.dl; /* 将当前光标横坐标值给col */
}
/**********************设置光标当前位置************************/
int set_cur_pos(int row,int col)
{
inregs.h.dh=row; /* 入口参数:新位置的纵坐标 */
inregs.h.dl=col; /* 入口参数:新位置的横坐标 */
inregs.h.bh=0; /* BIOS 10H中断的入口参数 */
inregs.h.ah=2; /* BIOS 10H中断的入口参数 */
int86(0x10,&inregs,&outregs); /* 调用 BIOS 10H中断2H号功能*/
}
/**********************显示一个字符************************/
void PrintChar(char c)
{
extern int col,row;
get_cur_pos(&row,&col);/*先取得当前光标位置 */
/*如果要显示的字符是回车符号就行号增1,列号置0 */
if(c=='\n'||c=='\r'){row=row+1;col=0;set_cur_pos(row,col);return;}
/*如果已经到行尾,则行号增1,列号置0 */
if(col==79){row+=1;col=0;}

col=col+1; /* 列号自增1 */
inregs.h.ah=10; /*BIOS INT 10H中断入口参数:功能号 */
inregs.h.al=c; /*BIOS INT 10H中断入口参数:要显示的字符 */
inregs.x.cx=1; /*显示的该字符次数 */
int86(0x10,&inregs,&outregs);/*调用中断显示al中字符 */
set_cur_pos(row,col); /*显示完毕,设置光标到新位置 */
}
/**********************显示一个字符串**************************/
void PrintStr(char *p)
{
p=p-1;
while(*(++p)) /*当指针p所指内容不为空的时候,显示其中内容 */
PrintChar(*p);/*调用PrintChar() */
}
/************************显示一个整型数据**********************/
void PrintInt(int i)
{
int n=10000,t,a[5];
if(i==0){PrintChar('0');return;}/*如果i为0,直接显示0,返回 */
if(i<0) /* 如果i小于0,先显示一个负号(-),再将i变正 */
{PrintChar('-');i=0-i;}
for(t=0;t<5;t++)/* 假设输入的整数长度不超过5位 */
{
a[t]=(i/n)%10;
n=n/10;
}
for(t=0;t<5;t++)
if(a[t]!=0)break;
for(n=t;n<5;n++)
PrintChar(a[n]+'0');
}
/***************输入一个字符,并将字符返回******************/
char InputChar()
{unsigned char c;
inregs.h.ah=00;
int86(0x16,&inregs,&outregs);
c=outregs.h.al;
if(c!='\r')PrintChar(c);
return c;
}
/**********************输入一个字符串************************/
void InputStr(char *p)
{
while((*(p++)=InputChar())!='\r');
*(p-1)='\0';
}
/***************************主函数***************************/
main()
{
char c[30]="Please Answer: \r";
int a=25;
system("cls"); /*清屏 */
PrintStr(c); /*显示字符串c的内容 */
PrintInt(a); /*显示a的值 */
PrintChar('*'); /*显示‘*’字符 */
PrintInt(a); /*显示a的值 */
PrintChar('='); /*显示‘=’字符 */
InputStr(c); /*输入一个字符串保存到变量c里面 */
PrintChar('\n'); /*回车换行 */
PrintStr(c); /*显示刚刚输入的字符串 */
getch(); /*停顿一下 */
}
/************************************************************/
tiancai1 2005-03-02
  • 打赏
  • 举报
回复
楼上的挺强啊,有机会聊聊?
我也是学生。
xinxxiny 2005-03-01
  • 打赏
  • 举报
回复
谢谢三位大虾!
现在最关键的是我是BIOS编程,因此很多中断都不能用.现在碰到一个问题,就是用int 10h光标显示不出来!
Kvci 2005-02-28
  • 打赏
  • 举报
回复
;MASM 6。0编译通过

title ***简单密码输入进阶 by lluct***

data segment ;定义数据段
headmsg db ' ',0dh,0ah
db '+----------------------------------------------+',0dh,0ah
db '| Simple input password system for asm program |',0dh,0ah
db '| have a fun.^-^. |',0dh,0ah
db '| Poor Programmer:lluct Date:march,21 2004 |',0dh,0ah
db '+----------------------------------------------+',0dh,0ah
db 0dh,0ah,'PLEASE INPUT PASSWORD:','$'
;定义头信息组
msg1 db 'PASSWORD RIGHT!','$'
;定义输入密码正确后显示出来的信息
msg2 db 'PASSWORD ERROR!','$'
;定义输入密码错误后显示出来的信息
cmpare db '5201314','$'
;定义密码
input db 100 dup (?)
;定义输入的字符串,字符串必须用db定义,长度为100个字节
data ends ;数据段结尾

code segment ;定义代码段
assume cs:code ;规定cs的内容
assume ds:data ;规定ds的内容

start_program: ;程序从这里开始
mov ax,data ;把data段地址赋给ax
mov ds,ax ;ds置初值,data的段地址
mov si,0 ;变址寄存器初值为0

call enter ;调用显示回车换行子程序
lea dx,headmsg ;输出头信息组的偏移地址
call dispchs ;调用显示字符串子程序

repeat_input: ;循环输入单个字符
mov ah,08h ;调用8号功能:键盘输入字符(无回显)
int 21h ;完成输入
mov dl,2ah ;输出ascii码的*号
push ax ;保护原来输入的字符
call dispch ;调用单个字符回显子程序
pop ax ;恢复原来输入的字符
cmp al,0dh ;是否回车
je finished_input ;是就转移到finished_input
mov input[si],al ;保存单个字符
inc si ;访问下一个相对地址
jmp repeat_input ;无条件转移到repeat_input

finished_input: ;完成输出
mov input[si],24h ;给刚才输入的字符串加结束标志($)
call enter

mov si,0 ;si置0
mov di,0 ;di置0
mov cx,8 ;设置检测密码的长度,要包括结束标志
check_password: ;检测密码
cmp cx,0 ;cx为是否为0
je right ;是就转移到right
mov bl,input[si] ;把input的si的地址内的信息传送到bl
mov dl,cmpare[di] ;把cmpare的di的地址内的信息传送到dl
cmp dl,bl ;检查dl和bl是否一样
jne error ;不是就转移到error
inc si ;si加1
inc di ;di加1
dec cx ;cx减1
jmp check_password

right:
call enter
lea dx,msg1
call dispchs
call enter
jmp exit

error:
call enter
lea dx,msg2
call dispchs
mov dl,07h ;输出ascii码的报警(响铃)控制符bel(07h)
call dispch
call enter
jmp exit

exit: mov ah,4ch ;4c号功能调用:终止当前程序并返回
int 21h ;返回dos

enter proc near ;显示回车换行子程序
mov dl,0dh ;输出ascii码的回车控制符cr
call dispch
mov dl,0ah ;输出ascii码的换行控制符lf
call dispch
ret ;返回
enter endp

dispch proc near ;显示单个字符子程序
mov ah,02h ;2号功能调用:显示器输出字符
int 21h ;完成输出显示
ret
dispch endp

dispchs proc near ;显示字符串子程序
mov ah,09h ;9号功能调用:显示字符串
int 21h
ret
dispchs endp

code ends ;代码段结尾
end start_program ;结束汇编


;把以上代码复制到记事本等文本程序中,并保存.(如passwd2.asm)
;编译:masm passwd2.asm
;连接:link passwd2.obj
;执行:passwd2.exe
VxD1 2005-02-26
  • 打赏
  • 举报
回复
用汇编过实验也和用高级语言来实现差不多,都要调用windows API,获取用户输入信息我想应该调用getwindowtext吧。
大熊猫侯佩 2005-02-26
  • 打赏
  • 举报
回复
用 Win32ASM 么?
其实和 VC 差不多~~~用资源工具(我一般是VC)做一个对话框资源模板
然后生成 .res 文件,然后在源代码中用 CreateDialog 调用资源中的模板
创建无模式对话框。然后写代码验证该输入的密码~~~~简单的作个判断~~~
然后处理~~~OK 了~~~~

21,458

社区成员

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

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