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

汇编程序打印大小写字母:过滤冗余ASCII字符及CX值修正问题

如何打印全部大小写字母(A-Z、a-z)?

我编写的汇编代码虽能输出A-Z和a-z,但会包含不需要的中间ASCII字符,需要对其进行过滤。正常程序中CX应设置为52。

我的原代码:

ORG 100h       
MOV AX,0B800H  
MOV DS,AX
MOV BX,0000    ;SET BX REGISTER
MOV CX, 58      ;USED AS A COUNTER 
MOV AL,'A'
MOV AH,0x0E
MOV DL, 41h  
CMP AX, DX
JG UPPERCASE 

UPPERCASE:
    ADD DL, 1
    CMP DX, 5Bh
    JG LOWERCASE
    JMP BACK
    
LOWERCASE:
    ADD DL, 1
    CMP DX, 60h
    JG BACK
    JL UPPERCASE

HLT

BACK:
  MOV [BX],AX
  ADD AL,1
  ADD AH,1
  ADD BX,2
  LOOP UPPERCASE

问题分析

原代码逻辑冗余,用DX做的判断完全没必要,而且CX设为58导致循环次数过多,同时大写Z到小写a之间的非字母字符(ASCII 91-96)会被错误输出,跳转逻辑没正确跳过这些字符。

修改后的代码

ORG 100h       
MOV AX, 0B800H  
MOV DS, AX
MOV BX, 0000    ; 指向显存起始位置
MOV CX, 52      ; 计数器:26个大写字母+26个小写字母=52次循环
MOV AL, 'A'     ; 起始字符为大写A
MOV AH, 0x07    ; 显存属性:黑底白字(保留原代码的0x0E也可,对应黑底黄字)

PRINT_LOOP:
  MOV [BX], AX  ; 将字符和属性写入显存
  ADD BX, 2     ; 显存每个字符占2字节,偏移量加2
  INC AL        ; 字符ASCII值自增1
  CMP AL, 'Z' + 1 ; 判断是否写完所有大写字母
  JNE CONTINUE
  MOV AL, 'a'   ; 大写字母写完后,直接切换到小写字母起始'a',跳过中间非字母字符
CONTINUE:
  LOOP PRINT_LOOP ; 循环直到CX计数器为0

HLT

关键修改点

  • 将CX设置为52,正好对应26个大写+26个小写字母的总数,避免多余循环
  • 直接控制字符范围:先输出'A'到'Z',写完后立刻将AL设为'a',跳过了Z到a之间的非字母ASCII字符([、\、]、^、_、`)
  • 简化了逻辑,去掉冗余的DX寄存器判断和复杂跳转,代码更易读且逻辑清晰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:35:17