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

WASP环境下凯撒密码实现问题:偏移量无法正确保存仅偏移1位

凯撒密码偏移量保存失败的问题排查与修复

问题根源分析

  • 偏移量变量初始化错误:原代码中switch: DC.W 0xF5把变量初始值设为0xF5(十进制245),完全不是你需要的初始偏移量,应该设为0来存储用户输入的偏移数值。
  • 未区分偏移量与字符输入阶段:代码一开始就盲目读取输入状态存偏移量,且后续循环没有判断是否已经获取过偏移量,导致每次输入字符时都用错误的初始值,偏移逻辑完全混乱。
  • 输入读取逻辑混乱:初始读取偏移量时没有等待输入完成,且每次循环未正确重置寄存器状态,导致偏移计算错误。

修正后的代码

// 存储用户输入的偏移量,初始值为0
offset: DC.W 0
// 标记是否已获取偏移量:0=未获取,1=已获取
got_offset: DC.W 0

start:
// 第一阶段:读取并保存偏移量
wait_offset:
MOV AX, [0xF5]  // 读取输入状态寄存器
CMP AX, 0x0
JEQ wait_offset // 输入未就绪则等待
MOV AX, [0xF3]  // 读取输入的偏移量数值
MOV [offset], AX // 保存到offset变量
MOV AX, 0x0
MOV [0xF5], AX  // 重置输入状态
// 标记已获取偏移量,进入字符处理阶段
MOV AX, 0x1
MOV [got_offset], AX

// 第二阶段:读取字符并应用凯撒偏移
wait_char:
MOV AX, [0xF5]
CMP AX, 0x0
JEQ wait_char
MOV BX, [0xF3]  // 读取待加密字符
MOV AX, 0x0
MOV [0xF5], AX  // 重置输入状态

// 输入0则结束程序
CMP BX, 0x0
JEQ end

// 应用偏移量
MOV AX, [offset]
ADD BX, AX

// 可选:处理大写字母循环(防止偏移后超出Z)
CMP BX, 0x5A  // 0x5A是大写Z的ASCII码
JLE write_output
SUB BX, 0x1A  // 减去26,回到字母起始范围

write_output:
// 等待控制台输出就绪
wait_console_ready:
MOV AX, [0xF2]
CMP AX, 0x0
JNE wait_console_ready
MOV [0xF0], BX  // 输出加密后的字符
MOV AX, 0x0
MOV [0xF2], AX  // 重置控制台状态

JMP wait_char // 继续处理下一个字符

end:
HALT

修正说明

  1. 新增got_offset变量明确区分两个输入阶段,先完成偏移量的存储再处理字符加密,避免逻辑混淆。
  2. 将偏移量存储变量offset初始化为0,正确承接用户输入的偏移数值。
  3. 拆分偏移量读取和字符加密的流程,逻辑更清晰,避免重复读取错误数据。
  4. 添加了大写字母的循环处理(可自行扩展小写字母逻辑),防止偏移后超出字母ASCII范围。
  5. 每次读取输入后都重置对应状态寄存器,确保下一次输入能被正确识别。

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 12:22:19