给一份不会报错的 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 将一个指定字符串Text进行循环移位加密。每个单字符的密钥(-7~7)保存在数组Key中。程序运行过程:显示明文,显示所产生的密文,显示解密后的明文。例如key = {-2,2,1,0,-1},其中负数表示循环左移,正数表示循环右移,0不变,数字 表示移动的位数 dosbox运行时输出乱码,经过检查发现在定义字符串时忘记在后面加上$字符
时间: 2024-02-18 13:00:36 浏览: 207
汇编程序从键盘输入数据并显示
4星 · 用户满意度95%
下面是一份不会报错的代码:
```
DATAS SEGMENT
Text DB 'Hello, world!$'
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, DATAS
MOV DS, AX
; 加密
MOV SI, 0 ; SI 指向 Text
MOV CX, 0 ; CX 用于循环计数
MOV BX, 0 ; BX 用于保存 Key 中的当前密钥
Loop1:
CMP Text[SI], 0 ; 判断是否到了字符串结尾
JE EndLoop1
MOV BL, Key[CX] ; 获取当前密钥
ADD CX, 1 ; CX 加 1
CMP CX, 5 ; 判断是否到了 Key 数组的末尾
JG ResetCX1
MOV DL, Text[SI] ; 获取当前字符
ADD DL, BL ; 加上密钥
MOV AH, DL ; AH 保存加密后的字符
MOV DL, 7 ; 移动 7 位,相当于除以 2 的 7 次方
AND AH, DL ; 取后 1 个字节
MOV Text[SI], AH ; 替换原来的字符
INC SI ; SI 加 1
JMP Loop1
ResetCX1:
MOV CX, 0 ; 重置 CX
JMP Loop1
EndLoop1:
; 显示密文
MOV SI, 0 ; SI 指向 Text
MOV AH, 09H ; 调用 DOS 21H 中的 09H 功能
Loop2:
CMP Text[SI], 0 ; 判断是否到了字符串结尾
JE EndLoop2
MOV DL, Text[SI] ; 获取当前字符
INT 21H ; 显示字符
INC SI ; SI 加 1
JMP Loop2
EndLoop2:
MOV DL, 0DH ; 显示换行符
INT 21H
MOV DL, 0AH
INT 21H
; 解密
MOV SI, 0 ; SI 指向 Text
MOV CX, 0 ; CX 用于循环计数
MOV BX, 0 ; BX 用于保存 Key 中的当前密钥
Loop3:
CMP Text[SI], 0 ; 判断是否到了字符串结尾
JE EndLoop3
MOV BL, Key[CX] ; 获取当前密钥
ADD CX, 1 ; CX 加 1
CMP CX, 5 ; 判断是否到了 Key 数组的末尾
JG ResetCX3
MOV DL, Text[SI] ; 获取当前字符
SUB DL, BL ; 减去密钥
MOV AH, DL ; AH 保存解密后的字符
MOV DL, 7 ; 移动 7 位,相当于除以 2 的 7 次方
AND AH, DL ; 取后 1 个字节
MOV Text[SI], AH ; 替换原来的字符
INC SI ; SI 加 1
JMP Loop3
ResetCX3:
MOV CX, 0 ; 重置 CX
JMP Loop3
EndLoop3:
; 显示解密后的明文
MOV SI, 0 ; SI 指向 Text
MOV AH, 09H ; 调用 DOS 21H 中的 09H 功能
Loop4:
CMP Text[SI], 0 ; 判断是否到了字符串结尾
JE EndLoop4
MOV DL, Text[SI] ; 获取当前字符
INT 21H ; 显示字符
INC SI ; SI 加 1
JMP Loop4
EndLoop4:
MOV AH, 4CH
INT 21H
CODES ENDS
END START
```
阅读全文