[高分急等]汇编语言,请大神修改代码....

密码设置模拟
要求第一次能设置密码并保存,然后可以修改密码。。。不知道程序错在哪,请大神修改完善功能....
DATA SEGMENT
FILE DB 'E:\PW.BAT',00
NPW DB 'Please enter your password and press the return key:',13,10,36
INFO1 DB 0DH,0AH,'--------------------------',0DH,0AH,'You can make two choice:',0DH,0AH,0DH,0AH,'$'
INFO2 DB '1.Reset passport',0DH,0AH,'$'
INFO3 DB '2.Exit',0DH,0AH,'$'
INFO4 DB 0DH,0AH,'-------------------',0DH,0AH,'|INVALID SELECTION|',0DH,0AH,'-------------------',0DH,0AH,'$'
OPW DB 'Please input your old password and press the return key:',13,10,36
ERR DB 13,10,'YOUR PASSWORD ERROR!',36
MSG DB 13,10,'INPUT NEW PASSWORD:',36
PW DB 19,18 DUP(?)
PWS DB 19 DUP(?)

DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
START:
MAIN PROC NEAR
MOV AX,DATA
MOV DS,AX
MOV ES,AX

LEA DX,FILE
MOV AX,3D02H
INT 21H
JC L1
JMP HK
L1:
LEA DX,NPW
MOV AH,09H
INT 21H
CALL SET
LEA DX,FILE
MOV CX,00H
MOV AH,3CH
INT 21H
MOV BX,AX
CALL SET1
JMP HK
HK:
LEA DX,INFO1
MOV AH,09H
INT 21H
LEA DX,INFO2
INT 21H
LEA DX,INFO3
INT 21H
MOV AH,01H
INT 21H
CMP AL,'1'
JE LA
CMP AL,'2'
JE EXIT
LEA DX,INFO4
MOV AH,09H
INT 21H
JMP HK

LA:
PUSH AX
LEA DX,OPW
MOV AH,09H
INT 21H
CALL SET
POP BX
PUSH BX
LEA DX,PWS
MOV CX,1
MOV AH,3FH
INT 21H
MOV CX,WORD PTR PWS
DEC CX
LEA DX,PWS+1
MOV AH,3FH
INT 21H
LEA SI,PW
LEA DI,PWS
CLD
MOV CL,PW
XOR CH,CH
REPE CMPSB
CMP CX,0
JZ LD
LC:
LEA DX,ERR
MOV AH,09H
INT 21H
JMP HK
LD:
LEA DX,MSG
MOV AH,09H
INT 21H
CALL SET
POP BX
MOV AH,3EH
INT 21H
LEA DX,FILE
MOV AX,3D01H
INT 21H
CALL SET1

EXIT:
MOV AH,4CH
INT 21H
MAIN ENDP

SET PROC NEAR
MOV CL,12H
CLD
LEA SI,PW
MOV SI,13H
INC SI
MOV DL,'*'
I1:
MOV AH,08H
INT 21H
CMP AL,0DH
JZ R1
MOV AH,02H
CMP CL,0
JNZ I2
MOV DL,07H
INT 21H
JMP I1

I2:
MOV [SI],AL
INT 21H
INC SI
DEC CL
JMP I1
R1:
SUB PW,CL
RET
SET ENDP

SET1 PROC NEAR
LEA DX,PW
MOV CL,PW
AND CX,0FFH
MOV AH,40H
INT 21H
RET
SET1 ENDP

CODE ENDS
END START

DATA SEGMENT
FILE DB 'E:\PW.BAT',00
NPW DB 'Please enter your password and press the return key:',13,10,36
INFO1 DB 0DH,0AH,'--------------------------',0DH,0AH,'You can make two choice:',0DH,0AH,0DH,0AH,'$'
INFO2 DB '1.Reset passport',0DH,0AH,'$'
INFO3 DB '2.Exit',0DH,0AH,'$'
INFO4 DB 0DH,0AH,'-------------------',0DH,0AH,'|INVALID SELECTION|',0DH,0AH,'-------------------',0DH,0AH,'$'
OPW DB 'Please input your old password and press the return key:',13,10,36
ERR DB 13,10,'YOUR PASSWORD ERROR!',36
MSG DB 13,10,'INPUT NEW PASSWORD:',36
PW DB 19,18 DUP(?)
PWS DB 19 DUP(?)

DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
START:
MAIN PROC NEAR
MOV AX,DATA
MOV DS,AX
MOV ES,AX

LEA DX,FILE
MOV AX,3D02H
INT 21H
JC L1
mov bx,ax ;保存文件句柄
JMP HK
L1:
LEA DX,NPW
MOV AH,09H
INT 21H
CALL SET
LEA DX,FILE
MOV CX,00H
MOV AH,3CH
INT 21H
MOV BX,AX
CALL SET1
JMP HK
HK:
LEA DX,INFO1
MOV AH,09H
INT 21H
LEA DX,INFO2
INT 21H
LEA DX,INFO3
INT 21H
MOV AH,01H
INT 21H
CMP AL,'1'
JE LA
CMP AL,'2'
JE EXIT
LEA DX,INFO4
MOV AH,09H
INT 21H
JMP HK

