运行结果如图,8086汇编程序如下:
DATA SEGMENT
BUF1 DB 'Please input random string,end with Enter key:$'提示输入
BUF2 DB 0,0,0,0,0,0,0,0,0,0,0DH存放输入的字符,假设最多10个字符
NUM1 DW 0实际输入数据的个数
BUF3 DB 0DH,0AH 回车换行
BUF4 DB 0,0,0,0,0,0,0,0,0,0,0DH存放转换过的字符
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA
START:PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
CALL PROC1
CALL PROC2
CALL PROC3
CALL PROC4
CALL PROC5
CALL PROC6
RET
MAIN ENDP
PROC1 PROC NEAR 提示输入
MOV DX,OFFSET BUF1
MOV AH,09H
INT 21H显示提示输入语句
RET
PROC1 ENDP
输入并存储
PROC2 PROC NEAR
MOV SI,OFFSET BUF2
MOV CX,20
SHURU:MOV AH,01H键盘输入并回显,AL=输入字符
INT 21H
CMP AL,0DH判断是否回车符
JZ NEXT
MOV [SI],AL
INC SI
INC NUM1
LOOP SHURU
NEXT:MOV [SI],0DH
RET
PROC2 ENDP
PROC3 PROC NEAR 字母变,非字母不变,存放于BUF4
MOV CX,NUM1
MOV DI,OFFSET BUF4
MOV SI,OFFSET BUF2
BIANHUAN:MOV AL,[SI]
CMP AL,3AH判断是否字母
JC NEXT1
CMP AL,5BH 判断是大写还是小写字母
JC DAXIE
ADD AL,04H 是小写,先+4
CMP AL,7BH超过小写z
JNC NEXT2
ADD AL,04H
NEXT2:SUB AL,26
JMP NEXT1
DAXIE:ADD AL,04H 是大写,先+4
CMP AL,5BH超过大写Z
JNC NEXT2
ADD AL,04H
NEXT1:MOV [DI],AL非字母不变,存入BUF4,若是字母,则变换后再存
入BUF4对应单元
INC DI
INC SI
LOOP BIANHUAN
RET
PROC3 ENDP
PROC4 PROC NEAR 输出一个回车换行
MOV CX,2
MOV DI,OFFSET BUF3
SHUCHU:MOV DL,[DI]
MOV AH,02H
INT 21H
INC DI
LOOP SHUCHU
RET
PROC4 ENDP
PROC5 PROC NEAR 显示加密后的字符串
MOV CX,NUM1
MOV DI,OFFSET BUF4
SHUCHU1:MOV DL,[DI]
MOV AH,02H
INT 21H
INC DI
LOOP SHUCHU1
RET
PROC5 ENDP
PROC6 PROC NEAR
MOV AH,07H
CMP AL,0DH
JZ EXIT1
EXIT1:MOV AH,4CH 按回车键,结束程序
INT 21H
RET
PROC6 ENDP
CODE ENDS
END START
DATA SEGMENTPASSWORD DB 30 DUP(?),0DH
WRITE DB 'please write your password:',0DH,0AH,'$'
DISSP2 DB 'Password Right!','$'
DISSP3 DB 'Password Error!','$'
ACCURACY DB '5201314',0DH 用户输入密码,以回车键结束
COUNT EQU $-ACCURACY 密码长度
SEPERATE DB 0DH,0AH,'$' 换行
TIMES DB 4 用于后面错误的重新尝试机会
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
START: MOV SI,OFFSET PASSWORD 输入的密码
MOV DI,OFFSET ACCURACY 正确的密码
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV DX,OFFSET WRITE please write your password:
MOV AH,09H
INT 21H
MOV CX,20
INPUT: MOV AH,7 7号中断指令,键盘输入无回显,AL=输入字符
INT 21H
MOV [SI],AL
CMP AL,0DH 判断是否输入回车键
JE OVER 如果输入回车键,表明用户输入结束
MOV AH,2 如果不是回车键,则调用2号中断,显示输出,DL=输出字符
MOV DL,'*'
INT 21H
INC SI
LOOP INPUT
OVER: MOV DX,OFFSET SEPERATE 换行
MOV AH,9
INT 21H
MOV SI,OFFSET PASSWORD
MOV CX,COUNT
CLD
REPZ CMPSB
JNZ ERROR 密码不相等,显示错误
JMP RIGHT 密码相等,显示正确
ERROR: POP CX ************error***********************
MOV DX,OFFSET DISSP3 显示Password Error!
MOV AH,09H
INT 21H
MOV SI,OFFSET TIMES 有三次重新尝试机会,若还是错误则显示错误,
MOV AL,[SI]
DEC AL 自减1
MOV [SI],AL
CMP AL,0
JNE START
JMP EXIT
RIGHT: MOV DX,OFFSET DISSP2 显示Password Right!
MOV AH,09H
INT 21H
JMP EXIT
EXIT: MOV AX,4C00H
INT 21H
CODE ENDS
END START
楼主出手大方,不愧山东后裔。这样一个小题,就是不出悬赏分,都会有人答的。况乎如此慷慨?
有道是:重赏之下,必有勇夫。不谬。我是其一。
MOV AX,0 累加器清零
MOV BX,2 等差级数初值
MOV CX,50 循环次数,亦即等差级数第50项,BX=100
LP: ADD AX,BX 累加
ADD BX,2 等差级数增值
LOOPLP 循环
一、本程序段功能:求等差级数2,4,6,...的前50项之和。
二、运行结果:
1、等差级数第50项=100,即bx=64H
2、等差级数前50项之和=2450,即AX=2450
三、本程序段未产生溢出。
四、程序段中的CX,是必须要有的,是很有用的,它是控制循环次数的。寄存器CX 通常用于做计数器。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)