汇编语言问题

;题目类别:将一篇英文文章中的大小写字母转换成大小写字母;计算每个字母出现的次数,显示在屏幕上,并为每个显示的字母发出提示音。

;标题来源:/question/question/127760427 . html

;程序说明:

;1.提示输入不超过254个字符的英文文章;

;2.统计每个字母出现的次数,把大写字母和小写字母作为不同的字母区别对待(非字母字符不算),同时大小写字母相互转换。

;3、根据不同的字母和次数,振铃;

;4.显示转换后的英文文章。

;该程序在MASMPlus 1.2的集成环境下编译调试,运行正确。

代码段

假设CS:Code,DS:Code

;-

;函数:显示指定地址的字符串(Str_Addr)

;入口:

;Str_Addr= =字符串地址(数据段中需要)

;用法:输出字符串地址

;用法示例:Output PromptStr

输出宏字符串地址

lea dx,Str _地址

mov ah,9

int 21h

EndM

;-

;功能:输出一个字符。

;条目:dl=要显示的字符

Output_Chr proc附近

推斧

mov ah,02h

int 21h

爆破筒

浸水使柔软

输出_Chr endp

;-

;功能:输出回车和换行

输出_CTLF进近

推斧

推送dx

mov ah,02h

mov dl,0dh

int 21h

mov dl,0ah

int 21h

流行dx

爆破筒

浸水使柔软

输出_CTLF endp

;-

;功能:将AX中的二进制无符号数转换成显式的十进制ASCII码,并发送到显示屏上显示。

;条目:AX=二进制数

;退出:在当前光标位置显示转换后的ASCII码。

Dec_ASCII Proc附近

推送ds

推送cs

流行数码相机

推送cs

流行元素

推送dx

推动bx

推di

mov bx,10

lea di,@@Temp_Save[6]

mov字节指针[di],' $ '

十二月二日

cld

@@Divide: xor dx,dx

分部bx

或dl,30h

mov [di],dl

十二月二日

测试ax,0ffffh

jnz @ @除

公司di

推di

流行dx

mov ah,9

int 21h

波普迪

pop bx

流行dx

流行数码相机

浸水使柔软

@@Temp_Save db 7 dup(?)

Dec_ASCII EndP

;-

;功能:找出指定的字母是否出现,统计出现的次数。

;入口参数:AL=指定的字母。

静态_字母前进接近

推送cx

推动bx

mov bx,Letter _ Table出现的信件及其时间和地址。

mov cx,字母;出现的不同字母的数量。

jcxz @ @第一次

@@Find_Letter: cmp al,[bx]

jnz $+7

inc字节ptr[bx][1];计数1次

jmp @ @ Finded是,计数1次,返回。

公司bx

公司bx

loop @@Find_Letter

@@First_Time: mov [bx],al;第一次出现,添加统计。

mov字节ptr [bx][1],1;计数1次

inc字母;出现的不同字母的数量+1

@@Finded: pop bx

流行cx

浸水使柔软

静态_字母Endp

;-

;功能:延迟指定的时钟滴答。

;入口:

;Didas=时钟滴答(1秒滴答18.2次,10秒滴答182次。如果延迟不是10秒的几倍,误差稍大)

延迟前进接近

推送dx

推送cx

异或ax,ax

int 1ah

电影cs:@@Times,dx

mov cs:@@Times[2],cx

Read_Time:异或ax,ax

int 1ah

子dx,cs:@ @次

sbb cx,cs:@@Times[2]

cmp dx,Didas

jb读取时间

流行cx

流行dx

浸水使柔软

@@Times dw 0,0

延迟结束

;-

迪达斯= 3;时钟滴答作响

信_表dw?;出现的信件及其时间和地址。

字母dw 0;出现的不同字母的数量。

Prompt_Str db '请输入一个字符串:',13,10,' $ '

“按下db 7,13,10,13,10,”原告抱怨道。按任意键退出...$'

;-

开始:推送cs

流行数码相机

推送cs

流行元素

输出Prompt _ Str英文文章提示

lea dx,缓冲区;英语文章字符串缓冲区地址

啊,0ah

int 21h

调用Output _ CTLF;输出回车、换行符

lea si,Buffer[1];实际输入地址的字符数

cld

lodsb读这个数字

mov di,si

电影cl,al

异或ch,ch

添加di、cx

inc di出现的信件及其时间和地址。

mov字母_表,di;保存此地址

翻译:lodsb读一个字符

mov ah,al

或者啊,20h用小写字母处理

cmp啊,' a '

jb Next _ One不是字母,没有转换。

cmp ah,' z '

ja Next _ One不是字母,没有转换。

调用Statics _ Letter找出指定的字母是否出现,并计算出现的次数。

xor al,20h关键说明:小写到大写,大写到小写

mov [si-1],al;写回到原来的位置

下一个:循环翻译

mov字节ptr [si],' $ ';用' $ '替换回车

mov cx,字母;出现的不同字母的数量。

mov si,Letter _ Table出现的信件及其时间和地址。

disp _ Letter:lodsw;读一个单词

mov dl,al;出现的字母

调用Output _ Chr显示一个字符

移动dl,':'

调用Output_Chr

mov dl,7;环形字符码

调用Output_Chr

异或运算

xchg al,ah;AX=字母出现的次数。

调用Dec _ ASCII将AX中的二进制无符号数转换成显式的十进制ASCII码,并发送到显示屏上显示。

通话延迟;延迟六分之一秒

呼叫输出_CTLF

循环显示字母

呼叫输出_CTLF

输出缓冲器[2];输出转换后的文章。

;-

Exit_Proc:输出Press _ Key提示操作完成,按任意键结束程序。

mov ah,1

int 21h

mov ah,4ch结束程序

int 21h

缓冲数据库255;斯特林缓冲区。

代码结束

结束开始;这是编译的结尾