汇编语言实现字符串大写转换及显示的问题求助
汇编语言字符串大写显示实现方案及代码修复
核心实现逻辑
要实现字符串转大写显示,核心逻辑如下:
- 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
相关产品推荐
相关产品推荐

