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.
时间: 2024-10-18 09:16:02