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

Emu8086大小写转换汇编程序故障:无法转换输入字符串字符

Emu8086字符串大小写互换程序修复

你的程序无法正常工作主要有两个核心问题,以下是问题分析和修正后的代码:

问题分析

  • 显示逻辑错误:
    • 调用DOS 9号功能(字符串显示)时,lea dx, si是错误用法,该功能要求dx指向字符串的起始内存地址,而非寄存器地址。
    • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:40:16