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
修正说明
- 新增
got_offset变量明确区分两个输入阶段,先完成偏移量的存储再处理字符加密,避免逻辑混淆。 - 将偏移量存储变量
offset初始化为0,正确承接用户输入的偏移数值。 - 拆分偏移量读取和字符加密的流程,逻辑更清晰,避免重复读取错误数据。
- 添加了大写字母的循环处理(可自行扩展小写字母逻辑),防止偏移后超出字母ASCII范围。
- 每次读取输入后都重置对应状态寄存器,确保下一次输入能被正确识别。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

