汇编:统计键盘输入的一系列字符中非数字字符的个数送BUF缓冲区

思路:

/*简略版*/
键盘输入一系列字符未知,假设有30个字符
用0AH号功能将输入的字符串送入用户缓冲区。
接着利用CMP指令比较在数字'0''9'之间的字符个数
//用总字符个数减去数字字符个数便是非数字字符的个数
使用自减DEC指令
令DL初始值为总字符数个数,出现一个数字字符便使DL自减1
最后将DL寄存器内容送入BUF缓冲区

/*唠叨版*/
先是数据段,涉及到的数据有:键盘输入的字符串、最后要送到BUF缓冲区的非数字字符的个数。
所以,在对数据段进行定义时,
先在BUF区定义一个字节型的数据,初始值为0
然后因为要输入一串字符,
所以定义一个STRING区存放数据,依次为初始定义的字符数、实际输入的字符数,以及实际存放的字符。

然后就是代码段:将变量进行初始的定义,存放一些待使用的数据,准备之后的使用
首先是用户输入的字符要进行显示,所以要用到0A号的缓冲区显示功能,
然后是将STRING+1位置的内容,即实际输入的字符数放在CL中,
因为LOOP循环会用到CX,所以将CL清零,
DL中存放实际输入的字符。
然后要对输入的字符的进行比较,如果小于0,直接看下一个,如果大于9也直接看下一个字符,只有是数字字符的将DL自减1
一直循环CX次,直至实际字符都比较完成。

汇编源程序:

.486
DATA	SEGMENT USE16				/*数据段伪指令定义,逻辑段采用16位寻址方式*/
BUF		DB	0						/*这个空间是用来存放最后的非字符数的*/
STRING	DB	30						/*STRING单元初始定义30个字节*/
		DB	?						/*实际存储的字符个数*/
		DB	30DUP(?)				/*实际字符存放的位置*/
DATA	ENDS
/*以上为数据段定义*/
CODE	SECMENT	USE16
		ASSUME	CS:CODE,DS:DATA/*ASSUME伪指令通知汇编程序,CODE是代码段,对其寻址是CS寄存器;DS是数据段,对其寻址采用CS寄存器*/
BEG		MOVE	AX,	DATA
		MOVE	DS,	AX				/*数据段初始化*/
		MOV		AH,0AH				/**键盘输入,缓冲区显示字符*/
		MOV		DX,OFFSET	STRING	/*显示的输入字符串*/
		INT		21H
		MOV		CL,STRING+1			/*CL中存放实际字符的个数*/
		MOV		CH,0				/*循环中用不到数字*/
		MOV		DL,CL				/*DL中存的是实际输入的字符的个数*/
		MOV		BX,OFFSET STRING+2	/*BX中取实际输入的字符*/
LAST:	CMP		BYTE PTR [BX],30H	/*将字符与0进行比较*/
		JC		NEXT				/*如果小于0就跳转到NEXT*/
		CMP		BYTE PTR [BX],3AH	/*将字符与10进行比较*/
		JNC		NEXT				/*如果不小于10,即大于等于10就跳转到NEXT*/
		DEC		DL					/*如果在0~9之间就让DL即总字符数自减1,一直比较,最后DL就是非数字字符的个数*/
NEXT:	INC		BX					/*让BX自加1,之后BX寻址取得的就是下一个存储单元的内容*/
		LOOP	LAST				/*然后继续跳转到LAST语句,比较下一字符是不是数字字符*/
		MOV		BUF,DL				/*最后实际输入的字符都比较完之后,将DL中存放的非数字字符数存入BUF单元中*/
		MOV		AH,4CH				/*结束运行的程序*/
		INT		21H
CODE	ENDS
		END		BEG

		
		
		
		

		
		

			
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是使用 x86 汇编语言计算字符串中字母个数的代码: ``` section .data str db 256 ; 存储输入的字符串 len dw 0 ; 存储字符串长度 count dw 0 ; 存储字母个数 section .bss buf resb 256 ; 输入缓冲区 section .text global _start _start: ; 读取输入的字符串 mov eax, 3 ; 系统调用号:read mov ebx, 0 ; 文件描述符:标准输入 mov ecx, buf ; 输入缓冲区地址 mov edx, 256 ; 缓冲区大小 int 0x80 ; 调用系统调用 ; 计算字符串长度 mov esi, buf ; esi 存储字符串地址 mov cx, 0 ; cx 存储计数器,初始化为 0 .loop: cmp byte [esi], 0 ; 检查当前字符是否为字符串结束符 je .done ; 如果是,跳出循环 inc esi ; 指向下一个字符 inc cx ; 计数器加 1 jmp .loop ; 继续循环 .done: mov len, cx ; 将计数器的值存储到 len 中 ; 统计字母个数 mov esi, buf ; esi 存储字符串地址 mov cx, 0 ; cx 存储计数器,初始化为 0 .loop2: cmp byte [esi], 0 ; 检查当前字符是否为字符串结束符 je .done2 ; 如果是,跳出循环 cmp byte [esi], 'a' ; 检查当前字符是否为小写字母 a jl .next ; 如果不是,跳到下一个字符 cmp byte [esi], 'z' ; 检查当前字符是否为小写字母 z jg .next ; 如果不是,跳到下一个字符 inc cx ; 计数器加 1 .next: inc esi ; 指向下一个字符 jmp .loop2 ; 继续循环 .done2: mov count, cx ; 将计数器的值存储到 count 中 ; 输出结果 mov eax, 4 ; 系统调用号:write mov ebx, 1 ; 文件描述符:标准输出 mov ecx, count ; 字母个数 mov edx, 2 ; 输出的字节数 int 0x80 ; 调用系统调用 ; 退出程序 mov eax, 1 ; 系统调用号:exit xor ebx, ebx ; 返回值:0 int 0x80 ; 调用系统调用 ``` 这段代码首先使用系统调用 `read` 从标准输入读取用户输入的字符串,然后使用循环计算字符串的长度并存储到 `len` 变量中。接着,使用另一个循环遍历字符串中的每个字符,如果当前字符是小写字母,则将计数器加 1。最后,使用系统调用 `write` 将字母个数输出到标准输出。最后使用系统调用 `exit` 退出程序。 需要注意的是,这段代码只能处理小写字母,如果需要处理大写字母或者其他字符,需要根据实际情况进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值