汇编语言编密码

汇编语言编密码,第1张

运行结果如图,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  SEGMENT

    PASSWORD  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 通常用于做计数器。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/7968962.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存