回 帖 发 新 帖 刷新版面

主题:今晚编到12点的程序结果不理想请帮修改!!!!!!!!!

这个程序是从键盘输入一字符串
然后把大写换成小写,小写换成大写
然后显示出来:
不过我的这个程序结果不理想帮修改一下,谢谢了
谢谢!!
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个回复)

沙发

我看了一眼,你的算法有点问题,好像你接受了字符之后要先判断它是大写还是小

板凳

[quote]我看了一眼,你的算法有点问题,好像你接受了字符之后要先判断它是大写还是小[/quote]
你这不是等于没说吗
能不能帮我修改呀!

3 楼

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 楼

这个没写到内存里,也没写提示信息,清屏也没有,虽然长了点,但结构不算很乱吧。


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   

我来回复

您尚未登录,请登录后再回复。点此登录或注册