先从键盘上输入一串字符,将数字按照下表的密码数字进行加密,将加密后的数字在第2行显示出来。然后用解密数字对加密后的数字进行解密,并在第3行显示解密后的数字。
其中,显示功能由子程序OUTPUT完成,不适用与加密规则和解密规则的内容不做处理。
例如:输入:“18”,则在第2行显示:“52”,第3行显示:“18”。
数字0-9与加密和解密数据的对应关系如下:
原数字: 0 1 2 3 4 5 6 7 8 9
密码数字: 7 5 9 1 3 6 8 0 2 4
原密码数字: 0 1 2 3 4 5 6 7 8 9
解密数字: 7 3 8 4 9 1 5 0 6 2
Masm for Windows 集成实验环境 2012.5
DATAS SEGMENT
buffer DB 100,0,100 DUP(?);存放输入的数字和加密、解密后的数字
passwdnu DB 7,5,9,1,3,6,8,0,2,4;密码数字
decrypnu DB 7,3,8,4,9,1,5,0,6,2;解密数字
hint DB 'Please enter a string of numbers: $'
before DB 'Encrypted: $'
after DB 'Decrypted: $'
break DB 13,10,'$'
DATAS ENDS
STACKS SEGMENT STACK
DB 200H DUP(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
MAIN PROC
MOV AX,DATAS
MOV DS,AX
LEA DX,hint;输入前提示
MOV AH,9H
INT 21H
LEA DX,buffer;定位到缓冲区
MOV AH,0AH
INT 21H
LEA DX,break;换行
MOV AH,9H
INT 21H
LEA DX,before;换行
MOV AH,9H
INT 21H
CALL ENCRYPT;加密
CALL OUTPUT;显示数据
LEA DX,break;换行
MOV AH,9H
INT 21H
LEA DX,after;换行
MOV AH,9H
INT 21H
CALL DECODING;解密
CALL OUTPUT;显示数据
MOV AH,4CH
INT 21H
MAIN ENDP
;子程序
;功能:加密数据。
;入口参数:buffer存放要加密的数据。
ENCRYPT PROC
LEA SI,buffer;定位到缓冲区
INC SI
MOV CL,[SI]
MOV CH,0;CX存放数据量
INC SI
LEA BX,passwdnu;定位到密码数字
encr:
MOV AL,[SI]
CMP AL,30H
JB econt;不加密非数字
CMP AL,39H
JG econt;不加密非数字
SUB AL,30H
XLAT;AL<--((BX)+(AL))
ADD AL,30H
MOV [SI],AL
econt:
INC SI
LOOP encr
RET
ENCRYPT ENDP
;子程序
;功能:解密数据。
;入口参数:buffer存放要解密的数据。
DECODING PROC
LEA SI,buffer;定位到缓冲区
INC SI
MOV CL,[SI]
MOV CH,0;CX存放数据量
INC SI
LEA BX,decrypnu;定位到解密数字
deco:
MOV AL,[SI]
CMP AL,30H
JB dcont;不解密非数字
CMP AL,39H
JG dcont;不解密非数字
SUB AL,30H
XLAT;AL<--((BX)+(AL))
ADD AL,30H
MOV [SI],AL
dcont:
INC SI
LOOP deco
RET
DECODING ENDP
;子程序
;功能:显示数据。
;入口参数:buffer存放要输出的数据。
OUTPUT PROC
LEA BX,buffer;定位到缓冲区
INC BX
MOV CL,[BX]
MOV CH,0;CX存放要输出的数据量
INC BX
outp:
MOV DL,[BX]
MOV AH,2H
INT 21H
INC BX
LOOP outp
RET
OUTPUT ENDP
CODES ENDS
END MAIN
如果文章内容出错或者您有更好的解决方法,欢迎到评论区指正和讨论!