MASM32中基于凯撒密码修改键盘输入字符串字符的实现问题
凯撒密码汇编实现方案
你现有代码的核心问题:
- 仅完成了字符与偏移量的加法,但没有处理输出逻辑,所以程序运行后看不到结果
- 未考虑凯撒密码的循环规则(比如
z+1应回到a) - 若偏移量
m是键盘输入的ASCII字符(比如输入1实际对应0x31),需要先转成数值再计算
以下是完整的实现思路和代码示例(以DOS下的8086汇编为例):
步骤1:处理输入的偏移量
键盘输入的数字是ASCII码,需减去0x30转换为实际数值:
mov ah, 01h ; DOS中断:读取键盘输入(带回显) int 21h sub al, 30h ; ASCII码转数值 mov [m], al ; 保存偏移量到变量m
步骤2:字符转换与循环逻辑
以小写字母为例,转换后若超出z(0x7A),需减去26回到字母范围开头:
movzx eax, byte ptr [a] ; 读取待转换字符a movzx ebx, byte ptr [m] ; 读取偏移量m add al, bl ; 字符加偏移量 ; 处理循环:超出'z'则回绕 cmp al, 7Ah jle skip_wrap sub al, 26 skip_wrap: mov [result], al ; 保存转换后的字符
步骤3:输出转换结果
通过DOS中断输出最终字符:
mov ah, 02h ; DOS中断:输出单个字符 mov dl, [result] int 21h
完整示例代码
stack segment stack dw 512 dup(?) stack ends data segment a db 'z' ; 待转换字符,可改为从键盘输入 m db ? ; 偏移量存储变量 result db ? ; 转换结果存储变量 data ends code segment start: mov ax, data mov ds, ax ; 输入偏移量 mov ah, 01h int 21h sub al, 30h mov [m], al ; 凯撒密码转换逻辑 movzx eax, byte ptr [a] movzx ebx, byte ptr [m] add al, bl cmp al, 'z' jle output sub al, 26 ; 输出结果 output: mov dl, al mov ah, 02h int 21h ; 程序退出 mov ah, 4Ch int 21h code ends end start
补充说明
- 若支持大写字母,只需将判断条件改为
cmp al, 'Z',超出后同样减26 - 若待转换字符
a也需要从键盘输入,可在偏移量输入前添加一段与输入偏移量逻辑相同的字符读取代码
内容的提问来源于stack exchange,提问作者27 Phạm Trần Minh Trí
相关产品推荐
相关产品推荐

