汇编程序打印大小写字母:过滤冗余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
相关产品推荐
相关产品推荐