LA:
;PUSH AX 用bx保存句柄,直接用就可以,没必要用堆栈了
LEA DX,OPW
MOV AH,09H
INT 21H
CALL SET
LEA DX,FILE
MOV AX,3D01H
INT 21H
MOV BX,AX
LEA DX,PWS
MOV CX,1
MOV AH,3FH
INT 21H
MOV CX,WORD PTR PWS
DEC CX
LEA DX,PWS+1
MOV AH,3FH
INT 21H

LEA SI,PW
LEA DI,PWS
CLD
MOV CL,PW
XOR CH,CH
REPE CMPSB
CMP CX,0
JZ LD
LC:
LEA DX,ERR
MOV AH,09H
INT 21H
JMP HK
LD:
LEA DX,MSG
MOV AH,09H
INT 21H
mov ah,3eh
int 21h ;关闭文件再打开,也可以用移动文件指针到文件开头
LEA DX,FILE
MOV AX,3D01H
INT 21H
MOV BX,AX
CALL SET
CALL SET1

EXIT:
MOV AH,4CH
INT 21H
MAIN ENDP

SET PROC NEAR
MOV CL,12H
CLD
LEA SI,PW
;MOV SI,13H 这句什么意思?错误?
INC SI
MOV DL,'*'
I1:
MOV AH,08H
INT 21H
CMP AL,0DH
JZ R1
MOV AH,02H
CMP CL,0
JNZ I2
MOV DL,07H
INT 21H
JMP I1

I2:
MOV [SI],AL
INT 21H
INC SI
DEC CL
JMP I1
R1:
SUB PW,CL
RET
SET ENDP

SET1 PROC NEAR
LEA DX,PW
MOV CL,PW
AND CX,0FFH
MOV AH,40H
INT 21H
mov ah,3eh
int 21h ;关闭文件
RET
SET1 ENDP

CODE ENDS
还有错误
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-30
#include<stdio.h>

struct TData
{
int XueHao;
char name[10];
float L1,L2,L3,L;
};

void main()
{
int N=100; /*总共最多100名学生*/

struct TData data[100];
int sum=0; /*实际学生数目*/
int sumbyl[11]; /*分段统计人数,按0-100分10段,100分单独1段*/
int i,l;

//输入学号、姓名、平时、期中和期末成绩,学号<0表示输入结束
while(1)
{
printf("please intput XueHao:");

scanf("%d",&data[sum].XueHao);
if(data[sum].XueHao<0)
break;
printf("please input data:");
scanf("%s %f %f %f",data[sum].name,&data[sum].L1,&data[sum].L2,&data[sum].L3);

data[sum].L=data[sum].L1*0.2f+data[sum].L1*0.3f+data[sum].L1*0.5f; /*计算总成绩*/
l=data[sum].L/10;
sumbyl[l]++; /*分类统计*/

sum++;
if(sum>=N)
break;
}

/*打印学生成绩*/
printf("xuehao name L1 L2 L3 L\n");
for(i=0;i<sum;i++)
{
printf("%d %s %f %f %f %f\n",data[i].XueHao,data[i].name,data[i].L1,data[i].L2,data[i].L3,data[i].L);
}
printf("\n");

/*打印分数段人数及所占比例*/
printf("范围 人数 比例\n");
for(i=0;i<10;i++)
{
printf("%d-%d %d %f\n",i*10,i*10+9,sumbyl[i],sumbyl[i]*1.0f/sum);
}
printf("100-100 %d %f\n",sumbyl[11],sumbyl[11]*1.0f/sum);
}
第2个回答  2011-06-30
#include<stdio.h>

struct TData
{
int XueHao;
char name[10];
float L1,L2,L3,L;
};

void main()
{
int N=100; /*总共最多100名学生*/

struct TData data[100];
int sum=0; /*实际学生数目*/
int sumbyl[11]; /*分段统计人数,按0-100分10段,100分单独1段*/
int i,l;

//输入学号、姓名、平时、期中和期末成绩,学号<0表示输入结束
while(1)
{
printf("please intput XueHao:");

scanf("%d",&data[sum].XueHao);
if(data[sum].XueHao<0)
break;
printf("please input data:");
scanf("%s %f %f %f",data[sum].name,&data[sum].L1,&data[sum].L2,&data[sum].L3);

data[sum].L=data[sum].L1*0.2f+data[sum].L1*0.3f+data[sum].L1*0.5f; /*计算总成绩*/
l=data[sum].L/10;
sumbyl[l]++; /*分类统计*/

sum++;
if(sum>=N)
break;
}

/*打印学生成绩*/
printf("xuehao name L1 L2 L3 L\n");
for(i=0;i<sum;i++)
{
printf("%d %s %f %f %f %f\n",data[i].XueHao,data[i].name,data[i].L1,data[i].L2,data[i].L3,data[i].L);
}
printf("\n");

/*打印分数段人数及所占比例*/
printf("范围 人数 比例\n");
for(i=0;i<10;i++)
{
printf("%d-%d %d %f\n",i*10,i*10+9,sumbyl[i],sumbyl[i]*1.0f/sum);
}
printf("100-100 %d %f\n",sumbyl[11],sumbyl[11]*1.0f/sum);
}
第3个回答  2011-06-29
学习标记,佩服楼主
第4个回答  2011-06-29
太长了,没时间看

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网