Code Segment
Assume CS:Code,DS:Code
; -----------------------------------------
; 功能:顯示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在數據段)
; 用法: Output Str_Addr
; 用法舉例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -----------------------------------------
; 功能:輸出回車換行
Enter_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Enter_CTLF endp
; -----------------------------------------
; 功能:統計小寫字母個數
; 入口:SI=字符串地址
; 出口:BL=小寫字母個數
Stitics proc Near
push cx
push ax
lodsb ;讀入實際輸入的字符個數
mov cl,al
xor ch,ch
xor bl,bl ;計數器清零
@@Stitics: lodsb ;讀入壹個字符
cmp al,'a'
jb $+8
cmp al,'z'
ja $+4
inc bl ;是小寫字母,計數
loop @@Stitics
pop ax
pop cx
ret
Stitics Endp
; -----------------------------------------
; 功能:把AX中的二進制無符號數轉換成顯式的十進制ASCII碼,並送顯示屏顯示
; 入口:AX=二進制數
; 出口:在當前光標位置顯示轉換後的ASCII碼數字
Dec_ASCII Proc Near
push dx
push bx
push di
mov bx,10
lea di,@@Temp_Save[6]
mov byte ptr [di],'$'
dec di
cld
@@Divide: xor dx,dx
div bx
or dl,30h
mov [di],dl
dec di
test ax,0ffffh
jnz @@Divide
inc di
push di
pop dx
mov ah,9
int 21h
pop di
pop bx
pop dx
ret
@@Temp_Save db 7 dup(?)
Dec_ASCII EndP
; -----------------------------------------
Prompt_Str1 db 'Please input the first string: $'
Prompt_Str2 db 'Please input the second string: $'
Yes_nO db 'yes.$no.$'
String_Equ db 7,7,7,'Two string equal: $'
DownCases db 'The downcase alphabets: $'
Longer db 'The longer: $'
Start: push cs
pop ds
push cs
pop es ;使數據段、附加段與代碼段同段
Output Prompt_Str1 ;提示輸入第壹個字符串
lea dx,String1
mov ah,0ah
int 21h
call Enter_CTLF ;輸出壹個回車、換行
Output Prompt_Str2 ;提示輸入第壹個字符串
lea dx,String2
mov ah,0ah
int 21h
call Enter_CTLF ;輸出壹個回車、換行
call Enter_CTLF ;輸出壹個回車、換行
cld
Output String_Equ ;提示字符串是否相等
lea si,String1[1] ;第壹個字符串實際輸入字符個數
lodsb ;讀入這個數字
lea di,String2[1] ;第二個字符串實際輸入字符個數
cmp al,[di] ;字符個數相等?
jnz No_Equal1 ;字符個數不等,則不等,顯示:no.
mov cl,al
xor ch,ch
inc di
repe cmpsb ;字符個數相等,看每個字符是否相同
jz $+12; 相等,看兩個字符串的英文小寫字母個數是否相同
No_Equal1: Output Yes_nO[5] ;兩個字符串不相等,顯示:no.
jmp $+10
Output Yes_nO ;兩個字符串相等,顯示:yes.
call Enter_CTLF ;輸出壹個回車、換行
Output DownCases ;提示小寫字母個數是否相等
lea si,String1[1] ;第壹個字符串實際輸入字符個數
call Stitics ;統計小寫字母個數
mov bh,bl ;暫存String1小寫字母個數
lea si,String2[1] ;第二個字符串實際輸入字符個數
call Stitics ;統計小寫字母個數
cmp bh,bl ;小寫字母個數相等?
jz $+12 ;相等,顯示:yes.
Output Yes_nO[5] ;兩個字符串不相等,顯示:no.
jmp $+10
Output Yes_nO ;兩個字符串相等,顯示:yes.
call Enter_CTLF ;輸出壹個回車、換行
Output Longer ;提示字符串較長者字符個數
mov al,String1[1] ;第壹個字符串實際輸入字符個數
cmp al,String2[1] ;第二個字符串實際輸入字符個數
jae $+5 ;字符串較長,顯示字符串長度
mov al,String2[1] ;裝入字符串長度較大者
xor ah,ah
call Dec_ASCII ;把AX中的二進制無符號數轉換成顯式的十進制ASCII碼,並送顯示屏顯示
Exit_Proc: mov ah,4ch ;結束程序
int 21h
String1 db 50,?,50 dup(?)
String2 db 50
Code ENDS
END Start ;編譯到此結束