编程统计DATA1单元开始存放的20个字符串中英文大写字母个数、小写字母个数,数字0~9的个数,分别放在NA,NB和N1中,并分行以十六进制显示在屏幕上。
编写一个程序,将长度30个的字符串STRING中所有的大写字母转换为小写字母,而保持其他字母不变,然后放回原存储区。
题目要求:使用mov ah,10h;int 21h。不使用mov ah,01h和02h。
使用Masm for Windows集成实验环境进行制作
1,参考gpt
```shell
MOV CX, 20 ; 字符串数量
MOV SI, OFFSET DATA1 ; 数据起始地址
XOR AX, AX ; 清零计数器
XOR BX, BX
XOR DX, DX
LOOP1:
CALL COUNT_LETTERS ; 统计大小写字母数量
CALL COUNT_NUMBERS ; 统计数字数量
ADD SI, 10h ; 跳到下一个字符串的起始位置
LOOP LOOP1
MOV AH, 2 ; 设置输出字符的功能号
MOV DL, 'N' ; 输出"N"字符,表示大写字母数量
INT 21h
MOV AH, 2
MOV DL, ':'
INT 21h
MOV AH, 2
MOV DL, 0 ; 输出大写字母数量的十六进制值
MOV BL, AL
SHR AL, 4
CALL BYTE_TO_HEX
MOV DL, BL
CALL BYTE_TO_HEX
MOV AH, 2
MOV DL, 0dh ; 换行
INT 21h
MOV AH, 2 ; 输出小写字母数量
MOV DL, 'N'
INT 21h
MOV AH, 2
MOV DL, ':'
INT 21h
XOR BL, BL
MOV BL, AH
MOV AH, 0 ; 输出小写字母数量的十六进制值
CALL BYTE_TO_HEX
MOV AH, 2
MOV DL, BL
MOV BL, AL
SHR AL, 4
CALL BYTE_TO_HEX
MOV AH, 2
MOV DL, BL
CALL BYTE_TO_HEX
MOV AH, 2 ; 换行
MOV DL, 0dh
INT 21h
MOV AH, 2 ; 输出数字数量
MOV DL, 'N'
INT 21h
MOV AH, 2
MOV DL, ':'
INT 21h
MOV BL, DL
MOV DL, 0 ; 输出数字数量的十六进制值
MOV AL, DH
CALL BYTE_TO_HEX
MOV AH, 2
MOV DL, BL
MOV BL, AL
SHR AL, 4
CALL BYTE_TO_HEX
MOV AH, 2
MOV DL, BL
CALL BYTE_TO_HEX
MOV AH, 2
MOV DL, 0dh ; 换行
INT 21h
RET
COUNT_LETTERS:
XOR AH, AH
MOV BX, 0 ; 存放字符数量的计数器,清零
COUNT_UPPERCASE: ; 统计大写字母个数
LODSB ; 读取下一个字符,放入 AL,SI 自动加 1
CMP AL, 'A'
JB COUNT_LOWERCASE ; 如果小于 'A'(即已经到了字符串结尾),跳到 COUNT_LOWERCASE 统计小写字母个数
CMP AL, 'Z'
JA COUNT_LOWERCASE ; 如果大于 'Z',跳到 COUNT_LOWERCASE 统计小写字母个数
INC BX ; 如果是大写字母,计数器加 1
JMP COUNT_UPPERCASE ; 继续统计大写字母
COUNT_LOWERCASE: ; 统计小写字母个数
CMP AL, 'a'
JB COUNT_NUMBERS ; 如果小于 'a',跳到 COUNT_NUMBERS 统计数字个数
CMP AL, 'z'
JA COUNT_NUMBERS ; 如果大于 'z',跳到 COUNT_NUMBERS 统计数字个数
INC AH ; 如果是小写字母,计数器加 1
JMP COUNT_LOWERCASE ; 继续统计小写字母
COUNT_NUMBERS: ; 统计数字个数
CMP AL, '0'
JB COUNT_END
CMP AL, '9'
JA COUNT_END
INC DL ; 如果是数字,计数器加 1
JMP COUNT_NUMBERS
COUNT_END:
CMP BX, 0
JE EXIT ; 如果不是大写字母,直接结束
ADD AX, BX ; 如果是大写字母,累加数量到 AX 中
RET
COUNT_NUMBERS:
XOR DH, DH
COUNT_LOOP:
LODSB ; 读取下一个字符,放入 AL,SI 自动加 1
CMP AL, ‘0’
JB COUNT_END ; 如果小于 ‘0’(即已经到了字符串结尾),跳到 COUNT_END 结束计数
CMP AL, ‘9’
JA COUNT_NEXT ; 如果大于 ‘9’,跳到 COUNT_NEXT 继续计数
INC DH ; 如果是数字,计数器加 1
JMP COUNT_LOOP
COUNT_NEXT:
CMP DL, 0
JE EXIT ; 如果不是数字,直接结束
ADD DX, DH ; 如果是数字,累加数量到 DX 中
RET
BYTE_TO_HEX:
CMP AL, 9 ; 检查数字是否小于等于 9
JLE TO_HEX_0_9
ADD AL, 7 ; 如果大于 9,用 A-F 表示
TO_HEX_0_9:
ADD AL, ‘0’ ; 增加字符 ‘0’ 的 ASCII 码,变成 0x30
CMP AL, ‘0’ + 0ah
JB PRINT_HEX ; 如果小于 ‘0’+10,直接输出十六进制数
ADD AL, 0ah
PRINT_HEX:
INT 29h ; 输出 AL 中的字符
RET
EXIT:
JMP EXIT ; 无条件循环,直到调用者用 RET 返回
```