You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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í

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 06:05:03