Emu8086大小写转换汇编程序故障:无法转换输入字符串字符
Emu8086字符串大小写互换程序修复
你的程序无法正常工作主要有两个核心问题,以下是问题分析和修正后的代码:
问题分析
- 显示逻辑错误:
- 调用DOS 9号功能(字符串显示)时,
lea dx, si是错误用法,该功能要求dx指向字符串的起始内存地址,而非寄存器地址。 - DOS 9号功能要求字符串必须以
$结尾,原程序未添加该结束符,导致显示异常,让你误以为字符没有被转换。
- 调用DOS 9号功能(字符串显示)时,
- 循环终止逻辑不够严谨:
原程序通过判断字符是否为0来终止循环,虽然buffer初始化的空值是0,但更可靠的方式是使用DOS 0Ah功能返回的实际输入字符数来控制循环,避免越界处理无关内存。
修正后的代码
.data buffer db 10, ?, 10 dup('') ; 0Ah输入缓冲区:最大长度、实际长度、字符存储区 end_char db '$' ; 字符串结束符 .code ; 读取输入字符串 mov ah, 0ah lea dx, buffer int 21h ; 初始化寄存器:si指向第一个输入字符,cx存储实际输入长度 mov si, 2 mov cl, [buffer+1] mov ch, 0 convert_loop: mov al, [si] ; 小写转大写 cmp al, 'a' jl check_upper cmp al, 'z' jg check_upper sub al, 32 jmp update_char check_upper: ; 大写转小写 cmp al, 'A' jl next_char cmp al, 'Z' jg next_char add al, 32 update_char: mov [si], al next_char: inc si loop convert_loop ; 根据cx的长度自动循环,直到cx为0 ; 准备显示转换后的字符串 lea dx, buffer+2 mov ah, 9 int 21h ; 程序退出 mov ah, 4ch int 21h
关键修正说明
- 新增
end_char db '$'确保字符串末尾有显示所需的结束符(因为buffer的字符存储区长度是10,输入的字符数最多9,所以end_char会紧跟在输入字符后面)。 - 使用实际输入长度(存在
buffer+1)作为循环计数器,通过loop指令控制循环,逻辑更严谨。 - 修正显示时的
dx指向,改为lea dx, buffer+2直接指向输入字符的起始地址。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

