汇编语言编程,接收从键盘输入的字符,以CTR+C 结束,并将其中的小写字母转变为大写字母,然后在屏幕上显示

你们看我写的对吗?DATASEGMENTMESS1DB'INPUT:',13,10,'$'MESS2DB'OUTPUT:',13,10,'$'BUFDB20BUF1DB?... 你们看我写的对吗?
DATA SEGMENT
MESS1 DB 'INPUT: ',13,10,'$'
MESS2 DB 'OUTPUT:',13,10,'$'
BUF DB 20
BUF1 DB ?
BUF2 DB 20 DUP(?)
COUNT EQU $-BUF
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV SI,0
LEA DX,MESS1
MOV AH,09H
INT 21H
MOV DX,OFFSET BUF
MOV AH,0AH
INT 21H
MOV CX,COUNT

LOOP1:MOV AL,BUF[SI]
CMP AL,61H
JBE NEXT
CMP AL,7AH
JGE NEXT
SUB AL,20H
MOV BUF[SI],AL

NEXT: INC SI
LOOP LOOP1
LEA DX,MESS1
MOV AH,09H
INT 21H
MOV DX,OFFSET BUF
MOV AH,09H
INT 21H
MOV AX,4CH
INT 21H
CODE ENDS
END START
展开
 我来答
帐号已注销
2012-10-17 · TA获得超过3000个赞
知道大有可为答主
回答量:1338
采纳率:75%
帮助的人:1286万
展开全部
问题非常多:
1. 首先题目就有问题,不可能“接收从键盘输入的字符,以CTR+C 结束”。对于命令提示符来说,按下CTRL+C,就会强行退出这个程序,所以不可能以CTRL+C结束的。应该是按回车结束输入。
2. DATA里有中文标点符号。
3. 输入字符后,按下回车,在C语言里运行的时候会自动换行,但是在汇编里不会,所以你要自己换行。
4. 用MOV AH, 0AH; INT 21H中断输入后,输入的有效字符数存放在BUF1单元里,所以循环的时候应该把CX设置为BUF1单元里的值,而不是COUNT
5. 输入的有效字符从BUF2单元开始存储,所以做大小写转换的时候,应该从BUF2单元开始,而不应该从BUF单元开始
6. 61H和7AH都是小写字母,所以跳转指令中不应该有E。同时,有符号、无符号不要混用,所以JBE改为JB,JGE改为JA。
7. 输入字符时,是以回车符作为结束;而输出字符时,是以'$'作为结束,所以对输入的字符,你要把最后一个回车符转为‘$'。
修改后的程序如下:
DATA SEGMENT
MESS1 DB 'INPUT: ',13,10,'$'
NEWLINEDB 13, 10, '$' ;这行是专门用来换行的
MESS2 DB 'OUTPUT:',13,10,'$'
BUF DB 20
BUF1 DB ?
BUF2 DB 20 DUP(?)
COUNT EQU $-BUF
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV SI, 0
LEA DX,MESS1
MOV AH,09H
INT 21H
MOV DX,OFFSET BUF
MOV AH,0AH
INT 21H

LEA DX, NEWLINE ;专门用来换行
MOV AH, 9
INT 21H

MOV CL, BUF1
MOV CH, 0 ;BUF1单元中存放的是有效输入字符数

LOOP1:MOV AL,BUF2[SI] ;从BUF2单元开始才是有效字符
CMP AL,61H
JB NEXT ;JBE改为JB
CMP AL,7AH
JA NEXT ;JGE改为JA
SUB AL,20H
MOV BUF2[SI],AL ;从BUF2单元开始才是有效字符

NEXT: INC SI
LOOP LOOP1
MOV BUF2[SI], '$' ;循环结束,把当前的字符修改为'$'

LEA DX,MESS2
MOV AH,09H
INT 21H

MOV DX,OFFSET BUF2 ;从BUF2单元开始才是有效字符
MOV AH,09H
INT 21H

MOV AH,4CH
INT 21H
CODE ENDS
END START
庆珈蓝容01L
2012-10-17 · TA获得超过142个赞
知道答主
回答量:69
采纳率:100%
帮助的人:92.2万
展开全部
有些小问题。可以实现输入若干字符直到^c,只是需要使用01H功能调用。下面是改正后的程序:
DATA SEGMENT
MESS1 DB 'INPUT: ',13,10,'$'
MESS2 DB 'OUTPUT:',13,10,'$'
BUF2 DB 80 DUP(?)
COUNT EQU $-BUF
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV SI,0
LEA DX,MESS1
MOV AH,09H
INT 21H
MOV BX,OFFSET BUF2
MOV CX,0
NEXT1:
MOV AH,01H
INT 21H
CMP AL,03H ;CTRL+C
JE NEXT2
INC CX
MOV [BX],AL
INC BX
JMP NEXT1
NEXT2:
MOV AL,BUF2[SI]
CMP AL,61H
JB NEXT3
CMP AL,7AH
JG NEXT3
SUB AL,20H
MOV BUF2[SI],AL

NEXT3: INC SI
LOOP NEXT2
MOV BUF2[SI],'$'
LEA DX,MESS2
MOV AH,09H
INT 21H
MOV DX,OFFSET BUF2
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式