用汇编语言实现英文字符大小写转换

要求:从键盘接收一个字符(串),若为大写字母,则转换为其对应的小写字母并显示;若是小写字母,则转换为其对应的大写字母并显示
另外:当为A-Z与a-z以外的字符时,回车后,显示出错信息。

CRLF MACRO
MOV AH,02H
MOV DL,0DH
INT 21H
MOV AH,02H
MOV DL,0AH
INT 21H
ENDM

DATA SEGMENT
MESS1 DB 'Capital letter translated to small letter-----press 1',0DH,0AH ;大写转小写
DB 'Small letter translated to capital letter-----press 2',0DH,0AH ;小写转大写
DB 'return to DOS-----prss 3',0DH,0AH,'$' ;返回DOS
MESS2 DB 'Please input letter,then press enter to tanslate!',0DH,0AH,'$'
MARK DB ?
BUF DB 82 DUP(?)
DATA ENDS

STACK SEGMENT stack
STA DB 50 DUP(?)
TOP EQU LENGTH STA
STACK ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
A PROC NEAR
START: MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,STACK ;段寄存器和堆栈初始化
MOV SS,AX
MOV SP,TOP
MOV BX,OFFSET BUF
WWW: CRLF
MOV DX,OFFSET MESS1 ;显示提示信息
MOV AH,09H
INT 21H
CRLF
MOV BX,OFFSET BUF
III: MOV AH,01H ;接收输入数
INT 21H
CMP AL,'3'
JE OOO
JMP NEXT1
NEXT1: CMP AL,'1'
JNE NEXT2
JMP GGG
NEXT2: CMP AL,'2'
JE SSS
JMP III
OOO: MOV AH,4CH ;返回DOS
INT 21H
GGG: CRLF
MOV DX,OFFSET MESS2 ;显示提示信息
MOV AH,09H
INT 21H
L1: MOV AH,01H ;等待输入
INT 21H
CMP AL,0DH ;结果以回车结束,显示
JE SHOW
CMP AL,41H
JB L2
CMP AL,5AH
JA L2
ADD AL,20H ;转换为小写
L2: MOV [BX],AL
INC BX
JMP L1

SSS: CRLF
MOV DX,OFFSET MESS2 ;显示提示信息
MOV AH,09H
INT 21H
L3: MOV AH,01H
INT 21H
CMP AL,0DH ;结果以回车结束,显示
JE SHOW
CMP AL,61H
JB L4
CMP AL,7AH
JA L4
SUB AL,20H ;转换为大写
L4: MOV [BX],AL
INC BX
JMP L3
SHOW: MOV AL,24H
INC BX
MOV [BX],AL
MOV DX,OFFSET BUF
MOV AH,09H ;显示结果
INT 21H
CRLF
JMP WWW
A ENDP
CODE ENDS
END START
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-05-05
直接比较 大于"A"且下于"Z",则就转小写。或大于"a"且下于"z",则转大写,不必要ASCII码比,这种还简单,若不在那范围就打印语句就OK。
用JC,JG,这种指令就解决问题。追问

请给予完整代码,需可执行

第2个回答  推荐于2018-03-30
DATAS SEGMENT
msg db 'error$' ;此处输入数据段代码
DATAS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
mov ah,1
int 21h
cmp al,'a'
jb err
cmp al,'z'
ja err
sub al,32
mov dl,al
mov ah,2
int 21h

MOV AH,4CH
INT 21H
err:
lea dx,msg
mov ah,09h
int 21h
mov ah,4ch
int 21h

CODES ENDS
END START本回答被提问者和网友采纳
相似回答