1 data segment
2 str_source db "Hello ** World ** 09aAzZ$"
3 str1 db 20 dup(0) ;大写字母
4 str2 db 20 dup(0) ;小写字母
5 int_caption dw 0 ;大写字母个数
6 int_lower dw 0 ;小写字母个数
7 data ends
8
9 code segment ;设置代码段s
10 assume cs:code,ds:data
11
12 main proc near
13 start:
14 mov ax , data ;初始化ds
15 mov ds , ax
16 mov si , offset str_source ;offset str_source-->si 变址
17 xor ax , ax
18 push ax ;利用堆栈存储str1,str2当前指针
19 push ax ;str1,str2指针入栈
20
21 read_loop:
22 mov al , [si] ;取[si]中的内容,即偏移量
23 cmp al , '$'
24 je exit
25
26 cmp al , 'A'
27 jb loop_next ;<
28 cmp al , 'z'
29 ja loop_next ;>
30 cmp al , 'a'
31 jnl lower_case ;>=
32 cmp al , 'Z'
33 ja loop_next ;>
34
35 pop di ;大写
36 mov str1[di] , al
37 inc di
38 push di
39 inc int_caption
40 jmp loop_next
41 lower_case: ;小写
42 pop bx ;str1指针暂存
43 pop di
44 mov str2[di] , al
45 inc di
46 push di
47 push bx
48 inc int_lower
49 loop_next:
50 inc si
51 jmp read_loop
52
53 exit:
54 pop di ;将str1指针弹栈,切勿在子程序中弹栈-->子程序中为新栈
55 call print_caption
56
57 call print_crlf
58
59 pop di
60 call print_lowercase
61
62 mov ax , 4c00h ;返回DOS
63 int 21h
64 main endp
65
66 print_ax_dec proc near
67 or ax , ax
68 jz zero
69 mov bx , -1 ;余数栈底标志
70 push bx
71 mov bx , 10 ;除数
72
73 repeat: xor dx , dx
74 div bx
75 mov cx , ax ;商
76 or cx , dx
77 jz print_exit ;商与余数全零则结束
78 push dx
79 jmp repeat
80
81 zero: mov dl , 30h
82 mov ah , 02h
83 int 21h
84
85 print_exit:
86 pop dx
87 cmp dx , -1
88 je proc_exit
89 add dx , 30h
90 mov ah , 02h
91 int 21h
92 jmp print_exit
93
94 proc_exit:
95 ret
96 print_ax_dec endp
97 print_caption proc near
98 mov al , '$'
99 mov str1[di],al
100 mov dx , offset str1 ;一定要为dx,偏移地址
101 mov ah , 09h
102 int 21h
103
104 call print_space
105 mov ax , int_caption
106 call print_ax_dec
107 ret
108 print_caption endp
109 print_lowercase proc near
110 mov al , '$'
111 mov str2[di],al
112 mov dx , offset str2 ;一定要为dx,偏移地址为16位
113 mov ah , 09h
114 int 21h
115
116 call print_space
117 mov ax , int_lower
118 call print_ax_dec
119 ret
120 print_lowercase endp
121 print_space proc near
122 mov dl , 20h ;空格
123 mov ah , 02h
124 int 21h
125 ret
126 print_space endp
127 print_crlf proc near
128 mov dl , 0ah ;回车换行
129 mov ah , 02h
130 int 21h
131 mov dl , 0dh
132 mov ah , 02h
133 int 21h
134 ret
135 print_crlf endp
136
137 code ends ;代码段结束
138 end start ;汇编语言源程序结束