急~急~急~汇编语言程序设计题目

程序要求 编写一段程序能够将一段英文文章中的大写字母变成小写字母 小写字母变成大写字母 并统计初每个字母出现的次数 在屏幕中显示出来 每显示一个字母就发出一声提示音
谢谢各位大虾了
明天晚上之前 各位大虾 急啊 是基于Intel8086/8088系列的汇编语言 不是什么C一类的
最好还带一点简单的注释 标明每块程序的用途

; 题目类别:将一段英文文章中的大小写字母互转大小写;统计出每个字母出现的次数,在屏幕显示,每显示一个字母发出一声提示音
; 题目来源:http://zhidao.baidu.com/question/127760427.html
; 程序使用说明:
; 1、提示输入不超过254个字符的一段英文文章;
; 2、统计每个字母出现的次数,区别对待大写字母与小写字母视为不同的字母(非字母字符不统计),同时,大小写字母互转
; 3、显示不同字母及其出现的次数,振铃一声;
; 4、显示转换后的英文文章
; 本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。
Code Segment
Assume CS:Code,DS:Code
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -------------------------------------
; 功能:输出一个字符
; 入口:dl=要显示的字符
Output_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
Output_Chr endp
; -------------------------------------
; 功能:输出回车换行
Output_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Output_CTLF endp
; -------------------------------------
; 功能:把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
; 入口:AX=二进制数
; 出口:在当前光标位置显示转换后的ASCII码数字
Dec_ASCII Proc Near
push ds
push cs
pop ds
push cs
pop es
push dx
push bx
push di
mov bx,10
lea di,@@Temp_Save[6]
mov BYTE ptr [di],'$'
dec di
cld
@@Divide: xor dx,dx
div bx
or dl,30h
mov [di],dl
dec di
test ax,0ffffh
jnz @@Divide
inc di
push di
pop dx
mov ah,9
int 21h
pop di
pop bx
pop dx
pop ds
ret
@@Temp_Save db 7 dup(?)
Dec_ASCII EndP
; -------------------------------------
; 功能:查找指定字母是否出现并统计出现次数
; 入口参数:AL=指定的字母
Statics_Letter proc Near
push cx
push bx
mov bx,Letter_Table ;出现过的字母及其次数地址
mov cx,Letters ;出现过的不同字母的数目
jcxz @@First_Time
@@Find_Letter: cmp al,[bx]
jnz $+7
inc BYTE ptr [bx][1] ;计数1次
jmp @@Finded ;出现过,计数1次后返回
inc bx
inc bx
loop @@Find_Letter
@@First_Time: mov [bx],al ;第一次出现,加入统计表
mov BYTE ptr [bx][1],1 ;计数1次
inc Letters ;出现过的不同字母的数目+1
@@Finded: pop bx
pop cx
ret
Statics_Letter Endp
; -------------------------------------
; 功能:延时指定的时钟嘀嗒数
; 入口:
; Didas=时钟嘀嗒数(1秒钟约嘀嗒18.2次,10秒钟嘀嗒182次。若延时不是秒的10数次倍,误差稍微大点)
Delay Proc Near
push dx
push cx
xor ax,ax
int 1ah
mov cs:@@Times,dx
mov cs:@@Times[2],cx
Read_Time: xor ax,ax
int 1ah
sub dx,cs:@@Times
sbb cx,cs:@@Times[2]
cmp dx,Didas
jb Read_Time
pop cx
pop dx
ret
@@Times dw 0,0
Delay EndP
; -------------------------------------
Didas = 3 ;时钟嘀嗒数
Letter_Table dw ? ;出现过的字母及其次数地址
Letters dw 0 ;出现过的不同字母的数目
Prompt_Str db 'Please input a string:',13,10,'$'
Press_Key db 7,13,10,13,10,'The complated. Press any key to exit...$'
; -------------------------------------
Start: push cs
pop ds
push cs
pop es
Output Prompt_Str ;提示输入英文文章
lea dx,Buffer ;英文文章字符串缓冲区地址
mov ah,0ah
int 21h
call Output_CTLF ;输出一个回车、换行
lea si,Buffer[1] ;实际输入的字符数地址
cld
lodsb ;读取这个数目
mov di,si
mov cl,al
xor ch,ch
add di,cx
inc di ;出现过的字母及其次数地址
mov Letter_Table,di ;保存这个地址
Translate: lodsb ;读取一个字符
mov ah,al
or ah,20h ;按小写字母处理
cmp ah,'a'
jb Next_One ;不是字母,不转换
cmp ah,'z'
ja Next_One ;不是字母,不转换
call Statics_Letter ;查找指定字母是否出现并统计出现次数
xor al,20h ;关键指令:小写转换大写,大写转小写
mov [si-1],al ;写回原位
Next_One: loop Translate
mov BYTE ptr [si],'$' ;用'$'替换回车符
mov cx,Letters ;出现过的不同字母的数目
mov si,Letter_Table ;出现过的字母及其次数地址
Disp_Letter: lodsw ;读入一个字
mov dl,al ;出现过的字母
call Output_Chr ;显示一个字符
mov dl,':'
call Output_Chr
mov dl,7 ;响铃字符码
call Output_Chr
xor al,al
xchg al,ah ;AX=字母出现的次数
call Dec_ASCII ;把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
call Delay ;延时六分之一秒
call Output_CTLF
loop Disp_Letter
call Output_CTLF
Output Buffer[2] ;输出转换后的文章
; -------------------------------------
Exit_Proc: Output Press_Key ;提示操作完成,按任意键结束程序
mov ah,1
int 21h
mov ah,4ch ;结束程序
int 21h
Buffer db 255 ;字符串缓冲区
Code ENDS
END Start ;编译到此结束
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-12-02
assume cs:code
assume ds:data
data segment
db "I love you.$"
data ends

code segment
start:
mov ax,data
mov ds,ax
mov bx,0
s0:
;check $
mov al,ds:[bx]
cmp al,36
je s13

cmp al,64
ja s1
jmp s8

s1:
cmp al,91
jb s2
jmp s8

s2:
;upcase to lowcase
add al,32
mov ds:[bx],al
jmp se

s8:
cmp al,96
ja s10
jmp se

s10:
cmp al,123
jb s11
jmp se

s11:
;lowcase to upcase
sub al,32
mov ds:[bx],al
jmp se

se:
;next char
inc bx
jmp s0

s13:
;print
mov dx,0
mov ah,9
int 21h

;good exit
mov ax,4c00h
int 21h
code ends
end start
声音还是不会弄
第2个回答  2016-03-19
呵呵,可以看看:

http://blog.163.com/asm_c/blog/static/24820311320124171490517/

要比楼主的满意答案,要好的多。
第3个回答  2009-12-03
fbbxcBxc
FBBXCbXC
第4个回答  2009-12-02
C#
相似回答