题目:
编写程序,实现如下功能
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
如果有错误,欢迎指正啊,感谢你的观看!