汇编语言编程,接收从键盘输入的字符,以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 展开
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 展开
2个回答
展开全部
问题非常多:
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
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
展开全部
有些小问题。可以实现输入若干字符直到^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
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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询