用汇编语言统计字符串中a-z每个字符的个数 在线等 急 100

 我来答
曾经吹散的记忆
推荐于2017-12-15 · TA获得超过1603个赞
知道小有建树答主
回答量:1344
采纳率:37%
帮助的人:388万
展开全部
*********************************************************************************
程序将输出从键盘输入的字符,并显示出相同的字符及相同字符的个数。
*********************************************************************************

注x8086的数组起始0还是1,我记不清了,我是按0算的,根据你的情况看嘛......

DATA SEGMENT 数据段开始
BUFFER DB 100 定义BUFFER数据第1个数据DB类型,且值为100
DB ? 定义1空的DB类型。
DB 100 DUP(?) 定义100个DB类型的数据,初始化
CHARS DB 'INPUT:$' 定义字符串"INPUT:"以$为结束标识
DATA ENDS 数据段结束

CODE SEGMENT 代码段
ASSUME CS:CODE,DS:DATA 段代码声明CS
MAIN PROC FAR 定义"MAIN"函数

***************************************************
PUSH DS 将数据段地址堆栈
SUB AX,AX 清零AX,AX=0
PUSH AX 将AX入栈,实际将压入0堆栈中
MOV AX,DATA 把数据段起始地址放入AX中
MOV DS,AX 初始化DS(数据段地址)
********以上是固定的,又叫程序的初始化数据段*******

START: MOV DX,OFFSET CHARS 取CHARS的字符首地址放入DX中
MOV AH,9 将9号DOS中断功能号,放入AH中,用于显示DX所存的字符串
INT 21H 调用21号中断
********以上用于显示"INPUT:"字符串**********

MOV DX,OFFSET BUFFER 取CHARS的字符首地址放入DX中
MOV AH,0AH 将0A号DOS中断功能号,用于从键盘缓冲输入,并保存DX所存的地址中
INT 21H 调用21号中断
********以上用于从键盘缓冲中输入到BUFFER中,输入的东西将放入BUFFER中*************

MOV DL,0AH 把“换行符”放入DL中
MOV AH,2 02号功能,将从DL中输出一个字符
INT 21H 调用21号中断
*******以上用于换行1,输出换行符**********
MOV DL,0DH 把“回车符”放入DL中
MOV AH,2 02号功能,将从DL中输出一个字符
INT 21H 调用21号中断
*******以上用于换行2,输出回车符**********
*******上两用于换行*******

MOV SI,OFFSET BUFFER 把从键盘输入的字符,BUFFER地址给SI
INC SI 指向第二个字符
MOV AL,[SI] 放入AL
INC SI 指向下一个字符
MOV DL,[SI] SI指向的下一个字符给DL
MOV DH,[SI] 同时给DH
MOV DI,SI DI指向BUFFER的第三个字符
MOV CL,AL CL=AL=BUFFER[1]=100
MOV CH,0 CH=0
MOV BL,1 BL=1
MOV BH,0 BH=0
DEC CL CL减1
GO1: INC SI SI指向下一个字符
CMP DL,[SI] 比较BUFFER[i]与BUFFER[i+]是否相等
JNE TO1 不相等转到TO1
INC BL 如果相等BL将加1
TO1: LOOP GO1 循环CX-1,转到GO1
************以上函数遍历BUFFER中所有字符,并将与BUFFER[1]相同的字符的个数放入BL中,**************

CALL OUTPUT 调用OUTPUT,输出我们能看懂的十位数,显示出来

MOV BL,1 BL=1
TO5: INC DI DI+1,批向下一个地址,DI指向BUFFER第四个字符了
DEC AL AL减1,第一次是AL=99
CMP AL,1 和1比较
JE TO3 如果是1转到TO3
CMP DH,[DI] 和DH字符比较,BUFFER[1]是否相等
JE TO5 如果相等就回到TO5
MOV DL,[DI] 如果不相等的话,将DI指向的字符放入DL中,
MOV SI,DI SI=DI放入SI
MOV CL,AL CL=AL
MOV CH,0 CH=0,CX=CL
DEC CL CL=CL-1
GO2: INC SI 指向下一个字符
CMP [SI],DL 和DL字符比较,BUFFER[1]是否相等
JNE TO2 如果相等就回到TO2
INC BL 相同时BL=BL+1
MOV [SI],DH 将相同的字符放入SI中
TO2: LOOP GO2 CL=CL-1
CALL OUTPUT 显示相同的字符个数
MOV BL,1 BL重新计算,初始化为,因为本身就是一个字符,如果有一个相同就应该有2个相同字符了
JMP TO5 跳到TO5

TO3: CMP DH,[DI] 当AL=1,循环结束以后,将跳到这里来
JE TO4 如果DH这时与DI里地址里所放的值相同,那么就结束。
MOV DL,[DI] 否则[DI]放入DL中
MOV BL,1 给BL为1,因为这时,就只有一个字符了,没有与他相同的字符了。
CALL OUTPUT 把字符个数输出.
TO4: RET
MAIN ENDP

;--------------------------
OUTPUT PROC 自定义函数
PUSH AX //
PUSH CX //
PUSHF //保存现场

MOV AH,2 调用DOS功能号02,将DL中的内容输出,即BUFFER[1]输出
INT 21H 调用INT 21中断

MOV DL,20H “空格”的ASCII码
MOV AH,2 调用DOS功能号02,将DL中的“空格”输出
INT 21H

MOV AL,BL AL=BL,相同字符次数
MOV AH,0 AX=AL
MOV CL,10 CL=10
DIV CL AX=AX/CL=AL/10=BL/10,AL中为商,AH中为余数
ADD AH,30H AH=AH+30,将数字转换成对应ASCII
ADD AL,30H AL=AL+30,将商转换成对应的ASCII码
MOV CH,AH CH放入余数的ASCII码
******************以上是将BL转换成十进制数***********
MOV DL,AL DL放入商的ASCII码
MOV AH,2 调用DOS功能号02,将DL中的AL商值输出,,,实际是重复次数的十位数
INT 21H
*****输出十位数****
MOV DL,CH
MOV AH,2
INT 21H
******输出个位数****
MOV DL,0AH
MOV AH,2
INT 21H
*******以上用于换行1,输出换行符**********
MOV DL,0DH
MOV AH,2
INT 21H
*******以上用于回车2,输出回车符**********

POPF //恢复现场
POP CX //
POP AX //恢复现场
RET //返回
OUTPUT ENDP
CODE ENDS
END MAIN
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式