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

汇编语言实现字符串大写转换及显示的问题求助

汇编语言字符串大写显示实现方案及代码修复

核心实现逻辑

要实现字符串转大写显示,核心逻辑如下:

  • DOS系统下调用int 21h的09h功能输出字符串时,默认以$作为结束标记,所以可以直接遍历到$停止,不需要固定长度
  • 小写字母的ASCII范围是61h`7Ah`,对应大写字母的ASCII范围是`41h`5Ah,二者差值为20h,只要将小写字母的ASCII值减去20h(或和DFh做按位与运算)即可完成转换

你当前代码的问题

  • 转换逻辑反向:你判断字符在41h~5Ah(大写字母范围)时执行异或20h操作,会把大写转成小写,和你的需求完全相反
  • 起始位置偏移错误:lea bx, coname+1跳过了字符串第一个字符,导致首字符不会被处理
  • 固定遍历长度不合理:你设置cx=15,但你的coname字符串实际长度远大于15,会导致后半段字符没有被转换
  • 寄存器使用不规范:用ah存储读取的字符,后续调用中断功能也会用到ah存功能号,属于易引发bug的编码习惯,建议改用al存储字符

修复后可运行代码

.model small    
.code    

org 100h        

begin: jmp a10main

coname db 'LAseR-12 SYstEMS XXX ','$'
            
a10main proc near
    lea bx, coname   ; 从字符串首地址开始遍历
a20:    
    mov al, [bx]
    cmp al, '$'      ; 遇到结束符就停止遍历
    je output
    cmp al, 61h      ; 小于a的ASCII不处理
    jb a30
    cmp al, 7Ah      ; 大于z的ASCII不处理
    ja a30
    and al, 0DFh     ; 清除第5位转大写,等价于sub al,20h
    mov [bx], al            
a30:    
    inc bx
    jmp a20

output:
    mov ah, 09h
    lea dx, coname
    int 21h

    mov ax, 4c00h
    int 21h
       
a10main endp    
end begin

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:45:08