主题:今晚编到12点的程序结果不理想请帮修改!!!!!!!!!
我的汇
[专家分:10] 发布于 2006-04-16 00:28:00
这个程序是从键盘输入一字符串
然后把大写换成小写,小写换成大写
然后显示出来:
不过我的这个程序结果不理想帮修改一下,谢谢了
谢谢!!
DATA SEGMENT
instr db 80
db ?
db 80 dup(0) ;输入缓冲区
input db 'please input string:$';输入提示
DATA ENDS ;数据S
STACK SEGMENT
dw 200 dup(0) ;初始化堆栈大小为100
STACK ENDS
CODE SEGMENT
assume cs:CODE, ds:DATA, ss:STACK
start: mov ax, data
mov ds, ax
next: mov dx, offset input ;显示提示输入
mov ah,9
int 21H
lea dx,instr ;开始输入字符串
mov ah,10
int 21H
mov bl,instr+1
mov bh,0
mov byte ptr instr+2[bx],'$'
lea bx,instr+2 ;instr的偏移地址
loopgo: mov dl,[bx] ;开始转换字符串
cmp dl,'$'
je exit
cmp dl,'a'
jb gobig
cmp dl,'z'
ja gobig
sub dl,20H ;转换为小写
jmp disp ;跳到显示
gobig: add dl,20H ;转换为大写
disp: mov ah,2 ;显示字符
int 21h
inc bx
jmp loopgo
exit: mov ax, 4c00h ;程序结束,返回到操作系统系统
int 21h
code ENDS
END start
回复列表 (共4个回复)
沙发
pigtwo [专家分:0] 发布于 2006-04-16 10:14:00
我看了一眼,你的算法有点问题,好像你接受了字符之后要先判断它是大写还是小
板凳
我的汇 [专家分:10] 发布于 2006-04-16 11:32:00
[quote]我看了一眼,你的算法有点问题,好像你接受了字符之后要先判断它是大写还是小[/quote]
你这不是等于没说吗
能不能帮我修改呀!
3 楼
Runking [专家分:370] 发布于 2006-04-16 12:35:00
DATA SEGMENT
inst db 80
db ?
db 80 dup(0) ;输入缓冲区
input db 'please input string:$';输入提示
DATA ENDS ;数据S
STACK SEGMENT
dw 200 dup(0) ;初始化堆栈大小为100
STACK ENDS
CODE SEGMENT
assume cs:CODE, ds:DATA, ss:STACK
start: mov ax, data
mov ds, ax
next: mov dx, offset input ;显示提示输入
mov ah,9
int 21H
lea dx,inst ;开始输入字符串
mov ah,10
int 21H
mov bl,inst+1
mov bh,0
mov byte ptr inst+2[bx],'$'
lea bx,inst+2 ;instr的偏移地址
loopgo: mov dl,[bx] ;开始转换字符串
cmp dl,'$'
je exit
cmp dl,'a'
jb gobig
sub dl,20H ;转换为小写
jmp disp ;跳到显示
gobig: add dl,20H ;转换为大写
disp: mov ah,2 ;显示字符
int 21h
inc bx
jmp loopgo
exit: mov ax, 4c00h ;程序结束,返回到操作系统系统
int 21h
code ENDS
END start
可以了。instr好像是关键字吧,在我这不能编译。显示的时候别忘了换行,这样清楚些
4 楼
carefree001 [专家分:10] 发布于 2006-04-17 20:44:00
这个没写到内存里,也没写提示信息,清屏也没有,虽然长了点,但结构不算很乱吧。
CODE SEGMENT ;The program has only code seg
ASSUME CS:CODE
MAIN PROC FAR
FLAG DB 0 ;initialize the vaule
START:
MOV AX,CODE
MOV DS,AX
CALL IN_PUT ;procdure input char
CALL COMP ;procdure compara char,return flag parameter
CMP FLAG,1 ;1 means unproper
JE START
CMP FLAG,2 ;2 means caps letter
JE ADD20
CMP FLAG,3 ;3 means small letter
JE SUB20
SUB20: SUB AL,20H ;transition the char
JMP DIS_CH
ADD20: ADD AL,20H
JMP DIS_CH
DIS_CH: CALL DISP ; to display
JMP START ; continue
MAIN ENDP
;_________________
; input the ASCII char
; out parameter:AL
;_________________
IN_PUT PROC NEAR
MOV AH,7 ;to get the char and not display on the screen
INT 21H ; CALL DOS
RET
IN_PUT ENDP
;___________________
;procdure compara
;purpose: to compara the char is whether between 'a' and 'z'
;or betwween 'A'and 'Z'
;return the flag to judge
;return DOS if the char is 'ESC'
;__________________
COMP PROC NEAR
CMP AL,1BH ;ESC to return
JE OVER
CMP AL,'A' ;char < 'A' is ill
JB ILLEGAL
CMP AL,'Z' ;'Z'>= char >= 'A' is CAPleter
JBE C_LETTER
CMP AL,'z' ; char > 'z' is ill
JNBE ILLEGAL
CMP AL,'a' ;'a'<= char <= 'z' is SMALL leter
JNB S_LETTER
ILLEGAL:MOV DL,1 ; to set FLAG
JMP EXIT
C_LETTER: MOV DL,2
JMP EXIT
S_LETTER: MOV DL,3
JMP EXIT
EXIT: MOV FLAG,DL
RET
OVER: MOV AH,4CH
INT 21H
COMP ENDP
;____________________
;DISP: to display a char in DL reg on the screen
;
;____________________
DISP PROC NEAR ;display the char which in the DL reg
MOV DL,AL ;send the char to DL register
PUSH AX ;save reg
MOV AH,2
INT 21H
POP AX ;restore
RET
DISP ENDP
CODE ENDS
END START
我来回复