汇编语言问题
;标题来源:/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;斯特林缓冲区。
代码结束
结束开始;这是编译的结尾