汇编语言编程:按照凯撒密码的规则加密

;要求:提示输入一字符串;键盘输入,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号功能调用”进行显示的时候,它仅显示'$'前面的符号。
;这都是微软闹的,它们编写的系统功能调用程序,看见了钱(美元符$),就自己保留了,不输出了。

;不知那位网友来编写个解密的?

你可能感兴趣的:(80x86汇编语言)