;要求:提示输入一字符串;键盘输入,Enter键结束输入;加密后换行显示加密结果。
;
;凯撒编码规律:
;字母A 变为E,a 变为e,即变成其后的第 4 个字母(题目是这样要求的,也可改成别的数字);
;字母W 变为A,Y 变为C,Z变为D,非字母不变。
;如输入“China”变为“Glmre”。
;
;这是在网上看到的一个题目,已经有了最佳答案。
;做而论道以为该答案的结构过于罗嗦了,功能还不尽全面,并且缺少注解,提问者并不理解。
;网址:http://zhidao.baidu.com/question/279941785.html
;
;做而论道以前用C语言写过一个关于凯撒密码的程序,可见:
http://hi.baidu.com/do_sermon/item/78589d7e9d00f9397044232a
http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/b62441fa541839294f4aea9f.html
;
;用汇编来写,也是轻车熟路。但愿没有BUG,欢迎拍砖。
;
;用80x86汇编语言编程如下:
;---------------------------------------------------
DATA SEGMENT
PARS DB 100 ;准备接收100个字符.
NNN DB ? ;用于存放实际输入的个数.
III DB 100 DUP(?) ;100字节的空间.
K_S DB 100 DUP('$') ;100字节的空间.
MES_I DB 13, 10, 'Input STR : $ ' ;用于提示.
MES_O DB 13, 10, 'Output STR : $ ' ;用于提示.
DATA ENDS
;---------------------------------------------------
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV DX, OFFSET MES_I
MOV AH, 9 ;9号功能调用,显示提示.
INT 21H
MOV DX, OFFSET PARS
MOV AH, 10 ;10号功能调用,接收键盘输入.
INT 21H
;---------------------------------------------------
MOV CL, NNN ;收到字符的个数.
MOV CH, 0
CMP CX, 0
JNZ DO_IT
JMP EXIT
DO_IT:
LEA SI, III ;键入字符的起始地址.
LEA DI, K_S ;加密字符的起始地址.
;----------------------------下面开始循环统计.
AGAIN:
MOV AL, [SI] ;取来一个
CMP AL, 'A'
JC NEXT ;小于'A'不用处理,转移到下一个
CMP AL, '{' ;- '{'
JNC NEXT ;大于'z'不用处理,转移到下一个
CMP AL, 'a'
JC BIG ;小于'a'可能是大写,转移
SMALL:
ADD AL, 4 ;加密
CMP AL, '{'
JNC J_26 ;大于'z',超过了最后的字母,应减去26
JMP NEXT
BIG:
CMP AL, '[' ;- '['
JNC NEXT ;大于'Z'不用处理,转移到下一个
ADD AL, 4
CMP AL, '['
JNC J_26 ;大于'Z',超过了最后的字母,应减去26
JMP NEXT
J_26:
SUB AL, 26
NEXT:
MOV [DI], AL ;保存密码
INC SI
INC DI
LOOP AGAIN
;----------------------------加密结束
MOV DX, OFFSET MES_O
MOV AH, 9 ;9号功能调用,显示提示.
INT 21H
MOV DX, OFFSET K_S
MOV AH, 9 ;9号功能调用,显示密码.
INT 21H
;----------------------------显示结束.
EXIT:
MOV AH, 4CH
INT 21H
CODE ENDS
END START
;注意:输入字符串的时候,不要输入'$',否则用“9号功能调用”进行显示的时候,它仅显示'$'前面的符号。
;这都是微软闹的,它们编写的系统功能调用程序,看见了钱(美元符$),就自己保留了,不输出了。
;不知那位网友来编写个解密的?