汇编语言 分支循环

题目:

编写程序,实现如下功能
1)采用01号DOS功能调用,接受用户输入的字符串,并在程序中对字符串进行长度检查,若长度大于9,则要求用户重新输入;
2)用户在指定位置号时,进行判断,若输入非法(位置号大于实际字符串长度),则提示用户重新输入;若输入位置合法,则显示字符串中该位置号对应的字符。
3)统计用户输入的字符串中特定字符的数目并显示,可先指定特定字符进行统计,然后再由用户指定字符进行统计。

样例:

在这里插入图片描述

代码:

注释写在代码里面了(现在的代码还有一点点小问题,后面会进行更改的)

DATA SEGMENT
	STR1 DB 'Please input a string(length<9): $'
	STR2 DB 'Please input the index of the char to display: ','$'
	STR3 DB 'The char is: ','$'
	STR4 DB 'Please input a char: ','$'	
	STR5 DB 'The count of is: ','$'
	STR7 DB 'The string is to long!',0AH,0DH,'$'
	STR8 DB 'The index is invalid!',10,13,'$'
	CRLF DB 0AH,0DH,'$'   ;换行
	INPUT  DB 20,?,20 dup(?)
	INDEX DB 1 DUP(?)
	INPUTCHAR DB 1 DUP(?)
	COUNT DB 1 DUP(?)
DATA ENDS
CODE SEGMENT 
ASSUME CS:CODE,DS:DATA
START:
	MOV AX,DATA
	MOV DS,AX
	
	;这下面LOOP1、X1、X2是一个整体,实现了功能一
	MOV CX,1
LOOP1:
	LEA DX,STR1 ;显示STR1
	MOV AH,9
	INT 21H
	
	LEA DX,INPUT;输入字符串
	MOV AH,0AH
	INT 21H
	
	MOV BX,DX   
	ADD BX,1  
	MOV AL,[BX] ;将字符串真实长度存放在AL中
	MOV AH,0
	CMP AX,9
	JA X1
	JMP X2
	LOOP LOOP1
	
X1: 
	LEA DX,CRLF ;换行
	MOV AH,9
	INT 21H
	
	LEA DX,STR7 ;显示STR7
	MOV AH,9
	INT 21H
	JMP LOOP1
	
X2:
	LEA DX,CRLF ;换行
	MOV AH,9
	INT 21H                
	
	
	;LOOP2、X3、X4是一个整体实现了功能二
	MOV CX,1
LOOP2:
	LEA DX,STR2 ;显示STR2
	MOV AH,9
	INT 21H
	
	MOV AH,1   ;接收index
	INT 21H
	SUB AL,30H ;因为接收到是一个字符,比如你输入一个8,这里就会得到'8'的ASCII码,38H,要想得到真实的数字8则减去30H
	MOV AH,0
	MOV SI,AX  ;SI存放index真实值
	
	LEA BX,INPUT ;相当于MOV BX,OFFSET INPUT
	ADD BX,1  
	MOV AL,[BX]  ;将字符串真实长度存放在AL中,其实这一步上面已经做过了,可以直接定义一个变量然后把长度放入变量中
	MOV AH,0
	
	CMP SI,AX  ;比较输入的index和字符串的长度
	JA X3      ;如果index大于length则跳转到X3,X3就是提示错误信息,再跳转回该循环
	JMP X4	   ;否则跳转到X4,输出index位置的字符
	LOOP LOOP2

X3:
	LEA DX,CRLF ;换行
	MOV AH,9
	INT 21H
	
	LEA DX,STR8 ;显示STR8
	MOV AH,9
	INT 21H
	JMP LOOP2
	
X4:
	LEA DX,CRLF ;换行
	MOV AH,9
	INT 21H
	
	MOV CL,[SI+BX];这也就是为什么要把index存入SI的原因,作为变址寄存器
	;现在index位置的字符保存于CL中
	
	LEA DX,STR3;显示STR3
	MOV AH,09H
    INT 21H
	
	MOV DL,CL;输出index位置字符
    MOV AH,02H
    INT 21H
	
	LEA DX,CRLF ;换行
	MOV AH,9
	INT 21H
	
	
	;后面部分实现功能三
	LEA DX,STR4;显示STR4
	MOV AH,09H
    INT 21H
	
	MOV AH,1;接收INPUTCHAR
	INT 21H
	MOV INPUTCHAR,AL

	
	LEA DX,INPUT;
	MOV BX,DX
	ADD BX,1  
	MOV AL,[BX] 
	MOV AH,0;将字符串真实长度存放在AX中
	
	MOV CX,AX  ;将字符串真实长度放入CX中,循环字符串长度次数
	MOV SI,1
	MOV COUNT,0
	
LOOP3:
	MOV DH,[SI+BX] ;DH存放index+字符串首地址 的字符,每循环一次index++
	CMP DH,INPUTCHAR
	JZ X5;如果index个字节+字符串首地址所指的字符和inputchar相等,则跳到X5,使COUNT++,记住要使CX-1,这样剩余的循环次数才会减少
	ADD SI,1;否则直接将index++
	LOOP LOOP3
	
	JMP X6;循环结束了,为了跳过X5,在这加了个跳转语句,因为汇编代码是顺序执行的,除非遇到跳转指令
	
X5:
	ADD COUNT,1
	ADD SI,1
	sub CX,1
	JMP LOOP3
   
X6:
	LEA DX,CRLF ;换行
	MOV AH,9
	INT 21H
	
	LEA DX,STR5;显示STR5
	MOV AH,09H
    INT 21H
	
	ADD COUNT,30H;很好理解了,因为上面已经说过了,你要把数字转换成它对应的ASCII码输出
	
	MOV AH,2;输出COUNT
	MOV DL,COUNT
	INT 21H
	
	MOV AX,4C00H
	INT 21H
CODE ENDS
END START

如果有错误,欢迎指正啊,感谢你的观看!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

开心星人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值