masm汇编语言实现 将一个指定字符串进行循环移位加密。每个单字符的密钥(-7~7)保存在数组Key中。程序运行过程:显示明文,显示所产生的密文,显示解密后的明文。例如key = {-2,2,1,0,-1},其中负数表示循环左移,正数表示循环右移,0不变,数字表示移动的位数。 模板 DATAS SEGMENT ;此处输入数据段代码 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX ;此处输入代码段代码 MOV AH,4CH INT 21H CODES ENDS END START
时间: 2024-01-06 10:04:56 浏览: 134
以下是使用 MASM 汇编语言实现将指定字符串进行循环移位加密的代码,包括显示明文、密文和解密后的明文:
```
DATAS SEGMENT
; 数据段定义
MAX_LEN EQU 100 ; 字符串最大长度
STR DB MAX_LEN DUP(?) ; 存储明文、密文和解密后的明文的字符串
KEY DB -2, 2, 1, 0, -1 ; 密钥数组
DATAS ENDS
STACKS SEGMENT
; 堆栈段定义
DW 100H DUP(?) ; 申请堆栈空间
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES, DS:DATAS, SS:STACKS
START:
; 初始化堆栈指针
MOV AX, STACKS
MOV SS, AX
; 显示提示信息
MOV DX, OFFSET STR
MOV AH, 9
MOV DL, "P"
INT 21H
MOV DL, "l"
INT 21H
MOV DL, "e"
INT 21H
MOV DL, "a"
INT 21H
MOV DL, "s"
INT 21H
MOV DL, "e"
INT 21H
MOV DL, " "
INT 21H
MOV DL, "i"
INT 21H
MOV DL, "n"
INT 21H
MOV DL, "p"
INT 21H
MOV DL, "u"
INT 21H
MOV DL, "t"
INT 21H
MOV DL, " "
INT 21H
MOV DL, "s"
INT 21H
MOV DL, "t"
INT 21H
MOV DL, "r"
INT 21H
MOV DL, "i"
INT 21H
MOV DL, "n"
INT 21H
MOV DL, "g"
INT 21H
MOV DL, ":"
INT 21H
; 读入明文字符串
MOV AH, 0AH
MOV DX, OFFSET STR
INT 21H
; 显示明文
MOV AH, 9
MOV DX, OFFSET STR+2
INT 21H
; 加密
MOV SI, OFFSET STR+2 ; SI 指向明文
MOV DI, OFFSET STR+MAX_LEN+2 ; DI 指向密文
MOV CX, 0 ; CX 计数器清零
MOV BX, 0 ; BX 存储密钥数组的偏移量
ENCRYPT_LOOP:
MOV AL, [SI] ; 取出当前字符
ADD AL, [KEY+BX] ; 加上密钥
CMP AL, 0 ; 判断是否为 0
JZ ENCRYPT_SKIP ; 如果为 0,则不变
CMP AL, 7 ; 判断是否大于 7
JG ENCRYPT_OVERFLOW ; 如果大于 7,则溢出
CMP AL, -7 ; 判断是否小于 -7
JL ENCRYPT_OVERFLOW ; 如果小于 -7,则溢出
ADD BX, 1 ; 更新密钥数组的偏移量
CMP BX, 5 ; 判断是否超出密钥数组的长度
JGE ENCRYPT_RESET ; 如果超出,则重置为 0
CMP AL, 0 ; 判断是否为 0
JZ ENCRYPT_SKIP ; 如果为 0,则不变
CMP AL, 0AH ; 判断是否为换行符
JE ENCRYPT_SKIP ; 如果是换行符,则不变
CMP AL, 0DH ; 判断是否为回车符
JE ENCRYPT_SKIP ; 如果是回车符,则不变
ADD [DI], AL ; 更新密文
CMP [DI], 7FH ; 判断是否超出 ASCII 码表范围
JG ENCRYPT_OVERFLOW ; 如果超出,则溢出
CMP [DI], 20H ; 判断是否小于空格
JL ENCRYPT_OVERFLOW ; 如果小于空格,则溢出
ENCRYPT_SKIP:
INC SI ; 指向下一个字符
INC DI ; 指向下一个密文
INC CX ; 计数器加 1
CMP CX, MAX_LEN ; 判断是否超出字符串最大长度
JG ENCRYPT_END ; 如果超出,则结束加密
JMP ENCRYPT_LOOP
ENCRYPT_OVERFLOW:
; 显示错误信息
MOV DX, OFFSET STR
MOV AH, 9
MOV DL, "E"
INT 21H
MOV DL, "r"
INT 21H
MOV DL, "r"
INT 21H
MOV DL, "o"
INT 21H
MOV DL, "r"
INT 21H
MOV DL, "!"
INT 21H
JMP ENCRYPT_END
ENCRYPT_RESET:
; 重置密钥数组的偏移量为 0
XOR BX, BX
JMP ENCRYPT_LOOP
ENCRYPT_END:
; 显示密文
MOV AH, 9
MOV DX, OFFSET STR+MAX_LEN+2
INT 21H
; 解密
MOV SI, OFFSET STR+MAX_LEN+2 ; SI 指向密文
MOV DI, OFFSET STR+MAX_LEN*2+2 ; DI 指向解密后的明文
MOV CX, 0 ; CX 计数器清零
MOV BX, 0 ; BX 存储密钥数组的偏移量
DECRYPT_LOOP:
MOV AL, [SI] ; 取出当前字符
SUB AL, [KEY+BX] ; 减去密钥
CMP AL, 0 ; 判断是否为 0
JZ DECRYPT_SKIP ; 如果为 0,则不变
CMP AL, 7 ; 判断是否大于 7
JG DECRYPT_OVERFLOW ; 如果大于 7,则溢出
CMP AL, -7 ; 判断是否小于 -7
JL DECRYPT_OVERFLOW ; 如果小于 -7,则溢出
ADD BX, 1 ; 更新密钥数组的偏移量
CMP BX, 5 ; 判断是否超出密钥数组的长度
JGE DECRYPT_RESET ; 如果超出,则重置为 0
CMP AL, 0 ; 判断是否为 0
JZ DECRYPT_SKIP ; 如果为 0,则不变
CMP AL, 0AH ; 判断是否为换行符
JE DECRYPT_SKIP ; 如果是换行符,则不变
CMP AL, 0DH ; 判断是否为回车符
JE DECRYPT_SKIP ; 如果是回车符,则不变
ADD [DI], AL ; 更新解密后的明文
CMP [DI], 7FH ; 判断是否超出 ASCII 码表范围
JG DECRYPT_OVERFLOW ; 如果超出,则溢出
CMP [DI], 20H ; 判断是否小于空格
JL DECRYPT_OVERFLOW ; 如果小于空格,则溢出
DECRYPT_SKIP:
INC SI ; 指向下一个密文
INC DI ; 指向下一个解密后的明文
INC CX ; 计数器加 1
CMP CX, MAX_LEN ; 判断是否超出字符串最大长度
JG DECRYPT_END ; 如果超出,则结束解密
JMP DECRYPT_LOOP
DECRYPT_OVERFLOW:
; 显示错误信息
MOV DX, OFFSET STR
MOV AH, 9
MOV DL, "E"
INT 21H
MOV DL, "r"
INT 21H
MOV DL, "r"
INT 21H
MOV DL, "o"
INT 21H
MOV DL, "r"
INT 21H
MOV DL, "!"
INT 21H
JMP DECRYPT_END
DECRYPT_RESET:
; 重置密钥数组的偏移量为 0
XOR BX, BX
JMP DECRYPT_LOOP
DECRYPT_END:
; 显示解密后的明文
MOV AH, 9
MOV DX, OFFSET STR+MAX_LEN*2+2
INT 21H
; 退出程序
MOV AH, 4CH
INT 21H
CODES ENDS
END START
```
阅读全文