[汇编] 大小写转换

 

  1 data segment       
  2     ;定义字符串缓冲区
  3     ;MAXLEN 表示允许输入的最大字符数量
  4     ;ACTLEN 表示实际输入的数量
  5     ;STR 用于存储输入的字符串
  6     ;以下面为例,允许最大输入5个字符,如果STR后面的长度也定义为5,则实际输入的字符数量仅为4,
  7     ;因为最后一个字符会用于存储0Dh(回车符号)
  8     ;例如:输入"1234",然后回车,此时内存的情况为: 05 00 31 32 33 34 0D
  9     ;因此,为了满足实际的最大数量,通常将MAXLEN定义得比实际的多1个。       
 10     MAXLEN db 6         ;允许最大长度
 11     ACTLEN db 0         ;实际长度
 12     STR dw 6 dup('')    ;存放字符串
 13     ;提示语句
 14     PROMPT1 db 0DH,0AH,"Please input a string:$"
 15     PROMPT2 db 0DH,0AH,"Your string is :$" 
 16     CHOOSE  db 0DH,0AH,"chose 1 or 2:$"     
 17 ends
 18 
 19 code segment
 20 start:
 21     ;设置数据段寄存器
 22     mov ax, data
 23     mov ds, ax 
 24 input:
 25     ;提示输入,提示语句位于ds:dx处 
 26     lea dx, CHOOSE
 27     mov ah, 9
 28     int 21h  
 29     mov ah,01H  ;输入跳转
 30     int 21h
 31     cmp al,31H   
 32     mov dl,0AH 
 33     mov ah,02H
 34     int 21h
 35     mov dl,0DH 
 36     mov ah,02H
 37     int 21h
 38     jz  tosmall
 39     jmp tobig
 40 tosmall: 
 41     call input_str 
 42     mov si,0;指针
 43     mov cl,ACTLEN;循环次数
 44     mov ch,0
 45     call tosmall_print
 46     jmp next 
 47 tobig:
 48     call input_str
 49     mov si,0;指针
 50     mov cl,ACTLEN;循环次数
 51     mov ch,0
 52     call tobig_print
 53     jmp next 
 54 next:    
 55     JMP input
 56     ;返回操作系统 
 57     mov ax, 4c00h
 58     int 21h    
 59 ends  
 60 ;---------------------
 61 tosmall_print proc near 
 62     ;输出结果的提示语句
 63     lea dx,PROMPT2
 64     mov ah, 9
 65     int 21h 
 66 xunhuan1:
 67     mov ax,STR[si]
 68     cmp al,5BH
 69     jnb  nochange 
 70     add ax,20H
 71 nochange:
 72     mov dl,al
 73     mov ah,02H
 74     int 21H
 75     inc     si          ;加1不影响cf
 76     loop xunhuan1
 77     ret
 78 tosmall_print endp
 79 ;---------------------      
 80 tobig_print proc near 
 81     ;输出结果的提示语句
 82     lea dx,PROMPT2
 83     mov ah, 9
 84     int 21h 
 85 xunhuan2:
 86     mov ax,STR[si]
 87     cmp al,5BH
 88     jnb  nochange2 
 89     add ax,20H
 90 nochange2: 
 91     sub ax,20H
 92     mov dl,al
 93     mov ah,02H
 94     int 21H
 95     inc     si          ;加1不影响cf
 96     loop xunhuan2
 97     ret
 98 tobig_print endp
 99 ;---------------------
100 input_str proc near
101     ;调用AH=0ah的21H中断程序,获取输入的字符串;
102     ;(ds:dx)=缓冲区最大字符数 
103     ;(ds:dx+1)=实际输入字符数
104     ;ds:dx=缓冲区首址
105     lea dx,MAXLEN
106     mov ah,0ah
107     int 21h
108     
109     ;取得实际输入的字符串数目
110     mov bl,ACTLEN
111     mov bh,0 
112     ;将结尾处改为'$'以便调用AH=09H功能,即输出刚输入的字符串
113     mov STR[bx],'$'
114     ret    
115     
116     lea dx, PROMPT1
117     mov ah, 9
118     int 21h
119     ret
120 input_str endp
121 ;------------------------
122 end start ; set entry point and stop the assembler.

 

posted @ 2014-05-15 22:10  beautifulzzzz  阅读(2445)  评论(0编辑  收藏  举报