如何修改8085微处理器汇编代码以实现正确的大小写转换?
8085汇编代码错误排查与修正
代码中的错误点
- 跳转逻辑完全颠倒:
CPI 41h后用JNC notuppercase,意思是只要字符≥'A'就跳走不处理,这和预期相反——我们需要跳过的是**小于'A'**的字符,应该改为JC notuppercase(当A < 'A'时,CPI会产生进位,触发JC跳转)。CPI 5Ah后用JC notuppercase,意思是只要字符≤'Z'就跳走,同样颠倒逻辑——应该跳过**大于'Z'**的字符,改为JNC notuppercase(当A > 'Z'时,CPI无进位,触发JNC跳转)。
- 处理单个字符后直接终止程序:转换完大写字母后执行
JMP final,会导致程序只处理第一个字符就停止,忽略剩余的字符计数。需要删掉这条跳转,让处理完的字符也执行地址递增和计数判断逻辑。 - HL寄存器对递增方式错误:用
INR H+INR L递增地址,无法处理L从FFh溢出到00h时H的进位,应该用INX H指令直接递增HL寄存器对,保证地址计算正确。 - 冗余指令:
MVI B, 0指令完全未被使用,属于无效代码,可删除。
修正后的代码
MOV C, A ; 把文本长度存入C寄存器 nextchar: MOV A, M ; 读取当前地址的字符到A CPI 41h ; 与'A'比较 JC notuppercase; 字符小于'A',跳过转换 CPI 5Ah ; 与'Z'比较 JNC notuppercase; 字符大于'Z',跳过转换 ADI 32 ; 大写转小写,加32(ASCII差值) MOV M, A ; 把转换后的字符写回内存 notuppercase: INX H ; 递增HL地址,指向下一个字符 DCR C ; 剩余字符计数减1 JNZ nextchar ; 计数不为0,继续循环 final: HLT ; 程序终止
说明
修正后代码的执行逻辑:
- 从HL指向的内存地址逐个读取字符。
- 判断字符是否在'A'-'Z'范围内:
- 不在范围内则直接跳转到地址递增步骤。
- 在范围内则执行加32的转换操作,写回内存。
- 递增HL地址,减少剩余计数,计数不为0则继续循环处理下一个字符,直到所有字符处理完毕后终止程序。
内容的提问来源于stack exchange,提问作者Liuzili
相关产品推荐
相关产品推荐

