汇编 统计字符串大小写字母,数字,其他字符个数并输出到屏幕(简单实现,含详细注释)

第一步:
创建一个index.txt文件(命名随你);
编辑代码:

DATA SEGMENT
	STRING DB 'AAAaaa123456???$'
	SMALL DB 30H
	BIG DB 30H
	NUM DB 30H
	OTHER DB 30H
DATA ENDS
;----------------------------------
CODE SEGMENT
	ASSUME CS:CODE, DS:DATA
START:
	MOV AX,DATA
	MOV DS,AX
	MOV CX,15      ;循环15次
	LEA BX,STRING     ;存储字符串首地址
LOP:
	MOV AL,[BX]
	CMP AL,'a'      ;与'a'比较(这里需用字符对应ASCII码)
	JB B1          ;如果小于’a’跳转到b1
	CMP AL,'z'  
	JA B1          ;如果大于’z’跳转b1
	INC SMALL    ;不跳转(即在a-z之间)小写字母+1
	JMP B4
B1:
	CMP AL,'A' 
	JB B2          ;如果小于’A’跳转b2
	CMP AL,'Z'
	JA B2          ;如果大于’Z’跳转b2
	INC BIG    ;大写字母+1
	JMP B4
B2:
	CMP AL,'0'
	JB B3          ;如果小于’0’跳转b3
	CMP AL,'9'
	JA B3          ;如果大于’9’跳转b3
	INC NUM    ;数字+1
	JMP B4
B3:
	INC OTHER    ;其它字符+1
B4:
	INC BX         ;取下一个字符
	LOOP LOP       ;循环
	
	MOV AH,02H;屏幕显示大写字母个数
	MOV DL,BIG
	INT 21H

	MOV AH,02H;屏幕显示小写字母个数
	MOV DL,SMALL
	INT 21H

	MOV AH,02H;屏幕显示数字个数
	MOV DL,NUM
	INT 21H

	MOV AH,02H;屏幕显示其它字符个数
	MOV DL,OTHER
	INT 21H

	MOV AH,4ch;返回
	INT 21H

CODE ENDS
	END START

第二步:
将文件后缀名改为asm(即index.asm)
dos下编译文件:
在这里插入图片描述
链接文件:
在这里插入图片描述
最后执行exe文件:
在这里插入图片描述
正确输出

  • 17
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
好的,这是一个比较复杂的问题。这里提供一个简单实现思路,仅供参考。具体实现需要考虑很多细节,例如输入的字符串长度限制、排序算法、输出格式等等。 首先,需要通过 BIOS 中断 16h 的 00h 功能获取用户输入的字符串。具体实现可以参考以下汇编代码: ``` input_string: mov ah, 0 ; 读取键盘输入 int 16h ; 调用 16h 中断 cmp al, 0Dh ; 如果输入回车键,则结束输入 je end_input mov [si], al ; 将输入的字符存入字符串中 inc si ; 字符串指针加一 jmp input_string end_input: mov [si], 0 ; 字符串结束符 ``` 接下来,需要遍历字符串,找出其中的数字字符,并进行排序。可以通过循环遍历字符串,并使用 ASCII 码进行判断。具体实现可以参考以下汇编代码: ``` sort_numbers: mov cx, 0 ; 数字计数器清零 mov di, str ; 字符串指针指向开头 loop_start: mov al, [di] ; 获取当前字符 cmp al, 0 ; 如果到了字符串结尾,则结束循环 je end_loop cmp al, '0' ; 如果当前字符数字字符,则将其存入数字数组中 jb continue_loop cmp al, '9' ja continue_loop mov [numbers+cx], al inc cx continue_loop: inc di ; 字符串指针加一 jmp loop_start end_loop: ; 在这里进行数字排序 ``` 最后,需要将排序后的数字字符输出屏幕上。可以通过循环遍历数字数组,并使用 BIOS 中断 10h 的 0Eh 功能输出字符。具体实现可以参考以下汇编代码: ``` output_numbers: mov cx, 0 ; 数字计数器清零 mov si, numbers ; 数字指针指向开头 output_loop: cmp cx, num_count ; 如果遍历完所有数字,则结束循环 je end_output mov al, [si] ; 获取当前数字 mov ah, 0Eh ; 设置输出字符的功能号 int 10h ; 调用 10h 中断输出字符 inc si ; 数字指针加一 inc cx ; 数字计数器加一 jmp output_loop end_output: ``` 以上代码仅仅是一个简单实现思路,实际的实现需要考虑很多细节。如果你需要更具体的帮助,可以提出具体的问题,我会尽力帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leisure-ZL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值