汇编语言字符串输入打印、大小写转换及输入长度限制问题求助
8086汇编小写转大写功能问题修复方案
修改后的完整代码
org 100h BEGIN: LEA DX, DASH1 MOV AH, 9 INT 21H LEA DX,LOWERCASE MOV AH,09H INT 21H LEA SI, STR_RAW ; SI指向原始字符串缓冲区 LEA DI, STR_UPPER ; DI指向大写字符串缓冲区 XOR CX, CX ; CX清零,作为输入计数器 MOV AH,01H READ: INT 21H MOV BL,AL CMP AL,0DH JE DISPLAY INC CX ; 有效字符,计数器+1 MOV [SI], AL ; 先存原始字符到原始缓冲区 XOR AL,20H ; 转大写 MOV [DI], AL ; 大写字符存到大写缓冲区 INC SI INC DI CMP CX, 5 ; 判断是否达到最大输入长度5 JE DISPLAY ; 达到长度直接结束输入 JMP READ DISPLAY: MOV AL,"$" MOV [SI],AL ; 原始缓冲区加结束符 MOV [DI],AL ; 大写缓冲区加结束符 LEA DX,UPPERCASE MOV AH,09H INT 21H LEA DX, STR_RAW ; 打印原始小写字符串 MOV AH, 09H INT 21H MOV DL, 20H ; 输出空格 MOV AH, 02H INT 21H LEA DX, UPPERCASE_ MOV AH, 9 INT 21H MOV DL, 20H ; 输出空格 MOV AH, 02H INT 21H LEA DX,STR_UPPER ; 打印转换后的大写字符串 MOV AH,09H INT 21H LEA DX, DASH2 MOV AH, 9 INT 21H MOV AH,4CH INT 21H ret LOWERCASE DB 0DH,0AH,0AH, " Input a 5-letter string: $" UPPERCASE DB 0DH,0AH, " The uppercase equivalent of $" UPPERCASE_ DB "is $" DASH1 DB 0AH,0DH, " ================================================================= $" DASH2 DB 0AH,0AH,0DH, " ================================================================= $" STR_RAW DB 255 DUP(?) ; 原始小写字符串缓冲区 STR_UPPER DB 255 DUP(?) ; 转换后大写字符串缓冲区
具体修改说明
- 新增两个独立缓冲区:
STR_RAW存储用户输入的原始小写字符串,STR_UPPER存储转换后的大写字符串,避免转换操作覆盖原始输入内容 - 新增输入长度控制逻辑:使用
CX作为输入计数器,初始值为0,每次输入非回车的有效字符后计数器自增,计数达到5时自动终止输入,满足最大长度限制要求 - 调整输入存储逻辑:先将用户输入的原始字符存入
STR_RAW,再执行转大写操作存入STR_UPPER,两份数据独立存储互不干扰 - 修复原代码空格打印错误:原代码使用未初始化的
BH寄存器值作为空格输出,替换为直接使用空格的ASCII码20H,避免输出乱码 - 调整打印逻辑:输出提示语后先打印
STR_RAW的原始小写内容,再打印STR_UPPER的转换后大写内容,匹配预期输出格式
内容的提问来源于stack exchange,提问作者hatzuramen
相关产品推荐
相关产品推荐

