[汇编] 大小写转换

 

复制代码
  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 @   beautifulzzzz  阅读(2473)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示