汇编语言问题

程序要求:编写一段程序,能够将一段英文文章中的大写字母变成小写字母,小写字母变成大写字母,并统计出每个字母出现的次数,在屏幕中显示出来,每显示一个字母就发出一声提示音PS... 程序要求:编写一段程序,能够将一段英文文章中的大写字母变成小写字母,小写字母变成大写字母,并统计出每个字母出现的次数,在屏幕中显示出来,每显示一个字母就发出一声提示音
PS:主要是基于Intel8086/8088系列的汇编语言,不过因为软件兼容,其他的微处理器也能用。
这个比较急,麻烦大家帮帮忙,明晚之前就要,分数是大大的
我是帮别人问的,回答我的问题的人,顺便回答http://zhidao.baidu.com/question/127758861.html的同样的问题,如果那个回答被采纳,我这儿的分数也一并送了,谢谢
展开
 我来答
汤旺河边
2009-12-02 · TA获得超过2.9万个赞
知道大有可为答主
回答量:2675
采纳率:0%
帮助的人:2957万
展开全部
; 题目类别:将一段英文文章中的大小写字母互转大小写;统计出每个字母出现的次数,在屏幕显示,每显示一个字母发出一声提示音
; 题目来源: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 ;编译到此结束
做而论道
高能答主

2009-12-02 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.2亿
展开全部

我也写了一个,但是太长,怎么也弄不上去了。

运行后,截屏画面如下:

如果看好了,可以通过邮箱联系。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
蜜蜂小玉米
2009-12-02 · TA获得超过1169个赞
知道小有建树答主
回答量:436
采纳率:0%
帮助的人:0
展开全部
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
不会弄声音,勉强一点吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
_fmlyht
2009-12-02 · TA获得超过2359个赞
知道大有可为答主
回答量:2398
采纳率:0%
帮助的人:1839万
展开全部
DATA SEGMENT
BUFF DB 0FFH,0
DB 100H DUP(0)
COUNT DB 3CH DUP(0)
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX

LEA DX,BUFF
MOV AH,0AH
INT 21H

LEA BX,BUFF
INC BX
ADD BL,[BX]
ADC BH,0
INC BX
MOV BYTE PTR [BX],'$'

MOV AH,2
MOV DX,0A0DH
INT 21H
XCHG DH,DL
INT 21H

MOV BX,OFFSET BUFF + 1
MOV CX,[BX]
PUSH BX
PUSH CX
TRANS: INC BX
XOR BYTE PTR [BX],20H
LOOP TRANS

POP CX
POP SI
LEA DI,COUNT
XOR BX,BX
CONTER: MOV BL,[DI]
SUB BL,'A'
INC BYTE PTR [DI+BX]
LOOP CONTER

LEA BX,COUNT
MOV DL,'A'
CALL DSPCON

MOV BX,OFFSET COUNT + 20H
MOV DL,'a'
CALL DSPCON

MOV AX,4C00H
INT 21H

DSPCON PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
;-----------------------
MOV CX,26
MOV AH,2
DSP: INT 21H
PUSH DX
MOV DL,' '
INT 21H
MOV DL,[BX]
INT 21H
MOV DX,0A0DH
INT 21H
XCHG DH,DL
INT 21H
MOV DL,7
INT 21H
POP DX
INC DL
INC BX
LOOP DSP
;-----------------------
POP DX
POP CX
POP BX
POP AX
DSPCON ENDP

CODE ENDS
END START
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
秒懂百科
2021-04-20 · TA获得超过5.9万个赞
知道大有可为答主
回答量:25.3万
采纳率:88%
帮助的人:1.2亿
展开全部

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式